В этом примере показов, как смоделировать основные системы организации очередей в дискретно-событийную симуляцию с помощью блоков Entity Queue и Entity Server.
Блок Очередь сущностей хранит сущности в течение периода времени, который не может быть определен заранее. Повседневным примером очереди являются люди, ожидающие регистра магазина в линии. Покупатель не может заранее определить, сколько времени он должен ждать, чтобы завершить покупку. Можно использовать Entity Queue в различных приложениях, таких как Самолеты, ожидающие доступа к взлетно-посадочной полосе или сообщения, ожидающие передачи. Блок Entity Queue имеет емкость хранилища, политику сортировки сущностей и политику перезаписи сущностей. На основе этих параметров блок пытается вывести сущности в зависимости от того, принимает ли дочерний блок новые сущности.
Блок Entity Server хранит сущности в течение некоторого времени, называемого service time, затем пытается отправить сущность в зависимости от того, принимает ли нисходящий блок новые сущности. В течение периода обслуживания блок serving сущность, который он хранит. Повседневным примером сервера является лицо (например, банковский кассир или розничный кассир), с которым вы совершаете транзакцию с проектируемой длительностью.
В этом примере представлены основные модели постановки в очередь, которые показывают, как:
Моделируйте очередь FIFO, очередь LIFO и очередь приоритетов.
Задайте политики перезаписи сущностей, когда очередь достигнет емкости.
Настройка и изменение времени обслуживания сущности.
Назначьте и измените атрибуты сущности на основе событий.
Осмыслите статистику длины очереди во время симуляции.
Эта модель показывает, как сортировать сущности путем изменения политики сортировки очереди. Блок Entity Queue поддерживает три политики сортировки сообщений:
Last-in-first-out (LIFO) - новейшая сущность в системе хранения данных удаляется первым.
First-in-first-out (FIFO) - старейшая сущность в хранилище отправляется первым.
Приоритет - Сущности сортируются на основе их приоритета. Вы можете использовать очередь приоритетов только при снятии флажка Перезаписать самый старый элемент, если очередь полна.
Модель ниже показывает четыре различных поведения сортировки сущностей: FIFO, LIFO, Priority в порядке возрастания и Priority в порядке убывания.
Четыре одинаковых блока Генератора сущностей генерируют по 10 сущностей. Каждый блок использует повторяющийся шаблон последовательности для времени межгенерации сущностей dt
.
После генерации 10 сущностей время межгенерации dt
устанавливается в бесконечность, чтобы остановить генерацию сущностей. В блоке Entity Generator, в поле Intergeneration time action, используется этот код.
persistent SEQ; persistent idx; if isempty(SEQ) % Generate 10 entites with 1 second intervals. SEQ = [1 1 1 1 1 1 1 1 1 1]; idx = 1; end if idx > numel(SEQ) % Stop entity generation after generating 10 entities. dt = inf; else dt = SEQ(idx); end
Блок генерирует сущность и задает атрибут Attribute1
на каждой сущности. Можно использовать атрибуты для представления функций или свойств сущностей. В этом примере первая сущность содержит значение 1
, и значение атрибута каждого сгенерированной сущности увеличивается на 1
. Для достижения такого поведения в блоке Entity Generator, на вкладке Event actions, в поле Generate action, используется этот код.
% Pattern: Repeating Sequence persistent SEQ1; persistent idx1; if isempty(SEQ1) SEQ1 = [1 2 3 4 5 6 7 8 9 10]; idx1 = 1; end if idx1 <= numel(SEQ1) entity.Attribute1 = SEQ1(idx1); end idx1 = idx1 + 1;
Сгенерированные объекты пересылаются в четыре блока очереди сущностей. В порядок, чтобы показать поведение сортировки, блоки Сущности Queue соединяются с четырьмя идентичными блоками Сущности Gate, настроенными как релиз ворота. Релизы ворота позволяют одной сущности пройти, когда он получает сущность, несущее положительный (больше 0
) значение от его порта управления. Блок ворот сущностей для первого 10
секунд и храните их в очереди. Через первые 10 секунд ворота позволяют одной сущности проходить в секунду на основе политики сортировки.
Симулируйте модель. Откройте Данные моделирования Inspector и заметьте, что сущности, отходящие от каждого блока Сущности Queue, сортируются на основе политики сортировки очереди.
На первом графике показаны сущности, отходящие из очереди с политикой FIFO. Первая сущность с Attribute
значение 1
, уходит из очереди, когда ворота открываются в момент времени 11
. Последующие сущности выходят из очереди в том же порядке их генерации с увеличением значения атрибута.
На втором графике показаны сущности, отходящие из очереди с политикой LIFO. Эта политика сторнирует последовательность отправления сущности, начиная с сущности, имеющей наибольшее значение атрибута.
На третьем графике показаны сущности, отходящие от очереди приоритетов, которая сортирует сущности на основе их атрибутов в порядке возрастания вместо порядка входа в очередь. Сущность с наименьшим значением атрибута отходит первым. Последующие сущности следуют той же политике.
Четвертый график показывает сущности, отходящую от очереди приоритетов, которая сортирует сущности на основе их атрибутов в порядке убывания. Сущность с наибольшим значением атрибута отходит первой, а остальные сущности следуют той же политике.
Можно задать, что делает блок Entity Queue, когда блок достигает своей емкости, задав политику перезаписи сущности. Укажите политику путем установки или снятия флажка Перезаписать самый старый элемент, если очередь полна.
Если флажок Перезаписать самый старый элемент, если очередь полна, снят, блок не принимает новые сущности, когда очередь полна. Это поведение очереди блокировки.
Если установлен флажок Перезаписать самый старый элемент, если очередь полна, блок всегда принимает входящую сущность путем перезаписи самой старой сущности в хранилище. Блок перезаписывает самую старую сущность, но сущность, покидающий блок, определяется политикой сортировки очереди.
В этой модели два одинаковых блока Генератора сущностей генерируют сущности каждый 1
второе. Сущности пересылаются в два блока Entity Queue каждый с емкостью 10
и политику сортировки сущностей FIFO. Однако Очередь Блокировки сконфигурирована таким образом, чтобы не принимать новые сущности, когда ее очередь полна, в то время как Очередь перезаписи настроена на перезапись самого старого сущности, когда его очередь полна. Blocking Queue и Overwriting Queue соединяются с двумя идентичными блоками Entity Server, каждый со значением времени обслуживания 25
секунд. Скорость генерации сущностей блока Entity Generator намного выше, чем скорость обслуживания блока Entity Server. Это различие заставляет сущности накапливаться в блоке Entity Queue.
Симулируйте модель и откройте блок Sequence Viewer. Заметьте, что блоки Сущности Generator 1 и Сущность Generator 2 первоначально генерируют сущности со значениями данных 0.8147
, и сущности пересылаются на Сервер сущностей 1 и Сервер сущностей 2. Оба блока Генератора сущностей генерируют второй набор сущностей со значениями данных 0.9058
, которые хранятся в очереди блокировки и очереди перезаписи, поскольку оба блока сервера Entity Server полны. Остальные сгенерированные сущности также хранятся в блоках Entity Queue.
Обратите внимание, что блок Entity Queue 1 останавливает прием новых сущностей в свое хранилище на время 11
. Однако Entity Queue 2 позволяет новой сущности с атрибутом 0.9706
в хранилище и перезаписывает самую старую существующую сущность, которая имеет значение данных 0.9058
.
В базовой системе постановки в очередь можно использовать блок Entity Server для моделирования задержек на основе процессов в вашей системе. Можно определить источник, который задает задержку, изменив параметр Service time source блока Entity Server.
В этом примере показаны четыре различных источника, которые можно использовать на основе вашего приложения:
Dialog
- Можно задать постоянное значение времени обслуживания. В первом шаблоне моделирования сущности задерживаются для 2
секунд. Затем блок пытается переслать сущности следующему блоку.
Signal port
- Входящий сигнал Simulink ® определяет время обслуживания. Во втором шаблоне моделирования блок использует ramp значений сигналов в качестве источника времени обслуживания.
Attribute
- Заданное значение атрибута сущности определяет время обслуживания. В третьем шаблоне моделирования каждая сущность несёт Attribute1
со значением 4
который является источником времени обслуживания.
MATLAB action
- Можно ввести MATLAB™ код в поле Service time action и присвоить переменную dt
, который является параметром, который модель использует как время обслуживания. В четвертом шаблоне моделирования время случайного обслуживания dt = rand(1,1);
используется, и код устанавливает случайное значение времени обслуживания, которое равномерно распределено между 0
и 1
.
Моделируйте модель и рецензируйте результаты
Симулируйте модель и наблюдайте за Данными моделирования Inspector, который отображает сущности, пересылаемые блоком Сущности Server.
Можно присоединить атрибуты к сущностям, чтобы представлять их функции. В системе построения очередей можно использовать действия как отклики на события и изменять атрибуты сущности. Например, вы можете изменить значение атрибута сущности, когда сущность входит и выходит из блока Очередь сущностей. В блоке Очередь сущностей, на вкладке Действия события, можно увидеть набор событий, для которых можно создать действия.
Предположим, вы хотите смоделировать систему обслуживания клиентов в банковской ветви. В ветвь имеется два банковских кассира, каждому из которых присвоен определенный вид операции. Клиенты прибывают в ветвь. Они выбирают номер для своей транзакции и направляются правильному банковскому кассиру. Клиенты покидают ветвь после завершения транзакции.
В этом примере приходы клиентов моделируются блоком Entity Generator. Клиенты прибывают с постоянными межвузовскими временами, и Период 1
. Каждому сгенерированной сущности присоединяется атрибут TransactionType
для представления запросов клиентов. The TransactionType|is initialized as |0
поскольку транзакция неизвестна перед входом клиентов в ветвь.
Зал ожидания представлен блоком Entity Queue. При входе клиента в зал ожидания ему присваивается номер соответствующего банковского кассира. Это действие представлено изменением атрибутов сущности в действиях события блока Entity Queue. Ниже приведено действие, инициируемое событием ввода сущности в блок Entity Queue.
Можно использовать статистику очереди для анализа и понимания поведения очереди в симуляции. В частности, можно измерить:
Количество сущностей, отходящих из очереди в нисходящий блок.
Количество сущностей за определенное время симуляции.
Среднее ожидание сущностей в очереди перед уходом из блока.
Средняя длина очереди или количество сущностей, извлеченных из очереди блоком Entity Find.
Понимание этой статистики может дать представление о поведении вашей модели. Дополнительные сведения о статистике очереди см. в разделе Интерпретация моделей SimEvents с использованием статистического анализа.
Этот пример представляет два различных метода для визуализации и понимания длины очереди.
Чтобы определить, сохраняет ли очередь какие-либо сущности, можно вывести статистику, которая соответствует количеству сущностей, хранящихся в блоке.
Для вывода статистики выполните эти простые шаги.
Включите n выходной сигнал из блока очереди. В диалоговом окне блока на вкладке Statistics установите флажок Number of entities in block, n.
Из библиотеки раковин в Simulink® library set, вставьте Scope блок в модель. Подключите n выхода порт блока очереди к входу порту блока Scope.
Область возможностей показывает, пуста ли очередь.
Для получения дополнительной информации о визуализации статистики очереди смотрите Исследования статистики и Визуализация результатов симуляции.
Можно разбить очередь на разделы, чтобы узнать больше о длине и поведении очереди во время симуляции.
Предположим, что вы хотите определить, какая доля времени превышает длину очереди 10
для очереди с емкостью 100
. Вы можете исследовать это с помощью пары очередей, соединенных последовательно. Очереди имеют длины 90
и 10
. Вместе они представляют очередь с емкостью 100
.
Разбиение исходной очереди на две меньшие очереди позволяет вам собирать статистику, относящуюся к одной из меньших очередей. Для примера можно просмотреть статистику длины очереди для блока Сущности Queue of с емкостью 90
. Если в очереди накоплены сущности с емкостью 90
, в означает, что очередь с емкостью 10
полно. Таким образом, определяя долю времени, в которой очередь с емкостью 100
имеет минимум 10 сущностей, что эквивалентно определению доли времени в длине очереди с емкостью 90
больше 0
.
Симулируйте модель. Обратите внимание, что емкость очереди сущностей 90
блок выводит Количество сущностей в блоке, н. Наблюдайте, что в определенных временных интервалах сущности хранятся в блоке, что указывает на то, что очередь с емкостью 10
полно.
Чтобы визуализировать долю времени, в которой находится очередь с емкостью 10
полно, статистический сигнал дополнительно обрабатывается и сравнивается с нулем.