Browse Source

FCFS algorithm

raylu 9 years ago
commit
fd8da77c80
1 changed files with 61 additions and 0 deletions
  1. 61 0
      elevator.py

+ 61 - 0
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)