无法在SIMPY(python模拟)中触发两个事件

2024-06-14 20:33:39 发布

您现在位置:Python中文网/ 问答频道 /正文

最近我了解了SIMPY,我认为它可以为我的工作提供一些信息,并为决策提供背景。请注意,我对使用python编程相当陌生,我知道基本知识,但我在不断学习

问题: 我在一个集装箱码头工作,在那里我们有三种搬家方式:

  • 与船只相关的移动(大约每120秒生成一次移动。)
  • 与仓库相关的移动(大约每960秒生成一次移动。)
  • 与闸门相关的移动(大约每800秒生成一次移动。)

enter image description here

所有这些移动都是按照所述间隔同时“生成”的。 船只和仓库都有自己的运输工具。但是,上述所有步骤的目标都是相同的。容器堆栈采用先进先出(FIFO)原则,一次可以处理四个移动。移动大约需要270秒

我试图实现的是通过改变资源量(船舶和仓库上的运输数量以及闸门移动)来查看对集装箱堆垛内业务的影响

我得到了一个基本的模拟来处理其中一个流(容器),现在我正试图添加仓库流,但是我被卡住了。当我使用以下代码时,仅生成来自容器的移动:

def move_generator(env):

    while True:
        yield env.timeout(120)
        print("Vessel move generated at: %.1f" % (env.now))

    while True:
        yield env.timeout(960)
        print("Warehouse move generated at: %.1f" % (env.now)) 


import simpy
env = simpy.Environment()
env.process(move_generator(env))
    
env.run(until=3600)

上述代码的输出为:

Vessel move generated at: 120.0
Vessel move generated at: 240.0
Vessel move generated at: 360.0
Vessel move generated at: 480.0
Vessel move generated at: 600.0
Vessel move generated at: 720.0
Vessel move generated at: 840.0
Vessel move generated at: 960.0
Vessel move generated at: 1080.0
Vessel move generated at: 1200.0
Vessel move generated at: 1320.0
Vessel move generated at: 1440.0
Vessel move generated at: 1560.0
Vessel move generated at: 1680.0
Vessel move generated at: 1800.0
Vessel move generated at: 1920.0
Vessel move generated at: 2040.0
Vessel move generated at: 2160.0
Vessel move generated at: 2280.0
Vessel move generated at: 2400.0
Vessel move generated at: 2520.0
Vessel move generated at: 2640.0
Vessel move generated at: 2760.0
Vessel move generated at: 2880.0
Vessel move generated at: 3000.0
Vessel move generated at: 3120.0
Vessel move generated at: 3240.0
Vessel move generated at: 3360.0
Vessel move generated at: 3480.0

然而,期望的输出是:

Vessel move generated at: 120.0
Vessel move generated at: 240.0
Vessel move generated at: 360.0
Vessel move generated at: 480.0
Vessel move generated at: 600.0
Vessel move generated at: 720.0
Vessel move generated at: 840.0
Vessel move generated at: 960.0
Warehouse move generated at: 960.0
Vessel move generated at: 1080.0
Vessel move generated at: 1200.0
Vessel move generated at: 1320.0
Vessel move generated at: 1440.0
Vessel move generated at: 1560.0
Vessel move generated at: 1680.0
Vessel move generated at: 1800.0
Vessel move generated at: 1920.0
Warehouse move generated at: 1920.0
Vessel move generated at: 2040.0
Vessel move generated at: 2160.0
Vessel move generated at: 2280.0
Vessel move generated at: 2400.0
Vessel move generated at: 2520.0
Vessel move generated at: 2640.0
Vessel move generated at: 2760.0
Vessel move generated at: 2880.0
Warehouse move generated at: 2880.0
Vessel move generated at: 3000.0
Vessel move generated at: 3120.0
Vessel move generated at: 3240.0
Vessel move generated at: 3360.0
Vessel move generated at: 3480.0

我认为问题出在这两个while-True语句中,但我不知道如何正确处理这个问题。我一直在使用谷歌(可能不知道找到答案的正确术语),但没有成功


Tags: 代码envtruemove集装箱warehousegenerator容器
1条回答
网友
1楼 · 发布于 2024-06-14 20:33:39

正如您在评论中指出的,问题在于您使用的是python,而不是simpy

while True:
  <do anything>

# already unreachable
while True:
  # also unreachable

对于您的示例,请尝试查看https://simpy.readthedocs.io/en/latest/simpy_intro/shared_resources.html

for i in range(4):
    env.process(car(env, 'Car %d' % i, bcs, i*2, 5))
env.run()

您可以看到process可以在run之前被多次调用,从而实现您想要的“并行”工作

import simpy


def vessel(env):
    while True:
        yield env.timeout(120)
        print("Vessel move generated at: %.1f" % (env.now))


def warehouse(env):
    while True:
        yield env.timeout(960)
        print("Warehouse move generated at: %.1f" % (env.now)) 


def main():
    env = simpy.Environment()
    env.process(vessel(env))
    env.process(warehouse(env))
    env.run(until=3600)

if __name__ == '__main__':
    main()

这给

Vessel move generated at: 120.0
Vessel move generated at: 240.0
Vessel move generated at: 360.0
Vessel move generated at: 480.0
Vessel move generated at: 600.0
Vessel move generated at: 720.0
Vessel move generated at: 840.0
Warehouse move generated at: 960.0
Vessel move generated at: 960.0
Vessel move generated at: 1080.0
Vessel move generated at: 1200.0
Vessel move generated at: 1320.0
Vessel move generated at: 1440.0
Vessel move generated at: 1560.0
Vessel move generated at: 1680.0
Vessel move generated at: 1800.0
Warehouse move generated at: 1920.0
Vessel move generated at: 1920.0
Vessel move generated at: 2040.0
Vessel move generated at: 2160.0
Vessel move generated at: 2280.0
Vessel move generated at: 2400.0
Vessel move generated at: 2520.0
Vessel move generated at: 2640.0
Vessel move generated at: 2760.0
Warehouse move generated at: 2880.0
Vessel move generated at: 2880.0
Vessel move generated at: 3000.0
Vessel move generated at: 3120.0
Vessel move generated at: 3240.0
Vessel move generated at: 3360.0
Vessel move generated at: 3480.0

相关问题 更多 >