diff options
author | raylu <lurayl@gmail.com> | 2016-02-22 19:07:13 -0800 |
---|---|---|
committer | raylu <lurayl@gmail.com> | 2016-02-22 19:07:13 -0800 |
commit | fd8da77c80edd8cf2bfad11987d842341b3aeae6 (patch) | |
tree | 89783e8dfe777a56fe25d99ed95471040b802729 /elevator.py | |
download | elevator-fd8da77c80edd8cf2bfad11987d842341b3aeae6.tar.xz |
FCFS algorithm
Diffstat (limited to 'elevator.py')
-rwxr-xr-x | elevator.py | 61 |
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) |