Моделирование работы. Simula

Моделирование работы в машинном зале в терминах Simula



Постановка задачи.



В студенческом машинном зале расположены две мини-ЭВМ и одно устройство подготовки данных (УПД). Студенты приходят с интервалом 8±3 мин. и треть из них хочет испытать УПД и ЭВМ, а остальные только ЭВМ. Допустимое количество студентов в машинном зале 4 чел., включая работающего на УПД.

Работа на УПД занимает 9±4 мин. Работа на ЭВМ - 15±10 мин.; 20% работавших на ЭВМ возвращаются для повторного использования УПД и ЭВМ и остаются при этом в машинном зале.

Если студент пришел в машинный зал, а там уже есть 4 чел., то он ждет не более 15±2 мин. в очереди в машинный зал и, если нет возможности в течение этого времени начать работать, то он уходит.

Смоделировать работу в машинном зале в течение 48 часов.

Определить:

		загрузку УПД и обеих ЭВМ,

		максимальную длину очереди в машинный зал,

		среднее время ожидания в очереди в машинный зал,

		распределение общего времени работы студента в машинном зале,

		количество студентов, которые не дождались возможности поработать и ушли.



Решение задачи.



Текст программы.



Текст программы полностью приведен в конце данного документа.



Схема решения в терминах предметной области.



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

Работа студента в машинном зале происходит следующим образом. Студент определяет, приступить ли ему к работе УПД, а затем на одной из ЭВМ (по условию задачи, число таких студентов составляет треть от общего числа посетителей) или пройти сразу к ЭВМ (все остальные). После работы на ЭВМ каждый студент может либо покинуть машинный зал, либо приступить к повторной работе (20%), теперь уже точно на УПД и ЭВМ.



Схема решения задачи в терминах языка Симула.

Глобальные переменные и массивы.



M,U,C,P – целые числа, служащие для создания в программе четырех различных потоков независимых величин;

I – счетчик цикла FOR (используется для вывода таблицы);

MZCap – целое число, обозначающее число мест в машинном зале;

Num – число студентов, покинувших очередь;

Nmb – число студентов, дождавшихся обслуживания;

MAX – максимальная длина очереди;

Toz – суммарное время ожидания в очереди;

Pupd – время простоя УПД;

Pcomp – время простоя обеих ЭВМ;

QUEUE – очередь в машинный зал;

QUPD – очередь на УПД;

QCOMP – очередь на ЭВМ;

UPD1 – ссылка на УПД;

COMP1 – ссылка на пару ЭВМ;

Std – массив действительных чисел из 10 элементов, в которые помещаются данные о числе студентов, проделавших работу за i-й интервал времени [Ti-1,Ti];

Tim – массив действительных чисел, в котором хранятся границы временных интервалов Ti.



Процессы.



GENER – процесс, имитирующий появление студента у машинного зала;

STUDENT – процесс, описывающий действия студента;

COMP – процесс, изображающий работу двух мини-ЭВМ;

UPD – процесс, изображающий работу УПД;



Получение результатов.



Для получения результатов используются перечисленные в пункте 2.3.1 глобальные переменные и следующие соотношения:



Загрузка УПД = 1 - Pupd/time;

Загрузка ЭВМ = 1 - Pcomp/time;

Число ушедших студентов = Num;

Максимальная длина очереди = MAX;

Среднее время ожидания в очереди =Toz/(Num + Nmb)



Распределение общего времени работы студента в машинном зале получено в виде массивов std и tim.



Комментарии к программе.



Подробные комментарии приведены в тексте программы в конце данного документа.



Результаты.



Загрузка УПД = 33,8%;

Загрузка ЭВМ = 82,1%;

Число ушедших студентов = 109;

Максимальная длина очереди = 3;

Среднее время ожидания в очереди = 9,79 мин.

Распределение общего времени работы студентов в машинном зале приведено в таблице 2.1.

Таблица 2.1

Число студентов

Интервалы времени

14

0 – 15

86

15 – 30

56

30 – 45

20

45 – 60

19

60 – 75

24

75 – 90

12

90 – 105

9

105 – 120

8

120 – 135



Исследование адекватности модели.



Метод исследования.



