Моделирование дискретных событий без глобальной очереди?

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

Я не вижу никаких проблем с моделированием этого в классическом режиме моделирования дискретных событий (DES) с использованием глобальной очереди событий. Я пробовал моделировать систему без очереди, но потерпел неудачу на ранних стадиях. Тем не менее я не понимаю основной причины, по которой нужна очередь, по крайней мере, не для событий, которые происходят «внутри» сети.

Идея DES без очередей состоит в том, чтобы рассматривать всю сеть как функцию, которая принимает поток событий из внешнего мира и возвращает поток изменений состояния. На каждый узел в сети должны влиять только те узлы, которые непосредственно к нему подключены. Я возлагал некоторые надежды на стрелки Haskell и функциональное реактивное программирование (FRP) в целом, но я все еще учусь.

Очередь событий кажется мне слишком "глобальной". Если моя сеть распадается на две подсети, между которыми нет соединений, и я задаю вопросы только об изменении состояния одной подсети, то другая подсеть вообще не должна выполнять никаких вычислений. В этом случае я мог бы использовать две очереди событий. Однако, как только я подключу две подсети, мне придется поместить все события в одну очередь. Мне не нравится идея, что мне нужно знать топологию сети, чтобы настроить свою очередь(и).

So

  • Кто-нибудь знает об алгоритмах DES, которым не нужна глобальная очередь?
  • есть ли причина, почему это сложно или даже невозможно?
  • полезен ли FRP в контексте DES?

person Martin Drautzburg    schedule 09.03.2014    source источник


Ответы (1)


Чтобы ответить на первый вопрос, я не знаю никаких алгоритмов моделирования дискретных событий (DES), которым не нужна глобальная очередь событий. Возможна иерархия очередей событий, в которой каждая очередь событий представлена ​​в своей родительской очереди событий как событие (соответствующее времени следующего события). Если новое событие добавляется в очередь событий таким образом, что оно становится следующим событием в очереди, то очередь событий необходимо перепланировать в родительском элементе, чтобы сохранить порядок выполнения событий. Однако в конечном итоге вы все равно сведетесь к одной глобальной очереди событий, которая является родительской для всех остальных в иерархии и которая отправляет каждое событие.

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

Самый простой ответ на второй пункт заключается в том, что, в конечном счете, насколько мне известно, без глобальной очереди событий обойтись невозможно. Каждое событие моделирования должно выполняться в нужное время, и, поскольку время не может идти вспять, порядок, в котором отправляются события, имеет значение. Текущее время моделирования определяется временем выполнения текущего события. Если у вас есть отдельные очереди событий, у вас также есть отдельные часы, что, мягко говоря, сильно запутывает.

В вашем случае, если ваши подсети полностью независимы, вы можете моделировать каждую подсеть по отдельности. Однако если состояние одной подсети влияет на состояние всей сети, а состояние всей сети влияет на состояние каждой подсети, то, поскольку на событие влияют предшествующие ему события, могут влиять только те события, которые следовать, но не может влиять на то, что ему предшествовало — вы должны моделировать всю сеть с глобальной очередью событий.

Если вас это утешит, настоящая симуляция DES не выполняет никакой обработки между событиями (кроме определения следующего события), поэтому в одной подсети не должно быть ненужной обработки, если все действия происходят в другой.

Наконец, функциональное реактивное программирование (FRP) абсолютно полезно в контексте DES. Действительно, теперь я пишу о многих своих симуляциях DES на Scala, используя этот подход.

Надеюсь, это поможет!

ОБНОВЛЕНИЕ: после написания вышеизложенного я использовал Sodium< /em> (отличная библиотека FRP, на которую ссылается OP в комментариях ниже) и может добавить некоторые дополнительные пояснения: Sodium предоставляет средства для подписки на события и для выполнения действий при возникновении этих событий. Однако здесь я использую термин событие в общем смысле, например нажатие кнопки пользователем в графическом интерфейсе, прибытие сетевого пакета и т. д. Другими словами, события не обязательно являются событиями симуляции.

Вы по-прежнему можете использовать Sodium или любую другую библиотеку FRP как часть моделирования, чтобы подписаться на события моделирования и выполнять действия, когда они происходят; однако эти инструменты, как правило, не имеют встроенной поддержки моделирования, поэтому вы должны включить механизм моделирования в качестве источника событий моделирования, точно так же, как GUI включается в качестве источника пользовательских события взаимодействия. Именно в этом движке должна находиться глобальная очередь событий.

Между прочим, если вы пытаетесь выполнить параллельное или распределенное выполнение имитационной модели, все становится значительно сложнее. В этих ситуациях у вас есть несколько очередей событий, но они должны быть синхронизированы (чтобы выглядела одна очередь). Двумя основными подходами являются консервативная синхронизация и оптимистическая синхронизация.

person Mike Allen    schedule 10.03.2014
comment
Воодушевленный вами, я еще немного посмотрел на FRP и вообще не смог увидеть очередь событий. Где вы видите очередь в DES в стиле FRP? - person Martin Drautzburg; 14.03.2014
comment
Я был бы рад ответить на этот вопрос, но не могли бы вы пояснить, что вы имеете в виду под «увидеть очередь»? Я не уверен, что понимаю вопрос. - person Mike Allen; 14.03.2014
comment
В Sodium and Reactive Banana (Haskell) кажется, что все вращается вокруг Поведений (также известных как Сигналы) и Событий и способов составления их сетей. Не было явного понятия очереди. Когда вы делаете DES по методу FRP, какую роль здесь играет глобальная очередь событий? - person Martin Drautzburg; 14.03.2014
comment
Судя по звуку (я не знаком с Sodium, Reactive Banana или Haskell), кажется, что очередь событий скрыта за Behaviors/Signals и Events. - person Mike Allen; 15.03.2014
comment
(Ой! Нажмите «Возврат» немного раньше.) Другими словами, все еще существует глобальная очередь событий, которая используется для планирования событий и отправки их для выполнения, но у вас нет прямого доступа к ней. Это вполне нормально, поскольку код моделирования конечного пользователя не должен иметь возможности манипулировать очередью событий, кроме планирования/отмены планирования событий. Когда вы указываете поведение, которое должно произойти через определенный период времени, вы (внутри) создаете событие, добавляете это событие в очередь событий и указываете, что происходит (действия) при отправке события. Надеюсь это поможет. - person Mike Allen; 15.03.2014
comment
Когда вы выполняете DES в Scala, вы все равно видите очередь событий или она тоже скрыта? Вы используете Scala.React? - person Martin Drautzburg; 15.03.2014
comment
Майк, не могли бы вы порекомендовать библиотеку Scala для DES? Что-то похожее на SimPy для Python. - person Tautvydas; 22.11.2016
comment
Таутвидас: Я работаю над одним из своих, но сейчас это скорее личный проект, поэтому я не могу его рекомендовать. Существует библиотека моделирования Scala под названием ScalaTion, которую я не использовал, и есть несколько библиотек моделирования на основе Java, таких как DESMO-J. Насколько они полезны, будет зависеть от ваших требований... - person Mike Allen; 22.11.2016