Qual algoritmo é usado pelos elevadores para encontrar o caminho mais curto para as ordens de andar?


27

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?



6
Gostaria de convidá-lo para o meu escritório e descobrir o algoritmo que os elevadores usam lá. Porque eu absolutamente não posso.
gnasher729

1
@ gnasher729 Oh, eu posso, embora não o conheça, porque certamente é o mesmo que no meu escritório: nunca pare no chão em que estou, exceto quando já estiver cheio de pessoas. Estou certo?
Andres F.

2
Não é bem assim. Existem quatro elevadores. Você pressiona o botão, nada se move por muito tempo. Se alguém se move, ele pára logo antes do seu andar e espera por séculos, até ser ultrapassado por outro que passa pelo seu andar e depois desce. No caminho até o chão, para pelo menos três vezes sem que ninguém entre.
gnasher729

2
Jogo / desafio de programação relevante: play.elevatorsaga.com
dwikle

Respostas:


30

"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:

  1. Comece indo na direção do primeiro botão pressionado, mantenha o controle de qual direção vamos
  2. Quando um piso for atingido e esse botão for pressionado, pare e abra as portas, marque os botões desse piso como não mais pressionados.
    • Se ainda houver mais andares que precisamos visitar que estejam na mesma direção, continue nessa direção .
    • Se não, e ainda há andares que precisamos visitar, siga nessa direção.
    • Caso contrário, estamos prontos e iniciaremos em 1 quando um botão for pressionado novamente.

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.


isso me deixou completamente confuso, eu estava tão focado na eficiência e esqueci que outras coisas também são importantes. ainda não é eficiente dizer de 2 a 100 e voltar a 1 simplesmente porque estava na mesma direção, mas pelo menos não garante fome. e, completamente fora de tópico, talvez seja por isso que é comum encontrar dois elevadores com essa lógica? o que me faz pensar se é mais comum encontrar os elevadores na direção oposta a qualquer momento. de qualquer maneira, eu ainda estou curioso sobre como encontrar o caminho mais curto inteiro, mas isso responde a minha pergunta muito ordenadamente, graças
Raed Tabani

7
Observe que quando você chegar a um prédio com 100 andares, normalmente terá elevadores que atendem apenas a uma faixa específica de pisos (por exemplo, 0-19, 20-39, ...), bem como elevadores expressos que percorrem longas distâncias (por exemplo, 0 50, 0 a 100, 50 a 100, mas não há andares intermediários), portanto, talvez seja necessário mudar de elevador para chegar ao seu destino. Você também pode ter vários elevadores por eixo que obviamente não podem passar um pelo outro. Totalmente fora de tópico: IIRC, havia uma pergunta sobre a eficiência desses botões de seta para cima e para baixo no site da Experiência do usuário, o que tornava a leitura muito fascinante.
Jörg W Mittag

obrigado, eu não sabia disso. subdividir parece ser uma boa estratégia se uma parte quebra todo o sistema, e também distribui a carga que é importante para o desgaste mecânico. Gostaria de saber se esses elevadores expressos ocorreram devido às deficiências lógicas do algoritmo do elevador de Knuth.
precisa saber é o seguinte

Apenas outra coisa que gostaria de acrescentar é que muitas vezes eles têm um piso 'residencial' ao qual retornarão quando não estiverem em uso, isso pode ser diferente para diferentes elevadores e possivelmente até mudar dependendo da hora do dia e dos padrões de uso esperados
jk .

Eu tenho a tendência de apertar o botão para cima / baixo semi aleatoriamente, independentemente da direção em que estou viajando. No meu caso, eu só tenho um destino, então o elevador me leva a esse local, independentemente de eu escolher ou não baixa. Suspeito que, se eu apertar o botão para baixo, escolher um andar acima de mim e depois escolher um andar abaixo de mim antes que o elevador comece a se mover, isso me levaria ao andar abaixo de mim, em vez do piso que eu empurrei primeiro. Eu posso estar errado. Certifico-me de testá-lo na próxima vez que me encontrar em um elevador.
Ucenna # 22/16

13

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.


1
Parece ser raro (outros alogirthms)
FindOutIslamNow

10

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.


Quando você fala com tanta certeza, você tem experiência profissional na implementação do código para elevadores? Sistemas de elevador especialmente mais novos? Estou curioso para saber se, após o 11 de setembro em Nova York, houve maior prioridade no envio de passageiros vs.
John Zabroski
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.