exponenta event banner

Корректировка времени генерации объектов с помощью обратной связи

В этом примере показана система организации очереди, в которой обратная связь влияет на скорость поступления. Целью цикла обратной связи является стабилизация очереди объектов путем замедления скорости генерации объектов блока генератора объектов по мере накопления большего количества объектов в блоке очереди объектов и блоке сервера объектов.

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

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

  • В блоке «Генератор объектов» выберите MATLAB action в качестве источника времени. Добавьте этот код в поле Действие по времени между поколениями.

persistent rngInit;
if isempty(rngInit)
    seed = 12345;
    rng(seed);
    rngInit = true;
end
% Pattern: Exponential distribution
mu = getAvgInterGenTime();
dt = -mu*log(1-rand());

Время межпоколенческого взаимодействия dt генерируется из экспоненциального распределения со средним значением mu, которая определяется функцией getAvgInterGenTime().

  • В блоке Очередь объектов (Entity Queue) на вкладке Статистика (Statistics) выберите Количество объектов в блоке (Number of entities in block), n и Средняя длина очереди (Average queue length) l в качестве выходной статистики.

  • В блоке «Сервер сущностей» выберите MATLAB action в качестве источника времени обслуживания. Добавьте этот код в поле Действие времени обслуживания.

persistent rngInit;
if isempty(rngInit)
    seed = 67868;
    rng(seed);
    rngInit = true;
end
% Pattern: Exponential distribution
mu = 3;
dt = -mu*log(1-rand());
The service time |dt| is drawn from an exponential distribution with
mean |3|.
  • В блоке Сервер сущностей на вкладке Статистика выберите Число сущностей в блоке, n в качестве выходной статистики.

  • Добавьте функциональный блок Simulink. В блоке Simulink Function дважды щелкните по сигнатуре функции и введите y = getAvgInterGenTime().

  • В блоке функции Simulink:

  1. Добавьте два блока In1 и переименуйте их в numInQueue и numInServer.

  2. numInQueue представляет текущее количество объектов, накопленных в очереди, и numInServer представляет текущее количество объектов, накопленных на сервере.

  3. Для добавления этих двух входных данных используйте команду «Добавить блок».

  4. Использовать блок смещения и установить Bias параметр как 1. Постоянное смещение 1 это гарантировать ненулевое время между поколениями.

При необходимости выберите Function Connections в разделе Information Overlays на вкладке Debug, чтобы отобразить цикл обратной связи от блока Simulink Function до блока Entity Generation.

  • В родительской модели соедините статистику Количество сущностей в блоке, n из блоков Очередь сущностей и Сервер сущностей с блоком Функция симулятора.

  • Подключите блок Scope к средней длине очереди, l статистика из блока Entity Queue. Цель состоит в изучении средней длины очереди.

  • Увеличение времени моделирования до 10000 и смоделировать модель.

  • Обратите внимание, что средняя длина очереди l в области не увеличивается из-за эффекта обратной связи для нежелательной скорости генерации объекта.

См. также

| | |

Связанные темы