Модель движения автобуса по маршруту



Имитационная модель сложного объекта должна отражать много деталей и поэтому часто не может быть представлена в простом виде: её необходимо структурировать и выделять обособленные фрагменты, внутри которых "развиваются" собственные события. Специфика имитационного моделирования заключается в том, что работа этих фрагментов должна происходить под действием "своих" транзактов, имеющих, возможно, различные физический смысл, и синхронизированных между собой в процессе перемещения. В настоящее время отсутствуют формальные правила создания таких моделей, которые можно было бы использовать без специального продумывания — как это, например, делается при создании автоматизированных информационных систем и в некоторых других случаях, когда возможно применение средств автоматизированного проектирования программ. В практике имитационного программирования приходится проявлять настоящую изобретательность, чтобы отразить ограниченными средствами многообразие жизни.

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

Листинг программ содержит две большие части — фрагмент программы, связанный с состоянием автобуса (Движение автобуса), и фрагмент программы, связанный с состоянием пассажиров на остановках (Потоки пассажиров).

Для удобства перенастройки программы при изменении параметров большинство числовых значений задается с помощью переменных в начальном фрагменте программы (Исходные данные).

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

-----------------------------------------------------------------------------------
; GPSS World: buso-01.gps
;-----------------------------------------------------------------------------------
; Движение автобуса по кольцевому маршруту
;-----------------------------------------------------------------------------------
; Автобус движется по маршруту в одном направлении по кольцу. Имеется 5 остановок,
; из которых одна - начальная, одна - конечная и три - промежуточных.
; На каждую остановку, кроме конечной, подходят пассажиры. Когда автобус
; останавливается, то вначале все желающие выходят, а затем входит некоторое
; количество пассажиров, но не более, чем есть на остановке и не более, чем может
; вместить автобус. На первой остановке только входят, а на конечной - только
; выходят. Время входа и выхода каждого пассажира учитывается.
;-----------------------------------------------------------------------------------
; Особенности программы.
; Реализована последовательная работа, когда число остановок отражается
; непосредственно в программе.
;===================================================================================
; Исходные данные
;-----------------------------------------------------------------------------------
Bus STORAGE 20; Автобус на 20 мест
lok EQU 20; Вместимость автобуса
tmp1 EQU 0.1; Время выхода 1 пассажира
tmp2 EQU 0.15; Время входа 1 пассажира
tmp3 EQU 6; Время движения между остановками
tmp4 EQU 5; Время выезда на маршрут с базы
tmp5 EQU 1; Время появления пассажира
INITIAL X$HaltNum,0; Номер текущей остановки
INITIAL X$KvantEL,0; Число желающих выйти
INITIAL X$KvantEL2,0; Число желающих выйти
INITIAL X$ELBus,0; Разрешение на выход
INITIAL X$ELBusFin,0; Завершение выхода
INITIAL X$ENBus,0; Разрешение на вход
INITIAL X$KvantEN,0; Число вошедших
INITIAL X$PluVet,0; Разрешение на отъезд от ост.
INITIAL X$ENBus1,0; Число вошедших
INITIAL X$ENBus2,0; Число вошедших
INITIAL X$ENBus3,0; Число вошедших
INITIAL X$ENBus4,0; Число вошедших
;-----------------------------------------------------------------------------------
; Движение автобуса
;-----------------------------------------------------------------------------------
GENERATE,,,1; Автобус вышел на маршрут
ASSIGN 1,0; Номер остановки обнулён
ADVANCE tmp4,(0.2#tmp4); Выезд из гаража на маршрут
TRANSFER,t1100; Переход на маршрут на ост.1
t1000 ADVANCE tmp3,(0.2#tmp3); Поехал к остановке
t1100 ASSIGN 1+,1; Автобус прибыл на остановку
SAVEVALUE HaltNum,P1; Номер остановки зафиксирован
;----------Проверка типа остановки--------------------------------------------------
TEST NE P1,1,t1800; Начальная остановка?
TEST NE P1,5,t1900; Конечная остановка?
;----------Промежуточная остановка--------------------------------------------------
SAVEVALUE KvantEL,(DUniform(2,0,S$Bus)); Число желающих выйти
SAVEVALUE KvantEL2,X$KvantEL; Счётчик желающих выйти
TEST NE X$KvantEL,0,t1500; Есть ли на выход?
SAVEVALUE ELBus,1; Разрешение на выход
;-----------------------------------------Вход
TEST E X$ELBusFin,1; Задержка на время выхода
t1500 SAVEVALUE ELBus,0; Сброс разрешения на выход
SAVEVALUE KvantEL,0; Сброс числа пассажиров на выход
SAVEVALUE KvantEL2,0; Сброс числа пассажиров на выход
SAVEVALUE ELBusFin,0; Сброс задержки на время выхода

TEST NE (Q*1#(lok-S$Bus)),0,t1700; Можно на вход?
SAVEVALUE ENBus,1; Разрешение на вход
TEST E X$PluVet,1; Задержка до разрешения движения
;-----------------------------------------Сброс параметров остановки
t1700 SAVEVALUE ENBus,0; Сброс разрешения на вход
SAVEVALUE PluVet,0; Сброс разрешения на движение
TRANSFER,t1000; Движение к следующей остановке
;----------Начальная остановка 1----------------------------------------------------
t1800 SAVEVALUE ENBus,1; Разрешение на вход
TEST E X$PluVet,1; Задержка движения
SAVEVALUE ENBus,0; Сброс разрешения на вход
SAVEVALUE PluVet,0; Сброс разрешения на вход
TRANSFER,t1000; Поехал к следующей остановке
;----------Конечная остановка 5-----------------------------------------------------
t1900 SAVEVALUE KvantEL,S$Bus; Все на выход на кон.
SAVEVALUE KvantEL2,X$KvantEL; Счётчик желающих выйти на кон.
SAVEVALUE ELBus,1; Разрешение на выход на кон.
TEST E X$ELBusFin,1; Задержка движения на кон.
ASSIGN P1,0; Сброс идикатора номера остановки
SAVEVALUE KvantEL,0; Сброс числа пассажиров на выход
SAVEVALUE KvantEL2,0; Сброс числа пассажиров на выход
SAVEVALUE ELBus,0; Сброс разрешения на выход
SAVEVALUE ENBus,0; Сброс разрешения на вход
SAVEVALUE PluVet,0; Сброс разрешения на движение
SAVEVALUE ENBus1,0; Сброс счётчика вошедших на ост.1
SAVEVALUE ENBus2,0; Сброс счётчика вошедших на ост.2
SAVEVALUE ENBus3,0; Сброс счётчика вошедших на ост.3
SAVEVALUE ENBus4,0; Сброс счётчика вошедших на ост.4
ASSIGN 1,0; Сброс счётчика остановок
TRANSFER,t1000; Возврат на остановку 1 по кольцу
;===================================================================================
; Потоки пассажиров
;===================================================================================
; Остановка 1 **********************************************************************
GENERATE tmp5,(0.5#tmp5); Пассажир пришёл 1
ASSIGN 2,1; Отметка пассажира 1
QUEUE 1; Встал в очередь 1
TEST E (X$ENBus#X$HaltNum),1; Разрешение на вход 1–;------------------------------------------ Вход-начало–
ENTER Bus,1; Вход в автобус 1
DEPART 1; Освобождение очереди 1
SAVEVALUE ENBus1+,1; Подсчёт числа вошедших 1
TEST E (Q1#(lok-S$Bus)),0,t13; Контроль входящих 1
SAVEVALUE KvantEN,X$ENBus1; Последний вошедший 1
SAVEVALUE ENBus,0; Запрет на вход 1
t13 ADVANCE tmp2; Время на вход 1
;------------------------------------------ Вход-окончание
SAVEVALUE KvantEN-,1; Последний вошедший 1
TEST E X$KvantEN,0,t200; Последний вошёл и можно ехать 1
SAVEVALUE PluVet,1; Разрешение на движение 1
t200 TRANSFER,t2000; Накопление на выход 1
; Остановка 2 **********************************************************************
GENERATE tmp5,(0.5#tmp5); Пассажир пришёл 2
ASSIGN 2,2; Отметка пассажира 2
QUEUE 2; Встал в очередь 2
TEST E (X$ENBus#X$HaltNum),2; Разрешение на вход 2
;------------------------------------------ Вход-начало
ENTER Bus,1; Вход в автобус 2
DEPART 2; Освобождение очереди 2
SAVEVALUE ENBus2+,1; Подсчёт числа вошедших 2
TEST E (Q2#(lok-S$Bus)),0,t23; Контроль входящих 2
SAVEVALUE KvantEN,X$ENBus2; Последний вошедший 2
SAVEVALUE ENBus,0; Запрет на вход 2
t23 ADVANCE tmp2; Время на вход 2
;------------------------------------------ Вход-окончание

SAVEVALUE KvantEN-,1; Последний вошедший 2
TEST E X$KvantEN,0,t300; Последний вошёл и можно ехать 2
SAVEVALUE PluVet,1; Разрешение на движение 2
t300 TRANSFER,t2000; Накопление на выход 2
; Остановка 3 **********************************************************************
GENERATE tmp5,(0.5#tmp5); Пассажир пришёл 3
ASSIGN 2,3; Отметка пассажира 3
QUEUE 3; Встал в очередь 3
TEST E (X$ENBus#X$HaltNum),3; Разрешение на вход 3
;------------------------------------------ Вход-начало
ENTER Bus,1; Вход в автобус 3
DEPART 3; Освобождение очереди 3
SAVEVALUE ENBus3+,1; Подсчёт числа вошедших 3
TEST E (Q3#(lok-S$Bus)),0,t33; Контроль входящих 3
SAVEVALUE KvantEN,X$ENBus3; Последний вошедший 3
SAVEVALUE ENBus,0; Запрет на вход 3
t33 ADVANCE tmp2; Время на вход 3
;------------------------------------------ Вход-окончание
SAVEVALUE KvantEN-,1; Последний вошедший 3
TEST E X$KvantEN,0,t400; Последний вошёл и можно ехать 3
SAVEVALUE PluVet,1; Разрешение на движение 3
t400 TRANSFER,t2000; Накопление на выход 3
; Остановка 4 **********************************************************************
GENERATE tmp5,(0.5#tmp5); Пассажир пришёл 4
ASSIGN 2,4; Отметка пассажира 4
QUEUE 4; Встал в очередь 4
TEST E (X$ENBus#X$HaltNum),4; Разрешение на вход 4
;------------------------------------------ Вход-начало
ENTER Bus,1; Вход в автобус 4
DEPART 4; Освобождение очереди 4
SAVEVALUE ENBus4+,1; Подсчёт числа вошедших 4
TEST E (Q4#(lok-S$Bus)),0,t43; Контроль входящих 4
SAVEVALUE KvantEN,X$ENBus4; Последний вошедший 4
SAVEVALUE ENBus,0; Запрет на вход 4
t43 ADVANCE tmp2; Время на вход 4
;------------------------------------------ Вход-окончание
SAVEVALUE KvantEN-,1; Последний вошедший 4
TEST E X$PasEnter,0,t500; Последний вошёл и можно ехать 4
SAVEVALUE PluVet,1; Разрешение на движение 4
t500 TRANSFER,t2000; Накопление на выход 4
; Остановка 5 **********************************************************************
; Выход **********************************************************************
t2000 TEST E 1,1
TEST E X$ELBus,1; Разрешение на выход 5
LEAVE Bus,1; Выход 5
SAVEVALUE KvantEL-,1; Подсчёт выходящих 5
TEST E X$KvantEL,0,t2200; Кто последний на выход? 5
SAVEVALUE ELBus,0; Запрет на выход 5
t2200 ADVANCE tmp1; Время на выход 5
SAVEVALUE KvantEL2-,1; Подсчёт выходящих 5
TEST E X$KvantEL2,0,t2400; Вышел ли последний? 5
SAVEVALUE ELBusFin,1; Окончание выхода 5
t2400 TERMINATE 0; Уход пассажира 5
;-----------------------------------------------------------------------------------
; Таймер (в минутах)
;-----------------------------------------------------------------------------------
GENERATE 60
TERMINATE 1

Пассажиры приходят на свои остановки случайным образом, ожидают автобус и в случае его прихода пытаются сесть в него. Это удаётся, если есть пустые места (вместимость автобуса ограничена).

При движении автобуса на каждой остановке случайное число пассажиров решает выйти из автобуса, освобождая тем самым места для новых пассажиров. Учитываются процессы посадки и высадки пассажиров.

Как обычно, процесс описывается в основном временами задержек на соответствующие операции и происходящими событиями.


Дата добавления: 2015-12-17; просмотров: 30; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!