Моделирование работы. 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