Форум программистов, компьютерный форум, киберфорум
GPSS
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
2 / 2 / 0
Регистрация: 18.03.2015
Сообщений: 54
1

Пррименение SaveValue

11.11.2019, 13:59. Показов 2593. Ответов 4
Метки gpss (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Есть задача, которая звучит так:
На двух процессорную вычислительную систему в интервале
10-20 секунд (закон равномерный) поступают задания. Задание
выполняется любым свободным процессором. Первый процессор
выполняет задание в среднем за 30 секунд (закон
экспоненциальный), а 2-ой за 22-38 секунд(закон равномерный).
Если заняты оба процессора, то задание получает отказ в
обслуживании. Провести моделирование выполнения 100000
заданий, определить загрузку процессоров и процент заданий,
получивших отказ, и отношение числа заданий обработанных 1-м
процессором к числу заданий, обработанных 2-м процессором.

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

На данный момент у меня код без сохраняемых величин:

Код
   generate(Uniform(1,10,20))
            gate nu proc1,second
            seize proc1 
            advance (Exponential(1,0,30))
            release proc1
            terminate 1
Second  gate nu proc2,otkaz
	    seize proc2
            advance (Uniform(1,22,38))
	    release proc1
            terminate 1
Otkaz    terminate 1
	    start 100000

Буду рад вашей помощи
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2019, 13:59
Ответы с готовыми решениями:

Разница между VARIABLE и SAVEVALUE
Правильно ли я понимаю, (по аналогии с языками программирования) что VARIABLE это как функция, а...

Переменные в GPSS: EQU, SAVEVALUE, VARIABLE, ASSIGN
Я не пойму разницы между savevalue и equ.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
1816 / 1030 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
12.11.2019, 07:22 2
Добрый день.

Статистику удобно собирать в одном месте, а у Вас заявки выходят через три разных terminate. лучше сделать один terminate, а верхние заменить на transfer ,TERM тем самым отправляя по метке TERM где будет расчёт сохраняемых величин, а после - один общий terminate.

Число заявок прошедших через блок N$имяМетки или NномерСтрокикода
например N$Second.

зная число обслуженных заявок (после release) на первом и втором блоке, а также число отказавших можно получить вероятность отказа как число отказавших задач/число обслуженных задач
1
2 / 2 / 0
Регистрация: 18.03.2015
Сообщений: 54
12.11.2019, 09:44  [ТС] 3
Большое спасибо за ответ!

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


Код
Generate (Uniform(1,10,20))
First	gate nu proc1,Second
	Seize proc1 
	Advance (Exponential(1,0,30))
	release proc1
	transfer,End_1
Second	gate nu proc2,Otkaz
	seize proc2
	Advance (Uniform(1,22,38))
	Release proc2
	transfer,End_2
Otkaz 	transfer, End_3
End_1 	Savevalue count_1+,1
	Terminate 1
End_2 	Savevalue count_2+,1
	Terminate 1
End_3 	Savevalue count_otkaz+,1
	Terminate 1
        Savevalue count_1proc,(X$count_1/(N$First+N$Second+N$Otkaz)#100)
        start 10000
Спасибо!
0
1816 / 1030 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
13.11.2019, 15:24 4
Запись вычисляет немного не то, что нужно по заданию.
Код
Savevalue count_1proc,(X$count_1/(N$First+N$Second+N$Otkaz)#100)
Нужно так понимаю посчитать процент задач обработанных на первом устройстве от общего числа обработанных задач

Числитель правильный X$count_1, а вот в знаменателе почемуто вместо фактических значений числа обработанных задач используются счётчики блоков. По порядку.
Код
Generate (Uniform(1,10,20))
First	gate nu proc1,Second
В First попадут все 100% заявок, что сгенерировано GENERATE. Скорее всего Вы хотели оценить число обслуженных заявок на первом устройстве, это можно посмотреть не ранее release proc1 - это гарантия того что что заявка уже обслужилась в устройстве. Зедсь верным является счётчик X$count_1

В Second попадут все заявки, которые не подошли по условию First. То есть число заявок проходящих через Second = Все - First или число заявок обслуживающихся на устройстве 2 + отказных. Правильный счётчик заявок обслуженных на устройстве 2 - X$count_2

Число заявок которым отказано в обслуживании N$Otkaz или X$count_otkaz

Логику программы Вы вроде понимаете по коду. Заявка просто двигается по коду как бы сверху -вниз) начиная с блоков GENERATE в определённые случайные интервалы времени согласно заданным временным интервалам и условиям движения.
1
2 / 2 / 0
Регистрация: 18.03.2015
Сообщений: 54
19.11.2019, 00:14  [ТС] 5
Поправил с учетом комментариев. Насколько я понимаю сейчас все верно?)
Большое спасибо за помощь!

Код
Generate (Uniform(1,10,20))
First	gate nu proc1,Second
	Seize proc1 
	Advance (Exponential(1,0,30))
	release proc1
	Savevalue count_1+,1
	transfer,End_
Second	gate nu proc2,Otkaz
	seize proc2
	Advance (Uniform(1,22,38))
	Release proc2
	Savevalue count_2+,1
	transfer,End_
Otkaz 	transfer, End_3
End_3	Savevalue count_otkaz+,1
	Terminate 1
End_      Savevalue count_1proc,(X$count_1/(X$count_1+X$count_2+N$Otkaz)#100)
	Savevalue count_2proc,(X$count_2/(X$count_1+X$count_2+N$Otkaz)#100)
	Savevalue count_otkaz_proc,(X$count_otkaz/(X$count_1+X$count_2+N$Otkaz)#100)
        	start 10000
Добавлено через 1 час 17 минут
Поспешил с ответом. Действительно нужно найти отношение обработанных заявок на 1 проц к заявкам, обработанным на 2-м проц.

Код
Generate (Uniform(1,10,20))
First	gate nu proc1,Second
	Seize proc1 
	Advance (Exponential(1,0,30))
	release proc1
	Savevalue count_1+,1
	transfer,End_
Second	gate nu proc2,Otkaz
	seize proc2
	Advance (Uniform(1,22,38))
	Release proc2
	Savevalue count_2+,1
	transfer,End_
Otkaz 	transfer, End_3
End_3	Savevalue count_otkaz+,1
	Terminate 1
End_      Savevalue count_1by2proc,(X$count_1/(X$count_2)#100)
	Savevalue count_otkaz_proc,(X$count_otkaz/(X$count_1+X$count_2+N$Otkaz)#100)
	Terminate 1
        	start 100000
Не могу понять как избежать ошибки деление на ноль, ведь первая заявка в любом случае пройдет через проц1, и отношение соответственно будет 1 к 0. Первоначально хотел задать переменную count_2 равной 1, но понимаю что она каждый раз будет принимать это значение.

Как справиться с данной проблемой?
0
19.11.2019, 00:14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru