Estou tentando simular um elevador, como sempre, comecei muito simples, executando apenas uma única ordem de cada vez e adicionei memória ao elevador na forma de filas, para que os pisos fossem percorridos na ordem em que foram pressionados, o que obviamente não é a melhor abordagem.
Então, no momento, estou usando uma lógica muito simples e "míope", que é: para o andar atual, encontre o andar mais próximo de mim e defina-o como meu próximo destino e faça um loop até que não haja mais andares na lista.
Mas isso nem sempre funciona, por exemplo, o elevador estava no 3º andar de um prédio de 5 andares e recebeu pedidos 4,5,2. O caminho mais curto seria 2-> 4-> 5, que custa 4 andares, mas usando essa lógica 4-> 5-> 2, que custa 5, tem a mesma chance de ser escolhido, dependendo do código.
Como faço para encontrar o caminho mais curto e tornar o elevador mais eficiente?
fonte
Respostas:
"Eficiência" não é a característica mais importante, o mais importante é garantir que todas as ordens sejam seguidas, para que não haja fome. Se alguém pressionar 100 e as pessoas continuarem pressionando 1 e 2, pode ser eficiente continuar entre esses andares, mas seria bom que 100 fossem visitados em algum momento.
Eu acho (por observação pessoal quando eu estava interessado em descobrir) que a maioria deles faz:
Observe que muitos elevadores têm os botões "Quero subir" e "Quero descer" ao lado das portas, em vez de um único botão. O algoritmo precisa apenas de uma pequena alteração: em 2, se o único botão pressionado para esse andar for um dos botões próximos à porta, pare e abra as portas se estivermos indo nessa direção. Possivelmente mantenha o botão pressionado se as portas se abrirem por causa de um botão pressionado dentro do elevador e ele estiver indo na direção errada.
Você nunca precisa descobrir um caminho inteiro , apenas em qual direção seguir.
fonte
A outra resposta fornece corretamente o algoritmo de elevador padrão, que é basicamente "continue na mesma direção o máximo possível e faça todas as paradas necessárias ao longo do caminho".
Existem outros algoritmos de elevador. Por exemplo, considere um prédio de apartamentos onde os apartamentos ficam mais caros à medida que você sobe. Os proprietários do edifício podem optar por modificar o algoritmo do elevador para "seguir na mesma direção o maior tempo possível, mas apenas parar no caminho". Dessa forma, se você tem pessoas no elevador que estão no saguão e vão para 2, 5 e 10, o elevador vai para 10, depois 5 e 2, deixando as pessoas na ordem de quanto elas pagam. Mas é claro que quando as pessoas com 10 anos saem de seu apartamento, elas precisam esperar mais para chegar ao saguão.
Se você está procurando uma solução eficiente, crie uma métrica de custo, implemente vários algoritmos diferentes e execute simulações. Lembre-se de medir não apenas o custo médio, mas também métricas como a mais longa que qualquer solicitação leva para ser atendida. A otimização para médias baixas pode às vezes desoptimizar o pior caso, o que é ruim.
fonte
Observe que os elevadores usam os mesmos algoritmos de agendamento que alguns controladores de disco rígido. O algoritmo SCAN padrão é conhecido como algoritmo de elevador . Na prática, acho que o algoritmo LOOK é mais comum, pois é um pouco mais eficiente que o SCAN.
fonte