Рассмотренный далее метод не претендует на абсолютную точность, но, тем не менее, позволяет примерно оценить соответствие модели реальной ситуации.

Метод заключается в использовании внесения изменений в начальные данные. При этом анализируются изменения получаемых результатов.



Применение метода к поставленной задаче.



Вся информация по измененным входным данным и полученным результатам представлена в таблице 3.1 Знаком “|” отделяются значения для исходной задачи от значений для задачи, получаемой в результате внесения изменений.

Таблица 3.1

Параметр

Загрузка УПД, %

Загрузка ЭВМ, %

Максимальная длина очереди, чел.

Среднее время ожидания, мин.

Число ушедших студентов, чел.

Время работы системы 

48 | 100

часов





33,8 | 32,0





 81,2 | 83,1 





3 | 3





9,79 | 9,72





109 | 324



Число мини-ЭВМ

2 | 1

шт.



33,8 | 21,4 



81,2 | 81,0



3 | 3



9,79 | 12,12



109 | 229

Число человек в зале

4 | 2



33,8 | 31,8



81,2 | 83,6 



3 | 3



9,79 | 9,76



109 | 149

Интервал между приходами студентов

8±3 | 1





33,8 | 34,0





81,2 | 83,2





3 | 18





9,79 | 14,36





109 | 2650

Число желающих использовать УПД и ЭВМ

33 | 66

%





33,8 | 47,1





81,2 | 76,6





3 | 3





9,79 | 11,17





109 | 192



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



Сравнительный анализ моделей.



В приведенной ниже таблице даны искомые значения, полученные при помощи двух моделей: в реализации на GPSS и в реализации на языке Симула.

Таблица 4.1

Величина

GPSS

Симула

Загрузка УПД

55,2

33,8

Загрузка ЭВМ

96,5

81,2

Число ушедших студентов

78

109

Максимальная длина очереди

4

3

Среднее время ожидания

9,02

9,79



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





SIMULATION begin 

	integer M,U,C,P,I; comment потоки случайных величин и счетчик цикла;

 integer MZCap; comment вместительность машинного зала;

 integer Num, comment число студентов, покинувших очередь;

 Nmb; comment число студентов, дождавшихся обслуживания; 

 integer MAX; comment максимальная длина очереди;

 integer Toz; comment суммарное время ожидания в очереди;

 integer Pupd, comment время простоя УПД;

 Pcomp; comment суммарное время простоя двух ЭВМ;

 ref (HEAD) QUEUE; comment очередь в машинный зал;

 ref (HEAD) QUPD; comment очередь на УПД; 

 ref (HEAD) QCOMP; comment очередь на ЭВМ;

 ref (UPD) UPD1; comment УПД;

 ref (COMP) COMP1; comment пара мини-ЭВМ;

 real array std (1:10); comment число студентов в i-м интервале;

 real array tim (1:9); comment интервалы гистограммы;



comment описание работы генератора, имитирующего появление студентов;

PROCESS class GENER;

begin

 CREAT: activate new STUDENT; comment студент подходит к машинному залу;

	 hold(randint(5,11,M)); comment интервал перед приходом следующего;

 goto CREAT; 

end GENER;



comment описание действий студента;

PROCESS class STUDENT;

