Primeiro, há uma classe de elevador. Possui uma direção (para cima, para baixo, suporte, manutenção), um piso atual e uma lista de solicitações de piso classificadas na direção. Ele recebe solicitação deste elevador.
Depois, há um banco. Ele contém os elevadores e recebe os pedidos dos andares. Eles estão programados para todos os elevadores ativos (não em manutenção).
O agendamento será como:
- se disponível, escolha um elevador de pé para este andar.
- mais escolha um elevador movendo-se para este andar.
- mais escolha um elevador de pé em outro andar.
- mais escolha o elevador com a carga mais baixa.
Cada elevador tem um conjunto de estados.
- Manutenção: o elevador não reage a sinais externos (apenas a seus próprios sinais).
- Suporte: o elevador está fixo no chão. Se receber uma chamada. E o elevador está naquele andar, as portas se abrem. Se estiver em outro andar, ele se move nessa direção.
- Para cima: o elevador sobe. Cada vez que atinge um piso, verifica se precisa parar. Nesse caso, ele para e abre as portas. Ele espera por um certo período de tempo e fecha a porta (a menos que algo esteja se movendo através deles. Em seguida, remove o piso da lista de solicitações e verifica se há outra solicitação. Nesse caso, o elevador começa a se mover novamente. Caso contrário, ele entra no posição do estado.
- Para baixo: como para cima, mas na direção inversa.
Existem sinais adicionais:
- alarme. O elevador para. E se estiver no piso, as portas se abrirem, a lista de solicitações será limpa, as solicitações retornadas ao banco.
- porta aberta. Abre as portas se um elevador estiver no chão e não se mover.
- porta se fecha. Fechou a porta se estiver aberta.
EDIT: Alguns elevadores não começam no bottom / first_floor esp. no caso de arranha-céus.
min_floor e max_floor são dois atributos adicionais para o Elevador.