Моделирование дискретных событий — Simpy — как моделировать сложные зависимости?

Я новичок в Simpy, и у меня возникли проблемы с выяснением того, как смоделировать планировщик процессов со сложными зависимостями.

Общее описание моей проблемы:

  • У меня есть склад, который получает коробки с предметами через вход. Ящики помещаются в очередь, где они ждут обработки.
  • Каждая коробка имеет номер назначения и должна быть доставлена ​​туда с помощью конвейерной ленты. Ленточный конвейер обслуживает несколько помещений.
  • Оператор просматривает коробки в очереди и ставит коробку на соответствующую ленту конвейера только в том случае, если и лента, и помещение назначения свободны. Оператор отправляет ящики по порядку, но пропускает ящики, которые не могут быть обработаны.
  • После открытия ящика внутри комнаты требуется определенное время для хранения предмета. В это время в комнату не могут быть доставлены другие ящики.
  • После того, как объект хранится, пустая коробка отправляется к выходу со склада с помощью того же конвейера, на который она пришла.
  • Оператор всегда знает, какие конвейерные ленты и помещения свободны.

Мой вопрос заключается в том, как смоделировать этот оператор. Я не нашел пока элегантного способа сделать это в Simpy. По сути, я хочу иметь процесс, который просыпается только при выполнении следующих трех условий: а) комната свободна; б) в очереди есть ящик, адресованный для этой комнаты, и в) лента для прохода в комнату свободна.

Любая идея, совет или указатель на существующий пример приветствуются. Благодарю вас!


person Radu    schedule 26.10.2019    source источник


Ответы (2)


Вот еще один вопрос StackOverflow на simpy, который может приблизить вас к решению: resources">Как заставить процесс ожидать несколько ресурсов?

Если я правильно понимаю этот ответ, вы можете обрабатывать события как сообщения в очереди: просматривать их, но возвращать те, которые вам не нравятся. Это означает, что вы можете дождаться всего списка событий, включая .get() и ваш тайм-аут, и когда любое из них сработает, проверить их. Вы можете воздействовать на некоторые из них и отбросить остальные (оставив их необработанными для другого процесса или итерации). Таким образом, если ваш тайм-аут даже есть в списке, вы можете проверить статус трех других ваших событий и действовать соответствующим образом.

person jaylaal    schedule 22.12.2020

Возможно, вы захотите взглянуть на

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 разных ресурса - хранилище (класс ресурсов) для его моделирования.

а) комната свободна; (Проверить, пусто ли хранилище ресурсов для комнаты)
б) в очереди есть ящик, адресованный для этой комнаты,( определить ящик и комнату в namedtuple), вы можете использовать get_queue для проверки

в) ремень для прохода в комнату свободен (аналогично пункту а)

person Nic    schedule 29.10.2019
comment
Спасибо за ответ. К сожалению, это не касается моего вопроса. Наверное, я недостаточно ясно выразился. Я знаю, как использовать FilterStore, но я не знаю, как просыпаться только тогда, когда все 3 события одновременно верны. Мне кажется, что в Simpy события могут срабатывать в разное время, когда они входят в составное условие. Например, в настоящее время я перебираю ремни и возвращаюсь к событию условия yield (haveBoxEvent & haveRoomEvent & haveBeltEvent) | someTimeOut. Это не работает должным образом, поскольку тайм-аут не является взаимоисключающим с другими промежуточными событиями AND ( ... ). - person Radu; 02.11.2019
comment
Например, если тайм-аут срабатывает, некоторые (но не все) другие события также могут срабатывать. Например, сначала можно получить пояс, затем коробку, но затем тайм-аут истечет до того, как комната освободится. Это означает, что когда я просыпаюсь, я не могу делать никакой полезной работы, но я заблокировал некоторые ресурсы (например, извлек ящик из очереди), что портит симуляцию. - person Radu; 02.11.2019