begin 

 integer vyb, comment возможность выбора работы: на УПД и ЭВМ (3) или только

 на ЭВМ (1 и 2);

	 rep, comment возможность повтора работы (5);

	 wat; comment время, до которого студент может ждать в очереди;

 integer tm; comment фактическое время ожидания или работы;

 

 vyb:=randint(1,3,P); comment если 3, то работа на УПД и ЭВМ;

 rep:=randint(1,5,P); comment если 5, то повторить работу;

 wat:=time+randint(13,17,P); comment время максимального ожидания;

 tm:=time; comment засечь время;

 into(QUEUE); comment встать в очередь в машинный зал;

 if (QUEUE.cardinal>=MAX) then comment если число людей в очереди больше, 

					 чем ранее;

	MAX:=QUEUE.cardinal; comment записать новое значение;

 while MZCap>=4 do begin comment пока в машинном зале нет мест; 

	hold(0.1); comment подождать 6 секунд;

 if time>wat then begin comment если текущее время превысило максимум;

 out; comment покинуть очередь;

		Num:=Num+1; comment увеличение числа ушедших студентов;

 Toz:=Toz+time-tm; comment увеличение суммарного времени ожида-

					 ния;

		goto STOP; comment завершить все действия;

 end; 

 end;

 out; comment покинуть очередь;

	Toz:=Toz+time-tm; comment увеличение суммарного времени ожидания;

 Nmb:=Nmb+1; comment увеличение числа студентов, дождавшихся 

			 	 обслуживания;

 MZCap:=MZCap+1; comment уменьшение числа мест в машинном зале;

 tm:=time; comment засечь время;

 if (vyb=3) or (vyb=2) then begin comment если студент собирался работать на УПД;

 UPD: into(QUPD); comment занять очередь на УПД;

 activate UPD1 delay 0; comment занять УПД;

	passivate; comment ждать конца выполнения работы;

 end;

 into(QCOMP); comment занять очередь на ЭВМ;

 activate COMP1 delay 0; comment занять ЭВМ;

 passivate; comment ждать конца выполнения работы;

 if rep=5 then comment если работу нужно повторить;

 begin 

 rep:=1; comment сброс повторения;

	 goto UPD; comment перейти к УПД;

 end;

 histo(std,tim,time-tm,1); comment сохранить статистику;

 MZCap:=MZCap-1; comment освободить место в зале;

 STOP: comment завершение всех действий;

end STUDENT;



comment описание работы мини-ЭВМ;

PROCESS class COMP;

begin

 ref (STUDENT) S; comment студент, занимающий место;

 integer Nach; comment время начала простоя;

 START: S:-QCOMP.first; comment первый студент в очереди;

	S.out; comment покидает ее,;

 hold(randint(5,25,C)/2); comment работает на ЭВМ;

 activate S; comment и переходит к следующему действию;

 Nach:=time; comment засечь время;

 passivate; comment ждать следующего студента;

 Pcomp:=Pcomp+(time-Nach)/2; comment увеличить время общего простоя;

 goto START; 

end;



comment описание работы УПД;

PROCESS class UPD;

begin ref (STUDENT) S; comment студент, занимающий УПД;

 integer Nach; comment время начала простоя;

 START: S:-QUPD.first; comment первый студент в очереди;

	 S.out; comment покидает ее,;

	 hold(randint(5,13,U)); comment работает на УПД;

 activate S; comment и переходит к следующему действию;

 Nach:=time; comment засечь время;

 passivate; comment ждать следующего студента;

 Pupd:=Pupd+time-Nach; comment вычислить общее время простоя;

 goto START;

end UPD;



comment инициализация потоков случайных чисел;

 M:=2;U:=1;C:=3;P:=4; 

 QUEUE:-new HEAD; comment создание очереди в машинный зал;

 QUPD:-new HEAD; comment создание очереди на УПД;

 QCOMP:-new HEAD; comment создание очереди на ЭВМ;

	UPD1:-new UPD; comment создание УПД;

 COMP1:-new COMP; comment создание ЭВМ;



comment установка временных интервалов гистограммы;

 tim(1):=15; tim(2):=30; tim(3):=45; tim(4):=60;

 tim(5):=75; tim(6):=90; tim(7):=105; tim(8):=120;

 tim(9):=135;



comment создание и запуск генератора студентов;

activate new GENER; 

hold(2880); comment моделирование работы системы в течение 48 часов;



comment вывод полученных значений;

outfix(1-Pupd/time,3,5);outimage; comment загрузка УПД;

outfix(1-Pcomp/time,3,5);outimage; comment загрузка ЭВМ;

outfix(Num,0,5);outimage; comment число ушедших студентов;

outfix(MAX,0,5);outimage; comment максимальная длина очереди;

outfix(Toz/(Num+Nmb),2,5);outimage; comment среднее время ожидания в очереди;



comment вывод распределения общего времени работы студентов в машинном зале;

for I:=1 step 1 until 9 do

begin

 outint(tim(I),11); comment время работы;

 outint(std(I),11); comment число студентов;

 outimage;

end;

end