多个电梯代码
时间: 2023-07-03 13:25:07 浏览: 43
以下是一个简单的多电梯调度的Python代码实现:
```python
class Elevator:
def __init__(self, id, floor=1, direction=1, status='idle'):
self.id = id
self.floor = floor
self.direction = direction # 1:up, -1:down
self.status = status # idle, up, down, stop
self.requests = [] # up/down floor requests
self.passengers = [] # passengers in elevator
self.capacity = 10 # max capacity
self.stops = [] # stops history
def __str__(self):
return f"Elevator {self.id} at floor {self.floor} ({self.status})"
def add_request(self, floor, direction):
if floor == self.floor:
return
if self.status == 'idle':
self.status = 'up' if floor > self.floor else 'down'
elif self.status == 'up' and direction == -1:
self.requests.append(floor)
return
elif self.status == 'down' and direction == 1:
self.requests.append(floor)
return
elif direction == self.direction:
if (self.status == 'up' and floor > self.floor) or (self.status == 'down' and floor < self.floor):
self.requests.append(floor)
return
self.requests.append(floor)
self.direction = 1 if floor > self.floor else -1
def move(self):
if self.status == 'up':
self.floor += 1
elif self.status == 'down':
self.floor -= 1
self.stops.append(self.floor)
if self.floor in self.requests:
self.requests.remove(self.floor)
self.passengers += [p for p in self.floor_passengers() if p not in self.passengers]
if len(self.passengers) >= self.capacity or len(self.requests) == 0:
self.status = 'stop'
if len(self.requests) == 0 and self.status != 'idle':
if self.floor not in self.stops:
self.stops.append(self.floor)
self.status = 'idle'
def floor_passengers(self):
return [p for p in self.requests if (p - self.floor) * self.direction > 0]
class ElevatorController:
def __init__(self, num_elevators=1, num_floors=5):
self.elevators = [Elevator(i+1) for i in range(num_elevators)]
self.num_floors = num_floors
def __str__(self):
return '\n'.join([str(e) for e in self.elevators])
def status(self):
return '\n'.join([f"Elevator {e.id} at floor {e.floor} ({e.status}) with {len(e.passengers)} passengers" for e in self.elevators])
def add_request(self, floor, direction):
elevators = sorted(self.elevators, key=lambda x: abs(x.floor - floor))
for e in elevators:
e.add_request(floor, direction)
def step(self):
for e in self.elevators:
e.move()
if __name__ == '__main__':
controller = ElevatorController(num_elevators=2, num_floors=10)
# add requests
controller.add_request(3, 1)
controller.add_request(5, -1)
controller.add_request(7, 1)
# run simulation
for i in range(20):
print(f"Step {i}")
print(controller.status())
controller.step()
```
这段代码实现了一个ElevatorController类,其中包含多个Elevator对象,可以通过add_request()方法来添加上下行请求,通过step()方法来模拟电梯运行过程,最后输出每个电梯的状态。具体实现中,每个电梯会根据当前状态和乘客请求来判断下一步的行动,同时记录每个电梯的停靠历史和乘客信息。