2

我是 Simpy 的新手,在弄清楚如何为具有复杂依赖关系的进程调度程序建模时遇到了麻烦。

我的问题的高级摘要

  • 我有一个仓库,通过入口接收装有物品的盒子。这些盒子被放入队列中等待处理。
  • 每个箱子都有一个目的地房间,必须使用传送带运送到那里。传送带服务多个房间。
  • 仅当传送带和目的地房间都可用时,操作员查看队列中的箱子并将箱子放在适当的传送带上。操作员按顺序发送盒子,但跳过无法处理的盒子。
  • 在房间内打开盒子后,需要一定的时间来存放物品。在此期间,房间无法接收其他盒子。
  • 物品入库后,空箱通过其进来的同一条传送带被送到仓库出口。
  • 操作员随时了解哪些传送带和房间是空闲的。

我的问题是如何建模这个运算符。到目前为止,我还没有在 Simpy 中找到一种优雅的方式来做到这一点。我本质上想要一个只有在以下三个条件成立时才唤醒的过程:a)一个房间是空闲的;b) 这个房间的队列中有一个盒子,并且 c) 去房间的皮带是免费的。

非常感谢任何想法、建议或指向现有示例的指针。谢谢!

4

2 回答 2

0

这是关于 simpy 的另一个 StackOverflow 问题,可能会让您更接近解决方案:如何让进程等待多个资源?

如果我正确理解该答案,您可以将事件视为队列中的消息:偷看它们,但放回您不喜欢的那些。这意味着您可以等待整个事件列表,包括 .get() 和您的超时,当它们中的任何一个触发时,检查这些事件。您可以对其中一些采取行动并丢弃其余部分(让它们“未处理”以用于另一个过程或迭代)。这样,如果您的超时甚至在列表中,您就可以检查其他三个事件的状态并采取相应措施。

于 2020-12-22T00:59:47.330 回答
-1

你可能想看看

https://simpy.readthedocs.io/en/latest/topical_guides/resources.html#res-type-store

 from collections import namedtuple

 Machine = namedtuple('Machine', 'size, duration')
 m1 = Machine(1, 2)  # Small and slow
 m2 = Machine(2, 1)  # Big and fast

 env = simpy.Environment()
 machine_shop = simpy.FilterStore(env, capacity=2)
 machine_shop.items = [m1, m2]  # Pre-populate the machine shop

 def user(name, env, ms, size):
     machine = yield ms.get(lambda machine: machine.size == size)
     print(name, 'got', machine, 'at', env.now)
     yield env.timeout(machine.duration)
     yield ms.put(machine)
     print(name, 'released', machine, 'at', env.now)


 users = [env.process(user(i, env, machine_shop, (i % 2) + 1))
          for i in range(3)]
 env.run()

关于盒子和房间,我建议您使用 2 种不同的资源 - 存储(资源类)对其进行建模。

a) 一个房间是免费的;(检查房间的资源存储是否为空)
b) 队列中有一个盒子为这个房间寻址,(在namedtuple中定义盒子和房间),你可以使用get_queue来检查

c) 去房间的皮带是免费的。(类似于a点)

于 2019-10-29T07:57:04.773 回答