Форум программистов, компьютерный форум, киберфорум
GPSS
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/41: Рейтинг темы: голосов - 41, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 14
1

Моделирование работы СМО

27.11.2013, 01:09. Показов 7888. Ответов 22
Метки нет (Все метки)

Друзья! Помогите, пожалуйста, с задачей со следующими условиями:

1. Система массового обслуживания с ограниченным ожиданием в очереди.
2. Поступление заявок описывается пуассоновским законом распределения с интенсивностью 0.5 заявок в минуту (1 заявка в 2 минуты).
3. Максимальное время ожидания заявки в общей очереди 120 мин. (среднее время ожидания должно быть меньше этого срока, например 40 мин.).
4. Нетерпеливые заявки покидают систему.
5. Дисциплина очереди FIFO.
6. Параллельно работают 22 канала обслуживания.
7. Каждый канал обслуживает заявку в два этапа.
8. В канале одновременно могут быть несколько заявок.
9. Перед каждым этапом обслуживания формируется внутренняя очередь в каждом канале (каналы «стремятся взять» заявки до истечения 120 мин)
10. Первый этап 10 мин плюс/минус 5 минут
11. Второй этап 30 мин плюс/минус 10 минут.
12. Обслуженная заявка покидает систему.
Необходимо построить модель для 720 минут работы СМО.

В итоге, имеем двадцать две одноканальные многофазные СМО. Работаю с GPSS недолго, почитала самоучители и форумы, похожего не нашла. Вот что у меня получилось:
Код
Sys STORAGE 22                          ;Всего 22 канала обслуживания
GENERATE (EXPONENTIAL (1,0,2))   ;Поступление заявок
QUEUE OcheredSys                       ;Заявки становятся в очередь
TEST GE  QT$Ochered1,120,out      ;Если ожидание заявки в общей очереди больше или равно 120 мин, то такая                                           заявка покидает систему
ENTER	Sys                            ;Заявка занимает один из 22 каналов
DEPART OcheredSys	                 ;Заявка покидает очередь
QUEUE Ochered1                           ;Перед первой фазой обслуживания - очередь (внутри канала)
SEIZE Phase1                               ;Сначала заявка проходит обслуживание первой фазы
DEPART Ochered1
ADVANCE 10,5
RELEASE Phase1
QUEUE Ochered2                           ;Перед началом обслуживания второй фазы - очередь (внутри канала)
SEIZE Phase2                               ;Обслуживание второй фазы
DEPART Ochered2
ADVANCE 30,10
RELEASE Phase2
LEAVE	Sys                            ;Заявка покидает систему
TERMINATE
out  TERMINATE                           ;Выход тех заявок, у которых ожидание в общей очереди превысило 120 мин.
;************
GENERATE 720
TERMINATE 1
START 1
Программа работает, но мне кажется, что она НЕ отражает условия задачи. И как указать то, что в канале может быть несколько заявок? Как задать ограничение на максимальное время ожидания в очереди? Я вообще в правильном направлении мыслю?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2013, 01:09
Ответы с готовыми решениями:

Моделирование СМО
Доброго времени суток,я в ступоре...есть условие казалось бы легкое...4 генератора создают заявки с...

