请给我一段模拟港口集装箱船舶装卸集装箱过程的代码,基于simpy,排队理论。其中,该港口共有五个泊位供船舶停靠,五个泊位的集装箱装卸能力分别为100,100,100,150,200箱每小时。装卸货看做为一个过程,不必区分是装货还是卸货。
时间: 2024-05-14 17:17:17 浏览: 5
好的,以下是基于simpy的模拟港口集装箱船舶装卸集装箱过程的代码:
```python
import simpy
import random
# 定义集装箱装卸过程
def container_process(env, name, dock, capacity):
print(f"{name} arriving at dock at {env.now}")
with dock.request() as req:
yield req
print(f"{name} starts container process at {env.now}")
yield env.timeout(random.randint(1,10)) # 随机模拟装卸时间
print(f"{name} finishes container process at {env.now}")
capacity.put(1) # 装卸完成,泊位可用
# 定义船舶过程
def vessel_process(env, name, dock, capacity):
print(f"{name} arriving at port at {env.now}")
with capacity.request() as req:
yield req
print(f"{name} starts docking at {env.now}")
yield env.timeout(1) # 船舶对接时间
print(f"{name} docks at {env.now}")
# 模拟集装箱装卸过程
for i in range(random.randint(20,30)):
with dock.request() as req:
yield req
print(f"{name} starts container process {i+1} at {env.now}")
yield env.process(container_process(env, f"{name}_container_{i+1}", dock, capacity))
# 离开港口
print(f"{name} leaves dock at {env.now}")
yield env.timeout(1) # 船舶离港时间
# 定义港口模拟过程
def port_process(env, dock_num, dock_capacity):
dock = simpy.Resource(env, capacity=dock_num) # 泊位资源
capacity = simpy.Container(env, capacity=dock_num*dock_capacity, init=dock_num*dock_capacity) # 泊位集装箱容量
# 模拟5艘船舶
for i in range(5):
env.process(vessel_process(env, f"Vessel_{i+1}", dock, capacity))
# 模拟结束时间
yield env.timeout(24)
# 启动模拟
env = simpy.Environment()
env.process(port_process(env, 5, [100, 100, 100, 150, 200]))
env.run()
```
解释一下代码:
1. 定义了一个集装箱装卸过程 `container_process`,其中包括了等待泊位、装卸集装箱和释放泊位三个阶段。
2. 定义了一个船舶过程 `vessel_process`,其中包括了等待泊位、对接、集装箱装卸和离开四个阶段。其中,在集装箱装卸阶段,调用了 `container_process` 来模拟集装箱的装卸过程。
3. 定义了一个港口模拟过程 `port_process`,其中定义了泊位资源和集装箱容量,以及模拟了5艘船舶的过程。
4. 启动模拟,模拟结束时间为24小时。
在模拟过程中,每个船舶都会等待可用的泊位,然后对接并开始集装箱的装卸过程。在装卸过程中,船舶会占用一个泊位和相应的集装箱容量,直到装卸完成后释放。同时,由于不同泊位的集装箱装卸能力不同,因此可能会出现泊位空闲但是集装箱容量已经满了的情况。最后,模拟过程将在24小时后结束,输出模拟结果。