我正在尝试使用多台机器模拟制造过程。Machine1 的容积为 1 升。Machine2 的容积为 2 升。我们要生产 2 升化学品 X。所以我们在 Machine1 中放入 1 升原材料。完成后,将该 1L 移至 Machine2。同时,用第二批 1L 在 Machine1 上运行另一轮。然后将其添加到已经装满一半的 Machine2 中。然后启动 Machine2 最终生产 2 升。如果 Machine1 需要 3 小时,Machine2 需要 12 小时,则此过程将需要 3 + 3 + 12 = 18 小时。
现在我的方法如下。我将 Machine1 创建为容量为 1 的资源,将 Machine2 创建为容量为 2 的资源。我希望在两个批次都通过 Machine1 后启动 Machine2。我尝试的代码如下:
import simpy
from collections import namedtuple
Chemical = namedtuple("Chemical", "name")
X_batch1 = Chemical("X_batch1")
X_batch2 = Chemical("X_batch2")
def do_process_1(env, machine1, Chemical):
print(f"Chemical {Chemical.name} requested Machine1 at {env.now}")
with machine1.request() as req:
yield req
print(f"Chemical {Chemical.name} got into Machine1 at {env.now}")
yield env.timeout(3)
print(f"Chemical {Chemical.name} got out of Machine1 at {env.now}")
# yield env.timeout(2)
def do_process_2(env, machine1, machine2, Chemicals):
# <some condition to check if process 1 is done for both Chemicals>
# make each batch for machine2, one after the other
print(f"{Chemicals[0]} asks for Machine2 at {env.now}.")
print(f"{Chemicals[1]} asks for Machine2 at {env.now}.")
with machine2.request() as req1, machine2.request() as req2:
yield req1 & req2
print(f"{Chemicals[0]} gets machine2 at {env.now}.")
print(f"{Chemicals[1]} gets Machine2 at {env.now}.")
yield env.timeout(12)
print(f"{Chemicals[0]} got out of machine2 at {env.now}.")
print(f"{Chemicals[1]} got out of machine2 at {env.now}.")
env = simpy.Environment()
machine1 = simpy.Resource(env, 1)
machine2 = simpy.Resource(env, 2)
env.process(do_process_1(env, machine1, X_batch1))
env.process(do_process_1(env, machine1, X_batch2))
env.process(do_process_2(env, machine2, machine1, (X_batch1, X_batch2)))
env.run(until=60)
我上面有两个障碍:
- 只有在两台机器都用机器 1 完成后才应该请求 Machine2。我不知道如何添加这个条件,以及在哪里添加它。
- Machine2 必须被请求两次(按不同的批次),然后应该继续开始工作。只有一个请求时,它不应该开始工作。
任何帮助将不胜感激!