Моделирование СМО
Смотрел другие форумы НО ни че не получается((( У меня( Помогите! Заявки поступают в систему...

Моделирование СМО
Моделирую такую систему(смотри вложение). Но при симуляции на каждом этапе there are no...

Моделирование замкнутых СМО
нужно смоделировать замкнутые смо М/М/1/N,; М/М/m//N; М/М/m/0/N

22
1815 / 1029 / 285
Регистрация: 13.02.2012
Сообщений: 3,338
27.11.2013, 10:48 2
TEST GE QT$Ochered1,120,out ;Если ожидание заявки в общей очереди больше или равно 120 мин, то такая заявка покидает систему
Логика работы gpss такая, что если заявка может идти дальше по коду то она идёт.
В данном случае блок тест НИКАК не стопорит заявку и как только заявка ходит она сразу идёт ТЕСТ, то есть время в очереди = 0, эта проверка - пустышка данном случае.

Обычно я практикую следующий метод ограничения времени ожидания в очереди:
1. параметр транзакта записываем время которое он будет максимум ждать, например 100 едениц времени
Код
ASSIGN 1,100
2. После того, как заявка вошла в очередь - организовываем цикл
цикл GPSS:
Код
METKA
тело цикла
LOOP 1,METKA
принцип работы : 1 - номер параметра, каждый проход из P1 (100) вычитается единица, когда P1 станет = 0 цикл закончится - то есть крутить будем по 1ой единице модельного времени
Код
METKA TEST проверка занято ли конкретное устройство? если занято то ниже по коду, иначе заявку напраляем на обслуживание  устройство
ADVANCE 1 ; делаем задержку на 1 единицу
LOOP 1,METKA
если заявка вышла из цикла то, видимо прошло 100 единиц ожидания поэтому
TRANSFER ,vixod


Есть и другие способы реализации.

Добавлено через 3 минуты
Программа работает, но мне кажется, что она НЕ отражает условия задачи.
Да, сейчас у вас 22 заявки могут попасть в многоканальное устройство, НОООООО они все упрутся сначала в фазу 1 и будут по 1ой обслуживаться (seize), а потом также во второй фазе.

если убрать seize-release - то заявки в advance будут входить и обслуживаться одновременно, максимум 22.
1
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 14
27.11.2013, 13:24  [ТС] 3
Спасибо за участие, переписала код, но с LOOP выдает ошибку( не пойму, как исправить.
Также убрала seize-release, в этом варианте в каждом канале заявки будут проходить по 2 фазы обслуживания, с очередями между ними? Очереди между фазами для того, чтобы канал мог отложить работу с принятой заявкой и принять еще, пока не кончились 120 мин. Такое возможно реализовать?
Код
SYS STORAGE 22                   ;Всего 22 канала обслуживания
GENERATE (EXPONENTIAL (1,0,2))   ;Поступление заявок      
GATE SF SYS,Met1                ;Проверка занятости каналов (МКУ), если не заполнено, то на вход по мет1

QUEUE OcheredSys                 ;Заявки становятся в очередь
ASSIGN 1,120                     ;Время, которое максимум будет ждать заявка
ozhid ADVANCE 1                         ;Задержать на 1 мин.
GATE SF SYS,Met1                ;Проверка занятости каналов (МКУ), если не заполнено, то на вход по мет1, иначе цикл 
LOOP 1, ozhid               
TRANSFER ,out                   ;Если прошло больше 120 мин. ожидания в очереди, заявка покидает систему

Met1 ENTER	Sys                    ;Заявка занимает один из 22 каналов
DEPART OcheredSys	             ;Заявка покидает очередь

Phase1 QUEUE Ochered1                   ;Перед первой фазой обслуживания - очередь (внутри канала)
                                                     ;Сначала заявка проходит обслуживание первой фазы
DEPART Ochered1
ADVANCE 10,5

Phase2 QUEUE Ochered2                   ;Перед началом обслуживания втрой фазы - очередь (внутри канала)
                                                   ;Обслуживание второй фазы
DEPART Ochered2
ADVANCE 30,10

LEAVE	Sys                    ;Заявка покидает систему
TERMINATE
out  terminate                   ;Выход тех заявок, у которых ожидание в общей очереди превысило 120 мин.
; ************
GENERATE 720
TERMINATE 1
START 1
0
1815 / 1029 / 285
Регистрация: 13.02.2012
Сообщений: 3,338
27.11.2013, 13:46 4
LOOP 1, ozhid
никаких пробелов в gpss!!!

Phase1 QUEUE Ochered1 ;Перед первой фазой обслуживания - очередь (внутри канала)
;Сначала заявка проходит обслуживание первой фазы
DEPART Ochered1
какой здесь смысл в блоках que-depart заяка эти блоки МГНОЕННО проскакивает, постаьте хоть ваш AVANCE между ними - для сбора статистики.

Добавлено через 3 минуты
QUEUE OcheredSys ;Заявки становятся в очередь
ASSIGN 1,120 ;Время, которое максимум будет ждать заявка
ozhid ADVANCE 1 ;Задержать на 1 мин.
GATE SF SYS,Met1 ;Проверка занятости каналов (МКУ), если не заполнено, то на вход по мет1, иначе цикл
LOOP 1,ozhid
TRANSFER ,out ;Если прошло больше 120 мин. ожидания в очереди, заявка покидает систему
Вот прикол - вы в очередь заявки все ставите, а вынимать кто будет? те заявки которые идут в out тоже надо департить.
1
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 14
27.11.2013, 14:25  [ТС] 5
никаких пробелов в gpss!!!
Слона и не заметила

какой здесь смысл в блоках que-depart заяка эти блоки МГНОЕННО проскакивает, постаьте хоть ваш AVANCE между ними - для сбора статистики.
Вот в этом и мой вопрос, как реализовать очереди между стадиями? Как добиться того, что в канале несколько заявок? получается, это невозможно?


Вот прикол - вы в очередь заявки все ставите, а вынимать кто будет? те заявки которые идут в out тоже надо департить.
У меня в out транзакты не уходят, а по отчету среднее время ожидания в общей очереди 345, а максимум 120. Неправильно у меня ограниченная по времени очередь реализована. Где ошибка?
Код
SYS STORAGE 22                   ;Всего 22 канала обслуживания

GENERATE (EXPONENTIAL (1,0,2))   ;Поступление заявок
         
GATE SF SYS,Met1                ;Проверка занятости каналов (МКУ), если не заполнено, то на вход по мет1


OCHER QUEUE OcheredSys                 ;Заявки становятся в очередь
 
ASSIGN 1,120                     ;Время, которое максимум будет ждать заявка
ozhid ADVANCE 1                         ;Задержать на 1 мин.
GATE SF SYS,Met1                ;Проверка занятости каналов (МКУ), если не заполнено, то на вход по мет1, иначе цикл 

LOOP 1,ozhid               
TRANSFER ,out                   ;Если прошло больше 120 мин. ожидания в очереди, заявка покидает систему

DEPART OcheredSys	             ;Заявка покидает очередь

Met1 ENTER Sys                    ;Заявка занимает один из 22 каналов


Phase1 QUEUE Ochered1                   ;Перед первой фазой обслуживания - очередь (внутри канала)
ADVANCE 10,5
                     ;Сначала заявка проходит обслуживание первой фазы
DEPART Ochered1


Phase2 QUEUE Ochered2                   ;Перед началом обслуживания втрой фазы - очередь (внутри канала)
ADVANCE 30,10
                     ;Обслуживание второй фазы
DEPART Ochered2


LEAVE	Sys                    ;Заявка покидает систему

TERMINATE
out terminate                   ;Выход тех заявок, у которых ожидание в общей очереди превысило 120 мин.
DEPART OcheredSys	             ;Заявка покидает очередь
	            
; ************
GENERATE 720
TERMINATE 1
START 1
0
1815 / 1029 / 285
Регистрация: 13.02.2012
Сообщений: 3,338
27.11.2013, 14:50 6
Цитата Сообщение от Aurinko Посмотреть сообщение
У меня в out транзакты не уходят
А это что
TRANSFER ,out
Всё равно на out нужно предусмотреть depart

Добавлено через 3 минуты
Кстати у вас заявки которые входят и видят свободные линии - в очередь не входят - то есть НУЖНО ПОНИМАТЬ что статистика очереди не будет разбавляться, то есть не будет содержать заявок со средним обслуживаем =0. Но это ни о чём не говорит максимум 120 должно быть, идём далее.

Добавлено через 2 минуты

TRANSFER ,out ;Если прошло больше 120 мин. ожидания в очереди, заявка покидает систему

DEPART OcheredSys ;Заявка покидает очередь

Met1 ENTER Sys ;Заявка занимает один из 22 каналов
Средняя строка не достижима!!! то есть ПО ФАКТУ из очереди у вас никто не выходит изза этого среднее время только увеличивается в очереди.
Этот департ должен быть только для заявок которые БЫЛИ В ОЧЕРЕДИ - как вы их будете искать - а Х его знает, поэтому предлагаю ВСЕ заявки вначале пихать в общую QUEUE потом делать проверку GATE
потом ....
ENTER
DEPART

...
по OUT тоже depart.
1
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 14
27.11.2013, 15:08  [ТС] 7
Вот репорт:
Код
LABEL              LOC  BLOCK TYPE     ENTRY COUNT CURRENT COUNT RETRY
                    1    GENERATE           331             0       0
                    2    GATE               331             0       0
OCHER               3    QUEUE              104             0       0
                    4    ASSIGN             104             0       0
OZHID               5    ADVANCE            710             0       0
                    6    GATE               710             0       0
                    7    LOOP               606             0       0
                    8    TRANSFER             0             0       0
                    9    DEPART               0             0       0
MET1               10    ENTER              331             0       0
PHASE1             11    QUEUE              331             0       0
                   12    ADVANCE            331             2       0
                   13    DEPART             329             0       0
PHASE2             14    QUEUE              329             0       0
                   15    ADVANCE            329            18       0
                   16    DEPART             311             0       0
                   17    LEAVE              311             0       0
                   18    TERMINATE          311             0       0
OUT                19    TERMINATE            0             0       0
                   20    DEPART               0             0       0
                   21    GENERATE             1             0       0
                   22    TERMINATE            1             0       0


QUEUE              MAX CONT. ENTRY ENTRY(0) AVE.CONT. AVE.TIME   AVE.(-0) RETRY
 OCHERED1           11    2    331      0     4.582      9.967      9.967   0
 OCHERED2           21   18    329      0    13.390     29.303     29.303   0
 OCHEREDSYS        104  104    104      0    49.932    345.684    [B][U]345.684[/U][/B]   0


STORAGE            CAP. REM. MIN. MAX.  ENTRIES AVL.  AVE.C. UTIL. RETRY DELAY
 SYS                22    2   0    22      331   1   17.972  0.817    0    0
Не понимаю, почему в transfer заявки не уходят, неужели, все успевают пройти за 120-то минут? откуда тогда 345?

Средняя строка не достижима!!
Простите за неграмотность, только после enter надо департить транзакт? тогда ошибка Illegal attempt to make Queue entity content negative

Всё равно на out нужно предусмотреть depart
Вот так?
Assembler
1
2
out terminate ;Выход тех заявок, у которых ожидание в общей очереди превысило 120 мин.
DEPART OcheredSys    ;Заявка покидает очередь
Добавлено через 7 минут
Средняя строка не достижима!!! то есть ПО ФАКТУ из очереди у вас никто не выходит изза этого среднее время только увеличивается в очереди.
Этот департ должен быть только для заявок которые БЫЛИ В ОЧЕРЕДИ - как вы их будете искать - а Х его знает, поэтому предлагаю ВСЕ заявки вначале пихать в общую QUEUE потом делать проверку GATE
потом ....
ENTER
DEPART

...
по OUT тоже depart.
Правильно я понимаю, что надо вот так переписать? Получается среднее время ожидания в первой очереди 2.145
Код
SYS STORAGE 22                   ;Всего 22 канала обслуживания

GENERATE (EXPONENTIAL (1,0,2))   ;Поступление заявок
         
OCHER QUEUE OcheredSys                 ;Заявки становятся в очередь
GATE SF SYS,Met1                ;Проверка занятости каналов (МКУ), если не заполнено, то на вход по мет1

 
ASSIGN 1,120                     ;Время, которое максимум будет ждать заявка
ozhid ADVANCE 1                         ;Задержать на 1 мин.
GATE SF SYS,Met1                ;Проверка занятости каналов (МКУ), если не заполнено, то на вход по мет1, иначе цикл 
LOOP 1,ozhid               
TRANSFER ,out                   ;Если прошло больше 120 мин. ожидания в очереди, заявка покидает систему


Met1 ENTER Sys                    ;Заявка занимает один из 22 каналов
DEPART OcheredSys	             ;Заявка покидает очередь

Phase1 QUEUE Ochered1                   ;Перед первой фазой обслуживания - очередь (внутри канала)
ADVANCE 10,5
                     ;Сначала заявка проходит обслуживание первой фазы
DEPART Ochered1


Phase2 QUEUE Ochered2                   ;Перед началом обслуживания втрой фазы - очередь (внутри канала)
ADVANCE 30,10
                     ;Обслуживание второй фазы
DEPART Ochered2


LEAVE	Sys                    ;Заявка покидает систему

TERMINATE
out terminate                   ;Выход тех заявок, у которых ожидание в общей очереди превысило 120 мин.
DEPART OcheredSys	             ;Заявка покидает очередь
	            
; ************
GENERATE 720
TERMINATE 1
START 1
0
1815 / 1029 / 285
Регистрация: 13.02.2012
Сообщений: 3,338
27.11.2013, 15:13 8
out terminate ;Выход тех заявок, у которых ожидание в общей очереди превысило 120 мин.
DEPART OcheredSys ;Заявка покидает очередь
С логикой разберёмся.
первой строкой вы удаляете из системы заявку.
Вопрос на засыпку как эта заявка попадёт во вторую строчку этого кода?

Добавлено через 57 секунд
Остальное вроде верно. после изменений ошибок быть не должно.
1
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 14
27.11.2013, 15:15  [ТС] 9
Тогда как департить вышедшую в out заявку? просветите, пожалуйста.
0
1815 / 1029 / 285
Регистрация: 13.02.2012
Сообщений: 3,338
27.11.2013, 15:20 10
местами поменяйте сначала департите потом делайте чё хотите с ней (terminate)
1
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 14
27.11.2013, 15:24  [ТС] 11
Т.е. по метке out департить а потом terminate?

out DEPART OcheredSys
terminate
0
1815 / 1029 / 285
Регистрация: 13.02.2012
Сообщений: 3,338
27.11.2013, 15:25 12
угу
0
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 14
27.11.2013, 15:42  [ТС] 13
Тогда вот вся программа:
Код
SYS STORAGE 22                   ;Всего 22 канала обслуживания
GENERATE (EXPONENTIAL (1,0,2))   ;Поступление заявок
     
OCHER QUEUE OcheredSys                 ;Заявки становятся в очередь
GATE SF SYS,Met1                ;Проверка занятости каналов (МКУ), если не заполнено, то на вход по мет1
 
ASSIGN 1,120                     ;Время, которое максимум будет ждать заявка
ozhid ADVANCE 1                         ;Задержать на 1 мин.
GATE SF SYS,Met1                ;Проверка занятости каналов (МКУ), если не заполнено, то на вход по мет1, иначе цикл 
LOOP 1,ozhid               
TRANSFER ,out                   ;Если прошло больше 120 мин. ожидания в очереди, заявка покидает систему

Met1 ENTER Sys                    ;Заявка занимает один из 22 каналов
DEPART OcheredSys	             ;Заявка покидает очередь

Phase1 QUEUE Ochered1                   ;Перед первой фазой обслуживания - очередь (внутри канала)
ADVANCE 10,5
                     ;Сначала заявка проходит обслуживание первой фазы
DEPART Ochered1

Phase2 QUEUE Ochered2                   ;Перед началом обслуживания втрой фазы - очередь (внутри канала)
ADVANCE 30,10
                     ;Обслуживание второй фазы
DEPART Ochered2
LEAVE	Sys                    ;Заявка покидает систему

TERMINATE
out DEPART OcheredSys	             ;Заявка покидает очередь
terminate                   ;Выход тех заявок, у которых ожидание в общей очереди превысило 120 мин.          
; ************
GENERATE 720
TERMINATE 1
START 1
Значит с ограниченным временем в очереди разобрались?)
Вопрос: правильно ли многофазность реализована? когда смо одноканальная, то seize-release используют и очереди перед фазами оправданы, а у меня же все мгновенно происходит, очередей нет. Как их создать (совместить многоканальность и многофазность)?
0
1815 / 1029 / 285
Регистрация: 13.02.2012
Сообщений: 3,338
27.11.2013, 15:54 14
Вот у вас в условии задачи
8. В канале одновременно могут быть несколько заявок.
Если предположить что в канале может быть 12 заявок то реализовано всё верно.

Иначе придётся мудрить с ещё одними очередями и проверками, то есть проверять сколько заявок в канале ( определить можно W$METKA1 - текущее кол-во заявок в блоке с меткой)
TEST LE W$METKA1,5 - типа если в метке1 (фазе1) меньше или равно 5 заявкам, то не задерживаем, иначе заявка застопорится в блоке ТЕСТ - ну и если нужно получить статистику по этому стопорению - обрамите этот тест в QUEUE-...-DEPART
1
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 14
27.11.2013, 17:30  [ТС] 15
я смотрю число заявок в Expressio window, там 0 либо 1. Почему 12?
наверно, не так смотрю?
0
1815 / 1029 / 285
Регистрация: 13.02.2012
Сообщений: 3,338
27.11.2013, 20:41 16
не понял что смотрите, когда и где.
0
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 14
27.11.2013, 21:50  [ТС] 17
Если предположить что в канале может быть 12 заявок то реализовано всё верно.
Как посчитать сколько заявок одновременно находится в одном канале?

определить можно W$METKA1
Не понимаю каким оператором осуществляется обычный подсчет, поэтому использовала "Expression Window" expression W$Phase1... для определения количества транзактов в первой фазе
0
1815 / 1029 / 285
Регистрация: 13.02.2012
Сообщений: 3,338
27.11.2013, 22:02 18
Phase1 - метка блока очередь - через эту метку проходит по 1 заяке и они не задерживаются - задерживает ADVANCE - назовите его какнить и смотрите его W$
1
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 14
27.11.2013, 22:16  [ТС] 19
В первом advance получилось 2, а во втором 18 (метки Phase1 и Phase2). Глупый вопрос, но это в одном канале или в 22-х?

Expression Value
W$Phase1 2
W$Phase2 18
0
1815 / 1029 / 285
Регистрация: 13.02.2012
Сообщений: 3,338
28.11.2013, 07:39 20
у вас уже НЕТ одного канала (seize- release вы удалили), есть 22 канала.

и то, что вы сняли - это же мгновенные значения, вполне могут быть такие значения.
W$Phase1 2
W$Phase2 18
Посмотрите по результатам моделирования таблицу - сколько через каждую фазу прошло заявок, должно быть +- одинаково.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2013, 07:39

Моделирование СМО Банк
Необходимо определить количество клиентов которые ушли из за окончания рабочего дня, подскажите как...

Моделирование одноканальной СМО в GPSS
Доброго времени суток! Помогите, пожалуйста, смоделировать одноканальную СМО с неограниченной...

Моделирование многоканальной СМО Почты
Здравствуйте, уже битый день не могу разобраться в составлении многоканального СМО почты. Люди...

Моделирование СМО с внешним переключением режимов обслуживания
Проверьте, пожалуйста, правильно ли переключаются режимы и помогите определить суммарную...

Билетная касса железнодорожного вокзала. Моделирование СМО
Помогите разобраться с логикой. Условие задачи: "На железнодорожном вокзале имеется 3 кассы: 2...

Имитационное моделирование системы массового обслуживания (СМО, GPSS, языки общего назначения, JavaScript)
Здравствуйте. Требуется с помощью имитационного моделирования решить задачу по теории массового...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru