Моделирование дискретных событий - Simpy - как моделировать сложные зависимости? - PullRequest
2 голосов
/ 26 октября 2019

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

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

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

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

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

1 Ответ

0 голосов
/ 29 октября 2019

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

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) в очереди есть адрес, адресованный этой комнате, (определите поле и комнату в именованном кортеже), вы можете использовать get_queue для проверки

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...