summaryrefslogtreecommitdiffstats
path: root/elevator.py
diff options
context:
space:
mode:
authorraylu <lurayl@gmail.com>2016-02-22 19:07:13 -0800
committerraylu <lurayl@gmail.com>2016-02-22 19:07:13 -0800
commitfd8da77c80edd8cf2bfad11987d842341b3aeae6 (patch)
tree89783e8dfe777a56fe25d99ed95471040b802729 /elevator.py
downloadelevator-fd8da77c80edd8cf2bfad11987d842341b3aeae6.tar.xz
FCFS algorithm
Diffstat (limited to 'elevator.py')
-rwxr-xr-xelevator.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/elevator.py b/elevator.py
new file mode 100755
index 0000000..9469c9a
--- /dev/null
+++ b/elevator.py
@@ -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)