【问题标题】:Simpy Store - Dependent EventsSimpy Store - 相关事件
【发布时间】:2017-03-23 21:46:29
【问题描述】:

我正在尝试模拟从商店获取商品依赖于其他商品的情况。

假设我有一个生产者将物品放入容量有限的存储 S1。当且仅当 (1) S1 中有物品并且 S2 中有空间时,这些物品才会转移到另一个商店 S2。

P -> S1 -> S2

问题是我需要从 S1 中删除一个项目以在 S2 中有空间为条件。

在代码中:

from simpy import *

env = Environment()
S1 = Store(env, capacity=1)
S2 = Store(env, capacity=1)

def producer():
    i = 0
    while True:
        yield S1.put(i)
        print("Producer put item: %s"%i)
        i += 1

def s1_to_s2():
    while True:
        item = yield S1.get()
        yield S2.put(item)

env.process(producer())
env.process(s1_to_s2())
env.run(until=20)

产生

Producer put item: 0
Producer put item: 1
Producer put item: 2

我对此建模的方式使它看起来在 S1 和 S2 之间有 1 个额外的存储插槽,这是我不想要的。由于我有 2 个存储单元,每个容量为 1,生产者应该只能插入 2 个单元。

【问题讨论】:

    标签: python simpy


    【解决方案1】:

    恐怕这对于开箱即用的 SimPy 是不可能的。但是,您可以对 Store 和相应的事件进行子类化,以对存储间依赖关系进行建模。

    【讨论】:

    • 你知道我该怎么做吗?我尝试覆盖 Store.get 以返回一个接受条件的事件,然后在 _do_get 中评估该条件(这允许我在执行第一个 Store 的获取之前检查下一个 Store 是否有可用空间)。它确实解决了额外空间的问题,但我无法弄清楚在目标 Store 没有空缺的情况下如何“重新安排”事件。我的意思的一个例子显示在:gist.github.com/sheridp/31516e95bee350481c1a39b1597e559f
    • 也许比我所展示的更好:get 事件可以采用目标队列,而不是一般条件。那么问题是,如果事件不能成功(因为目标中没有空间),当目标队列本身遇到获取事件时,我如何安排重新评估事件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2020-02-22
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 2017-12-30
    相关资源
    最近更新 更多