【问题标题】:Cannot trigger two events in SIMPY (simulation in python)无法在 SIMPY 中触发两个事件(python 中的模拟)
【发布时间】:2021-06-13 01:20:22
【问题描述】:

最近我了解了 SIMPY,我认为它对为我的工作提供一些信息并为决策提供背景非常有帮助。请注意,我对使用 python 编程很陌生,我知道基础知识,但我正在学习。

问题: 我正在一个集装箱码头工作,我们有三种移动方式:

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

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

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

我获得了适用于其中一个流程(VESSEL)的基本模拟,我现在正在尝试添加仓库流程,但是我被卡住了。当我使用以下代码时,只会生成来自容器的移动:

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 语句中,但我无法弄清楚如何正确处理这个问题。我一直在使用谷歌(可能不知道找到答案的正确术语)但没有成功。

【问题讨论】:

    标签: python simulation simpy event-simulation


    【解决方案1】:

    正如您在评论中指出的那样,问题在于您使用 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
    

    【讨论】:

    • 哇,卡住了 4 个多小时,你可以在发布后 5 分钟内解决它。非常有帮助,将更多地查看您提供的链接。再次感谢,这正是我所需要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多