|
|
@@ -0,0 +1,61 @@
|
|
|
+#!/usr/bin/env python3
|
|
|
+
|
|
|
+from enum import Enum
|
|
|
+
|
|
|
+class Elevator:
|
|
|
+ def __init__(self, e_id, floor, goal):
|
|
|
+ self.id = e_id
|
|
|
+ self.floor = floor
|
|
|
+ self.goal = goal
|
|
|
+
|
|
|
+ def __repr__(self):
|
|
|
+ attrs = ', '.join('%s=%s' % t for t in self.__dict__.items())
|
|
|
+ return 'Elevator(%s)' % attrs
|
|
|
+
|
|
|
+class Direction(Enum):
|
|
|
+ UP = 1
|
|
|
+ DOWN = 2
|
|
|
+
|
|
|
+class ElevatorControlSystem:
|
|
|
+ def __init__(self, num_elevators):
|
|
|
+ self.elevators = {i: Elevator(i, 1, None) for i in range(num_elevators)}
|
|
|
+ self.pickup_requests = []
|
|
|
+
|
|
|
+ def pickup(self, floor, direction):
|
|
|
+ self.pickup_requests.append((floor, direction))
|
|
|
+
|
|
|
+ def dropoff(self, elevator_id, floor):
|
|
|
+ self.elevators[elevator_id].goal = floor
|
|
|
+
|
|
|
+ def step(self):
|
|
|
+ # serve pickup requests
|
|
|
+ free_elevators = list(filter(lambda e: e.goal is None, self.elevators.values()))
|
|
|
+ if free_elevators:
|
|
|
+ for floor, direction in self.pickup_requests:
|
|
|
+ elevator = min(free_elevators, key=lambda e: abs(e.floor - floor))
|
|
|
+ elevator.goal = floor
|
|
|
+
|
|
|
+ # move elevators to requested floors
|
|
|
+ for elevator in self.elevators.values():
|
|
|
+ if elevator.goal is not None:
|
|
|
+ if elevator.goal > elevator.floor:
|
|
|
+ elevator.floor += 1
|
|
|
+ elif elevator.goal < elevator.floor:
|
|
|
+ elevator.floor -= 1
|
|
|
+ # check goal after moving
|
|
|
+ if elevator.goal == elevator.floor:
|
|
|
+ elevator.goal = None
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ ecs = ElevatorControlSystem(1)
|
|
|
+ print(ecs.elevators)
|
|
|
+
|
|
|
+ print('requesting pickup on floor 2 down')
|
|
|
+ ecs.pickup(2, Direction.DOWN)
|
|
|
+ ecs.step()
|
|
|
+ print(ecs.elevators)
|
|
|
+
|
|
|
+ print('requesting dropoff on floor 1')
|
|
|
+ ecs.dropoff(0, 1)
|
|
|
+ ecs.step()
|
|
|
+ print(ecs.elevators)
|