Тема: Создание имитационной модели «Стоянка маршрутного такси»
Цель: на примере имитационной модели «Стоянка маршрутного такси» реализовать задачу взаимного исключения
1. Постановка задачи
Задача взаимного исключения возникает в следующих случаях:
• при создании сложных программных мультипроцессных средств;
• для моделирования логики экономического (логистического) процесса.
Рассмотрим практическое решение такой задачи средствами Pilgrim на примере имитационной модели «Стоянка маршрутного такси».
Имеется остановка маршрутного такси. С определенными интервалами времени на остановку приходят пассажиры и подъезжают машины такси. Такси уезжает, когда в машину сядут 10 пассажиров. Если пришедший пассажир не обнаруживает стоящей машины такси, то он встает в очередь на посадку. Когда такси подъезжает на пустую остановку (нет ни одного человека), машина ждет пассажиров. Если такси подъехало, а на остановке уже стоит другая машина, которая пришла раньше, то вновь пришедшая машина встает в очередь.
Принцип работы узла delet: вошедший в него транзакт семейства «такси» становится транзактом семейства «пассажиры», входящие следом. Как только в узел войдет заданное количество транзактов-пассажиров, они поглотятся, а транзакт «тележка» переходит в следующий узел; транзакты, собранные в нее, перестают существовать как заявки на обслуживание в системе. Параметры модели представлены в таблице1.
Опишем работу модели. Генератор 7 (рисунок 1) создает транзакты, имитирующие пассажиров. Интервал прихода пассажиров в соответствии с теоремой о суперпозиции потоков событий имеет экспоненциальное распределение.
Интервал генерации транзактов, имитирующих такси, имеет нормальное распределение (обоснование: маршрут такси состоит из множества отрезков, поэтому имеют место условия центральной предельной теоремы, даже если на маршруте несколько машин). Использование в описании генератора 8 нормального закона распределения интервала генерации означает, что время между приездами такси на остановку чаще оказывается ближе к своему среднему значению и реже — дальше от него (чем больше отклонение интервала от среднего, тем реже это бывает).
Таблица 1
Параметры имитационной модели
|
№ п/п |
Параметр |
Среднее значение (минуты) |
|
1. |
Время моделирования: 10 ч |
600.0 |
|
2. |
Интервал прихода пассажиров |
1.0 |
|
3. |
Интервал приезда такси |
10.0 |
Узлы 1 и 5 имитируют соответственно очереди пассажиров и такси. Ключ 6 в начале работы модели находится в открытом состоянии (по умолчанию), а ключ 2 закрывается при приходе в очередь 1 первого транзакта-пассажира. Это делается для того, чтобы в узел delet первым вошел транзакт-такси, а не пассажир (иначе пассажир станет «тележкой»).
Рисунок 1- Схема модели взаимного исключения и координации процессов типа «производитель-потребитель»
Как только в delet войдет первый транзакт-такси, ключ 6 закрывается, а ключ 2 одновременно с ним открывается. Теперь выходящие из генератора 6 транзакты-такси стоят в очереди 5, а транзакты-пассажиры заходят в узел delet (идет заполнение такси). Когда в узле delet накопятся 10 транзактов-пассажиров, транзакт-такси перейдет в терминатор (заполненное такси уедет). После этого ключ 6 открывается, чтобы в delet мог зайти следующий транзакт-такси, а ключ 2 в это же время закрывается, чтобы транзакты-пассажиры стояли в очереди 1 до прихода в delet транзакта-такси.
Таким образом, ключи 2 и 6 в модели всегда находятся в противоположных состояниях: если один открыт, то другой закрыт. Тем самым чередуется доступ к узлу delet разных типов транзактов-такси и пассажиров.
Рассмотренный принцип «тележки» позволил эффективно решить задачу взаимного исключения и координации процессов «производитель-потребитель».
Текст модели в комментариях не нуждается:
#include <Pilgrim.h> // Модель
char commtext [81] = “АВТОизвозчик и Ко “; // Фирма
char lefttext [81] = “Минуты”; // Время в минутах
float win01 = 600.0; // Моделируем 10 часов
float win02 = 1.0; // Приходы пассажиров
float win03 = 10.0 // Поступление такси
char rightext[81] = “Рабочий день” // Интервал
float win11 = 0.0; // Резерв (окно 11)
forward
{
Parametr; // Диалог настройки
modbeg ("Стоянка такси", 8,
win01, (long) time (NULL) , none, l, none, 4,2);
ag ( "Запросы такси", 7, none, expo, win02, zero, zero, 1) ;
ag (‘Приходы такси", 8, none, norm, win03,win03/3, zero, 5 );
network (dummy, dummy)
{
top(l) : t->ft=l;
queue ("Очередь ", none, 2) ;
place;
top(2): if(addr[3]->tn == 1} // Такси подано?
rels(2); // Да: посадка
else
hold(2); // Нет: ожидаем
key("Есть такси?", 3) ;
place;
top(3): delet("Вход в такси", 1,1, 0,10, 4);
rels(2);
hold(6);
place;
top(4).: term(“Taкси уехало");
hold(2);
rels(6);
place;
top(5): queue("Такси ждет",none,6);
place;
top(6): key("Стоянка своб.?", З);
place;
fault(123);
}
modend("Result_taxi.doc",!,12,page);
return 0;
}
Нетрудно заметить, что в модели нет ни одного узла обслуживания (узлов типа serv или ргос с ненулевым временем обслуживания), но в очередях могут возникать существенные задержки.
Контрольные вопросы:
1. В чём заключается задача взаимного исключения?
2. Объясните принцип работы узла delet в данной задаче.
3. Опишите логику моделирования задачи взаимного исключения.
4. С помощью каких сигнальных функций можно управлять
клапанами key?
К сдаче лабораторной работы №3 необходимо:
1. Смоделировать с помощью графического конструктора Pilgrim задачу взаимного исключения на примере модели «Стоянка маршрутного такси».
2. Подготовить отчёт о проделанной работе.
3. Ответить на контрольные вопросы.
