【问题标题】:Simpy: Yielding resource without losing position in queueSimpy:让出资源而不丢失队列中的位置
【发布时间】:2019-03-01 20:24:56
【问题描述】:

我对 Simpy 很陌生,所以我正在考虑编写一个简单的示例:在美国的 4 路停车处驾驶员的预期行为。对于那些不熟悉美国驾驶法的人来说,基本规则很简单:第一个到十字路口的司机,停车后,有先行权。当不止一名司机同时到达时,诀窍就出现了。同时到达的一些规则是显而易见的(如果两个驾驶员到达并且彼此面对并且直行,则两者都可以继续);其他人则不然(如果两个司机互相交叉,右边的那个有通行权)。

我正在将交叉路口建模为一个简单的资源,其中驱动程序对象排队等待访问。当驱动程序对象被激活时,它将查看队列中具有相同时间戳的其他对象并应用上述规则。如果它“有路权”,它将提前时钟然后释放资源,并激活下一个驱动程序对象。如果它没有路权,它仍然会将资源释放给下一个驱动程序对象,但时钟不会提前。在这种情况下,重要的是第一个司机需要保持在队列的最前面。

我该如何实现最后一部分?考虑这种情况。创建了三个具有相同时间戳的驱动程序对象,分别用于从北、东和南进入。假设东部对象是第一个被激活的。按照规则,它需要放弃交叉点,让北方物体先行。然而,一旦北方物体提前时钟并放弃交叉点,它应该回到东方,而不是南方。

对此有何建议?

【问题讨论】:

  • 你有一些代码可以展示吗?我希望您可以使用yield simpy.Environment.timeout(0),具体取决于您是否要按事件处理时间而不是到达时间来订购汽车。

标签: python simpy


【解决方案1】:

您可能希望设计代码,使每条道路都是一个资源 (n=1),具有自己的队列。除非其他资源之一被占用(同时到达),否则所有汽车都会通过它们各自的资源(获取 -> 释放)。如果是这样,您可以使用一种矩阵形式来确定适用的规则以及(物理)屈服是否合适。然后,您可以让优先车辆首先移动(带有时间戳)

单独队列的优势在于,无论什么车在什么时候通过,所有车道都将遵守其队列的 FIFO(先进先出)策略,这正是在真正的十字路口发生的情况。

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多