
- •Глава 6. Симула - универсальный процессо-ориентированный язык моделирования
- •Классы и объекты
- •Декларации класса
- •Подклассы
- •Объекты. Создание и средства доступа к атрибутам объекта
- •2.3. Средства доступа е атрибутам объектов
- •Квазипараллельное выполнение
- •Оператор detach (открепить)
- •Оператор resume (возобновить)
- •Выход через «end» объекта
- •Операторы перехода
- •Обработка упорядоченных множеств
- •Планирование процессов. Системный класс simulation
- •Статистические аспекты языка симула
- •Общая структура программы моделирования
- •Программное моделирование работы карьера
- •Описание классов
- •Текст программы
- •Ввод-вывод в симула
- •Понятие текста
- •Text array таблица [1:n];
- •Создание текстовых объектов
- •Процедуры работы с частью текста
- •Процедуры обработки текстов
- •Взаимное преобразование текстовых и арифметических значений
- •Сравнение текстов
- •Организация ввода – вывода
- •Процедуры ввода
- •Процедуры вывода
- •Контрольные вопросы и задания Литература
Общая структура программы моделирования
Описание модели в языке Симула оформляется в виде блока с префиксом SIMULATION. Типичная структура программы моделирования приведена ниже:
begin
<описание глобальных переменных, массивов, процедур>;
<задание значений глобальных переменных>;
simulation
begin
<описание переменных, массивов, общих для всех процедур>;
<декларации классов, определяющие процессы, используемые в модели>;
<процедуры, доступные всем объектам модели>;
<операторы, задающие начальные значения общим переменным и массивам>;
<операторы генерации процессов и объектов, отображающих исходное состояние моделируемой системы>;
<начальная активизация процессов и задание условий окончания моделирования>;
<вывод результатов работы модели>;
end блока simulation;
<продолжение программы>;
end программы
Описание блока simulation begin … end определяют декларации классов для процессов, которые будут функционировать в модели, задают переменные, массивы, процедуры, являющиеся общими для всех процессов. Операторы тела блока с префиксом simulation обычно используются для инициализации работы модели и выдачи результатов моделирования.
Работа блока с префиксом simulation начинается с операторов, заданных в теле класса simulation, которые выполняют стандартные действия, необходимые при инициализации работы любой модели. В частности, модельное время обнуляется.
Для разработчика модели инициализация состоит в задании начальных значений общим переменным и массивам, генерации процессов и объектов, образующих исходное состояние моделируемой системы, запуск этих процессов в работу и указании условий окончания работы модели.
Программное моделирование работы карьера
В карьере работает один экскаватор, который нагружает машины различной грузоподъемности. Машины подъезжают в карьер через случайные промежутки времени, равномерно распределенные в интервале от 7 до 12 минут. Время, затрачиваемое машиной на подъезд к экскаватору и отъезд от экскаватора, и грузоподъемность машин также случайные величины, распределенные равномерно в интервалах [20,30] и [3,5], соответственно. Экскаватор тратит на погрузку одной тонны породы 2 минуты. Время прибытия машин в карьер носит случайный характер и распределено равномерно в пределах [10,20].
Необходимо промоделировать данную систему с целью получения загрузки самосвала, объема груза за смену и среднее время пребывание самосвалов в карьере в течение 8 ч.
Описание классов
Объект «машина»
Правила поведения объекта «машина»:
Машина подъезжает к экскаватору и встает в очередь на погрузку.
Экскаватор загружает машину по очереди.
Загруженная машина уезжает от экскаватора и покидает систему.
Описание класса «машина»
Process CLASS Car (TimeCarIn,GrCar,TimeCarout);
comment Car - имя класса;
comment Описание формальных параметров;
comment TimeCarIn,GrCar,TimeCarout - формальные параметры;
comment TimeCarIn - время подъезда к экскаватору;
comment GrCar - грузоподъемность;
comment TimeCarOut - время отъезда от экскаватора;
Real TimeCarIn,TimeCarOut;
Integer GrCar;
Begin
comment Описание переменных класса "машина";
comment TimeCarSys - время входа машины в систему;
real TimeCarSys;
comment Запоминание времени входа в систему;
TimeCarSys:=TIME;
comment Задержка на время подъезда к экскаватору;
HOLD(TimeCarIn);
comment Машина встает в очередь и активизирует экскаватор;
INTO(HeadCar);
ACTIVATE Eks;
comment Машина ожидает загрузки в очереди;
PASSIVATE;
comment Загруженная машина уезжает из системы;
HOLD(TimeCarOut);
GrAll:=GrAll+GrCar;
TimeCarAll:=TimeCarAll+(TIME-TimeCarSys);
end;
Объект «экскаватор»
Правила поведения объекта «экскаватор»:
Если в очереди есть машины, экскаватор выбирает первую машину из очереди.
Экскаватор загружает машину.
Загруженная машина уезжает от экскаватора и покидает систему.
Если в очереди нет машин, экскаватор переходит в режим простоя до тех пор, пока не приедет машина.
Описание класса «экскаватор»
Process CLASS Ekskavator(PrEks);
comment Ekskavator - имя класса;
comment Описание формальных параметров;
comment PrEks - производительность экскаватора;
integer PrEks;
Begin
comment Описание переменных класса "экскаватор";
comment TimeEksStart - время начала простоя;
comment TimeEksProstoy - простой экскаватора;
real TimeEksStart,TimeEksProstoy;
comment описание ссылочной переменной на машину;
ref(Car) M;
comment Сначала простой равен времени начала работы экскаватора;
TimeEksProstoy:=TIME;
comment Работа экскаватора;
comment Выбираем из очереди первую машину;
Work: FOR M:-HeadCar.First WHILE M=/=NONE DO
Begin
comment Удаляем машину из очереди;
M.out;
comment Загружаем машину;
HOLD(M.GrCar*PrEks);
comment Отправляем загруженную машину;
ACTIVATE M;
End;
comment Запоминаем время начала простоя экскаватора;
TimeEksStart:=Time;
comment Экскаватор простаивает;
PASSIVATE;
comment Приехала машина. Конец простоя экскаватора;
TimeEksProstoy:=TimeEksProstoy+(Time-TimeEksStart);
GOTO Work;
End;
Объект «генератор машин»
Правила поведения объекта «генератор машин»:
До времени окончания моделирования создавать объекты «машина» с соответствующими параметрами через случайные промежутки времени.
Описание класса «генератор машин»
Process CLASS Generator;
comment Generator - имя класса;
Begin
comment Описание переменных класса "генератор машин";
comment TCarIn - время подъезда машины к экскаватору;
comment TCarOut - время отъезда машины от экскаватора;
Real TCarIn, TCarOut;
comment GCar -грузоподъемность машины;
comment ColCar -количество созданных машин;
Integer GCar, ColCar;
comment описание ссылочной переменной на машину;
ref(Car) Mnew;
comment Сначала количество машин равно нулю;
ColCar:=0;
WHILE (TIME<=Tmod)
DO
Begin
comment Получение случайных величин, распределенных по
равномерному закону, для времени подъезда и для
времени отъезда машины;
TCarIn:=UNIFORM(A_TCarIn,B_TCarIn,U_TCarIn);
TCarOut:=UNIFORM(A_TCarOut,B_TCarOut,U_TCarOut);
comment Получение случайной величины, распределенной по
равномерному закону для целых чисел, для
грузоподъемности машины;
GCar:=RANDINT(A_GCar,B_GCar,U_GCar);
comment Создание новой машины;
Mnew:- NEW Car(TCarIn,GCar,TCarOut);
comment Машина поехала;
ColCar:=ColCar+1;
ACTIVATE Mnew;
comment Через случайное время появится новая машина;
HOLD(UNIFORM(A_Mnew,B_Mnew,U_Mnew));
End;
End;