Primero hay una clase de ascensor. Tiene una dirección (arriba, abajo, soporte, mantenimiento), un piso actual y una lista de solicitudes de piso ordenadas en la dirección. Recibe solicitud de este ascensor.
Entonces hay un banco. Contiene los ascensores y recibe las solicitudes de los pisos. Estos están programados para todos los ascensores activos (no en mantenimiento).
La programación será como:
- si está disponible, elija un elevador de pie para este piso.
- De lo contrario, elija un ascensor que se mueva a este piso.
- De lo contrario, elija un ascensor de pie en otro piso.
- De lo contrario, elija el ascensor con la carga más baja.
Cada ascensor tiene un conjunto de estados.
- Mantenimiento: el ascensor no reacciona a las señales externas (solo a sus propias señales).
- Soporte: el elevador se fija en un piso. Si recibe una llamada. Y el ascensor está en ese piso, las puertas se abren. Si está en otro piso, se mueve en esa dirección.
- Arriba: el ascensor se mueve hacia arriba. Cada vez que llega al piso, verifica si necesita detenerse. Si es así, se detiene y abre las puertas. Espera una cierta cantidad de tiempo y cierra la puerta (a menos que algo se mueva a través de ellos. Luego elimina el piso de la lista de solicitudes y verifica si hay otra solicitud. De ser así, el elevador comienza a moverse nuevamente. Si no, ingresa al soporte del estado.
- Abajo: como arriba pero en sentido inverso.
Hay señales adicionales:
- alarma. El ascensor se detiene. Y si está en el piso, se abren las puertas, se borra la lista de solicitudes y las solicitudes se devuelven al banco.
- puerta abierta. Abre las puertas si un elevador está en el piso y no se mueve.
- la puerta se cierra. Cerró la puerta si están abiertos.
EDITAR: Algunos ascensores no comienzan en el fondo / primer_piso esp. en caso de rascacielos.
min_floor y max_floor son dos atributos adicionales para Elevator.