Форум программистов, компьютерный форум, киберфорум
GPSS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 14

СМО цикличного обслуживания с внешним управлением режимами

04.11.2013, 16:40. Показов 1991. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
СМО цикличного обслуживания с внешним управлением режимами

На вход СМО поступает поток заявок 3-х типов; c остаточной вероятностью поступает управляющая заявка.
Вероятности поступления:
1-0.35
2-0.30
3-0.30
Заявки второго типа обслуживаются в S2, третьего - в S3. Заявки первого типа между устройствами S2 и S3 распределяются равновероятно, но после завершения обслуживания меняют тип на соответствующий устройству: обслуженные в S2 становятся заявками второго типа,обслуженные в S3 -третьего. С момента поступления в систему управляющей заявки все вновь поступающие в очередь S1 заявки теряются, т.е. управляющая заявка блокирует очередь и остатестя в ней до завершения режима удаления заявок из системы. Во время этого режима все заявки, поступившие в систему до управляющей заявки,продолжают движение по систему,но в цикл не возвращаются, а покидают ее после обслуживания в S4. После удаления из системы всех заявок управляющая заявка покидает очередь без обслуживания в S1, и возобновляется нормальный режим работы.
Файл схемы прикрепляю ниже.

Такс, теперь вопросы:
1)как изменить тип первой заявки после обслуживания в S2 и S3?
2) вот с этой управляющей заявкой совсем беда,не знаю даже с какого бока к ней подступится:
--как заблокировать устройство S1?
--какую написать проверку,чтобы мониторила остались ли в систему заявки?
--как возобновить работу?
короче по этой заявке мало,что понятно
я тут накидал каркас: просто заявки по кругу ходят и то там *ругается* на строчку: TRANSFER ,FN$tipe

Не могу найти,чтобы вставить код,как код GPSS,пусть будет выглядеть,как код Питона тогда

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
type FUNCTION RN1,D4
0.35,T1/0.65,T2/0.95,T3/1,T4
 
Generate    (Exponential(1,0,10))
 
S1_D    QUEUE   OCH1
    SEIZE   S1_DEVICE
    DEPART  OCH1
    ADVANCE 1.2,0.5
    RELEASE S1_DEVICE
    TRANSFER    ,FN$tipe
 
T1  TRANSFER    .5,T2,T3
 
T2  QUEUE   OCH2
    SEIZE   S2_DEVICE
    DEPART  OCH2
    ADVANCE (Exponential(1,0,0.28))
    RELEASE S2_DEVICE
    TRANSFER    ,S4
 
T3  QUEUE   OCH3
    SEIZE   S3_DEVICE
    DEPART  OCH3
    ADVANCE (Normal(1,0.31,0.4))
    RELEASE S3_DEVICE
    TRANSFER    ,S4
 
S4_D    QUEUE   OCH4
    SEIZE   S4_DEVICE
    DEPART  OCH4
    ADVANCE (Exponential(1,0,0.66))
    RELEASE S4_DEVICE
    TRANSFER    ,S1
 
T4  TERMINATE 1
    START 100
Миниатюры
СМО цикличного обслуживания с внешним управлением режимами  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.11.2013, 16:40
Ответы с готовыми решениями:

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

СМО с кластером для завершения остаточного обслуживания
Доброго времени суток Нужна помощь! По заданию в каналы 3-х канальной СМО поступает три...

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

15
 Аватар для Dukalys
1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
04.11.2013, 22:32
Советую - переобозвать S2_DEVICE и другие по номерам 2 3 ...
Цитата Сообщение от Stiksol Посмотреть сообщение
1)как изменить тип первой заявки после обслуживания в S2 и S3?
изначально договоримся что хранить номер обслуживающего устройства будем в параметре с номером 1

после обслуживания (можно сразу после advance) - воспользуемся функцией которая и решит куда дальше идти
assign 1,FN$NOMER_S

NOMER_S FUNCTION RN1,D2 ; 50% = 2 50%=3
0.5,2/1,3

Теперь можно использовать стрктуру SEIZE P1 - будет заниматься устройство с нужным номером ()номер хаписан в первом параметре текущей заявки)
т.е.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
T2  QUEUE   OCH2
    SEIZE   S2_DEVICE
    DEPART  OCH2
    ADVANCE (Exponential(1,0,0.28))
    RELEASE S2_DEVICE
    TRANSFER    ,S4
 
T3  QUEUE   OCH3
    SEIZE   S3_DEVICE
    DEPART  OCH3
    ADVANCE (Normal(1,0.31,0.4))
    RELEASE S3_DEVICE
    TRANSFER    ,S4
 
S4_D    QUEUE   OCH4
    SEIZE   S4_DEVICE
    DEPART  OCH4
    ADVANCE (Exponential(1,0,0.66))
    RELEASE S4_DEVICE
    TRANSFER    ,S1
Весь этот код можно сократить ДО

Code
1
2
3
4
5
6
7
8
9
10
11
Generate ....
assign 1,FN$type ; Изначально запишем номер (тип) заявки
 
NEW QUEUE   P1
    SEIZE   P1
    DEPART  P1
    ADVANCE (Exponential(1,0,FN$TIM))
    ; Тут определяем номер следующего обслуживающего assign 1,fn$...
    RELEASE P1
    ;
    TRANSFER    ,NEW ;!!! Цикл замкнут
FN$TIM - это время обслуживания в устройстве с номером 1 2 или 3
TIM FUNCTION P1,D3 ; В зависимости от номера обслуживающего устройства определяем время обслуживания
2,0.28/3,0.4/4,0.66

Добавлено через 14 минут
Цитата Сообщение от Stiksol Посмотреть сообщение
2) вот с этой управляющей заявкой совсем

беда,не знаю даже с какого бока к ней подступится:
Предлагаю сделать следующую структуру

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Generate    (Exponential(1,0,10))
assign 1,...
; Делаем проверку пришёл ли управляющий сигнал (P1==4)
TEST E P1,4,DALEE
; Тут нужно условие блокировки S1- не просто блокировка, а чтобы все 
 
заявки которые пытаются войти в очередь 1 - ТЕРЯЛИСЬ
;заведём просто флаг!!
savevalue 1,1 ; x1=1 значит заявки должны идти на выход, соответственно 
 
поставим проверку на x1 перед очередью
;далее эта управляющая заявка должна здесь сидеть до тех пор, пока в 
 
системе не закончатся всё заявки которые УЖЕ В ЦИКЛЕ - как их будем 
 
считать? предлагаю также завести счётчик на основе соханяемой 
 
величины, будем +1 заявку если она вошла в очередь S1 и будем -1 если 
 
заявка идёт на выход TERM пример = (savevalue 2+,1)
TEST E X2,0 ; если х2=0 то выпускаем управляющую
TRANSFER , ... F_TOPKY ;-1 для управляющей делать ненадо, 
 
единственное нам нужно сбросить сигнал того что есть управляющая в 
 
системе = savevalue 1,0
 
DALEE ... 
TEST NE X1,1,TERM ; x1=1 - отказ, значит заявка идёт на terminate
; нормальное обслуживание
...
terminate
Вобщем думаю с какимито моментами разберётесь с какимито покумекаете, здесь мы юзаем обычные флаги-переменные с помощью них и организовываем так называемую блокировку с отказом в обслуживании.
Задавайте вопросы что непонятно.
1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 14
05.11.2013, 08:19  [ТС]
Спасибо за такой развернутый ответ,хотелось бы уточнить пару моментов:
вот насчет кода прохода по устройствам 2-4
Code
1
2
3
4
5
6
7
8
9
10
11
Generate ....
assign 1,FN$type ; Изначально запишем номер (тип) заявки
 
NEW QUEUE   P1
    SEIZE   P1
    DEPART  P1
    ADVANCE (Exponential(1,0,FN$TIM))
    ; Тут определяем номер следующего обслуживающего assign 1,fn$...
    RELEASE P1
    ;
    TRANSFER    ,NEW ;!!! Цикл замкнут
Как войти в циклNew с устройства S1,если там надо разбивать заявки по типам?
И если включить устройство S1 в цикл new,то как там будет происходить разбиение?
И ещё непонятно,что все заявки будут проходить через устройство P1? тогда в отчете каша получится,не отделишь где,что--а мне потом ещё результаты надо будет подробно анализировать
И как тогда правильно сформировать функцию входных заявок?
А насчет управляющей заявки,тут я мне ещё не получается с утра разобрать,что происходит: общий принцип,что надо сделать я понял,но вот в деталях...
15 минут думал,что такой за оператор DALEE
0
 Аватар для Dukalys
1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
05.11.2013, 08:43
Цитата Сообщение от Stiksol Посмотреть сообщение
Как войти в циклNew с устройства S1,если там надо разбивать заявки по типам?
Да действительно вопрос! Видимо нужно сделать начале обязательное QUEUE 1 SEIZE 1 .... а дальше уже 2 или 3 через P1.

Цитата Сообщение от Stiksol Посмотреть сообщение
И ещё непонятно,что все заявки будут проходить через устройство P1? тогда в отчете каша получится,не отделишь где,что--а мне потом ещё результаты надо будет подробно анализировать
Каши не получится, статистика соберётся по очередям и обслуживающим устройствам под номерами 1 2 3 ... нормально всё будет.

Цитата Сообщение от Stiksol Посмотреть сообщение
15 минут думал,что такой за оператор DALEE
DALEE это просто метка
TEST E P1,4,DALEE - оператор тест это проерка если п1=4 то заяка идёт ниже по модели, если п1 не равен 4 то заяка идёт в блок с именем DALEE
0
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 14
26.11.2013, 07:45  [ТС]
Вообщем собрал я код на основе сообщений выше,вроде всё правильно,всё по логике...а нет,ошибку выдает:
11/26/13 06:43:00 Model Translation Begun.
11/26/13 06:43:00 Ready.
11/26/13 06:43:00 Simulation in Progress.
11/26/13 06:43:00 Error Stop.
11/26/13 06:43:00 Halt. XN: 1. Block 1 Next.
11/26/13 06:43:00 Clock:2.494248. Next: GENERATE. Line 4.
11/26/13 06:43:00 GENERATE (Exponential(1,0,10)) ;генерация заявок через интервалы времени,распределенные по эксп. закону
11/26/13 06:43:00 Invalid attempt to enter a GENERATE Block.

Соответственно сам код ниже,как есть:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
tipe FUNCTION RN1,D4
0.35,1/0.65,2/0.95,3/1,4
 
    GENERATE    (Exponential(1,0,10))       ;генерация заявок через интервалы времени,распределенные по эксп. закону
 
    ASSIGN  1,FN$tipe           ;записываем в первый параметр заявки его тип
    SAVEVALUE 2+,1          ;счетчик кол-во заявок,значение в переменной 2 увелич. на 1
    TEST E  P1,4,S1_device          ;если пришла заявка с типом 4,то идем далее,если нет,то переходим в метку S1_device
    SAVEVALUE 2-,1          ;счетчик кол-во заявок,значение в переменной 2 уменьш.на 1(убираем из счетчика управл. заявку)
    SAVEVALUE 1,1           ;заносим в переменную 1,значение 1 (флаг) о том,что управляющая заявка пришла
    
    TEST E  X2,0            ;если количество заявок равно 0,то выпускаем управляющую заявку
    TRANSFER ,TERM          ;управляющая заявка идет на выход
    SAVEVALUE   1,0         ;возвращаем флаг в ноль,для перехода в нормальный режим работы
S1_device   TEST NE X1,1,LOSS           ;если есть управляющая заявка в системе,то теряем новые заявки
    QUEUE   OCH1            ;Вход заявки в очередь OCH1
    SEIZE   DEVICE_1            ;Проверка занятости устройства DEVICE_1
    DEPART  OCH1            ;Выход заявки из очереди OCH1
    SAVEVALUE 2+,1          ;счетчик кол-во заявок,значение в переменной 2 увелич. на 1
    ADVANCE 1.2,0.5         ;Задержка времени на обслуживание,распред. по норм. закону
    RELEASE DEVICE_1            ;Освобождения устройства DEVICE_1
    TRANSFER    ,FN$tipe            ;Переход по типу заявки
 
1   TRANSFER    .5,2,3          ;переход с вероятностью 50% в метку 2 или в метку 3
 
2   QUEUE   OCH2            ;Вход заявки в очередь OCH2
    SEIZE   DEVICE_2            ;Проверка занятости устройства DEVICE_2
    DEPART  OCH2            ;Выход заявки из очереди OCH2
    ADVANCE (Exponential(1,0,0.28))     ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_2            ;Освобождения устройства DEVICE_2
    TRANSFER    ,S4_device          ;Переход в метку S4_device
 
3   QUEUE   OCH3            ;Вход заявки в очередь OCH3
    SEIZE   DEVICE_3            ;Проверка занятости устройства DEVICE_3
    DEPART  OCH3            ;Выход заявки из очереди OCH3
    ADVANCE (Exponential(1,0.33,0.4))   ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_3            ;Освобождения устройства DEVICE_3
    TRANSFER    ,S4_device          ;переход в метку S4_device
 
4   TRANSFER    ,TERM           ;потом удалю
 
S4_device   QUEUE   OCH4            ;Вход заявки в очередь OCH4
    SEIZE   DEVICE_4            ;Проверка занятости устройства DEVICE_4
    DEPART  OCH4            ;Выход заявки из очереди OCH4
    ADVANCE (Exponential(1,0,0.66))     ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_4            ;Освобождения устройства DEVICE_4
    TEST NE X1,1,TERM           ;если в системе присутсвует,управ. заявка,то переходим в метку TERM(выход из системы)
    TRANSFER    ,S1_device          ;переход в метку S1_device (образуем/замыкаем цикл)
 
TERM    SAVEVALUE 2-,1          ;при выходе из системы уменьшаем значения счетчика на еденицу
    TERMINATE 1         ;выход 1-ой заявки из системы
    
    
LOSS    TERMINATE 1         ;метка выхода для учета потерянных заявок
 
START 100
Помогите преобразовать к рабочему коду.
0
 Аватар для Dukalys
1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
26.11.2013, 08:15
11/26/13 06:43:00 GENERATE (Exponential(1,0,10))
Нельзя пихать заявки В блок GENERATE, у этого блока нет хода тока выход.

Делаете это вы например здесь
TRANSFER ,FN$tipe ;Переход по типу заявки
Если значение функции = 1 то вы как раз перенаправляете текущую заявку в блок с номером 1 т.е. GENERATE

Также мне не нравится, что вы везде так делаете, не только с первым блоком
TRANSFER .5,2,3 ;переход с вероятностью 50% в метку 2 или в метку 3
Переименуйте метки в текстовый формат и юзайте их, с номерами TRANSFER походу не прокатит.
1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 14
26.11.2013, 14:43  [ТС]
Спасибо,помогло поменял в функции распределения с цифровых меток на текстовые и все заработало.
Хотя проще сказать,оно стало компилироваться,но работает пока не так,как надо.
Почему то в LOSS(метка куда уходят заявки,когда в системе находится управляющая заявка т.е. куда уходят заявки которые мы "теряем") 992 из 1000 заявок,а в TERM(нормальный режим) всего 4 заявки
Как исправить эту проблему?
Исправленный код:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
tipe FUNCTION RN1,D4
0.35,SS1/0.65,SS2/0.95,SS3/1,SS4
 
    GENERATE    (Exponential(1,0,10))       ;генерация заявок через интервалы времени,распределенные по эксп. закону
 
    ASSIGN  1,FN$tipe           ;записываем в первый параметр заявки его тип
    SAVEVALUE 2+,1          ;счетчик кол-во заявок,значение в переменной 2 увелич. на 1
    TEST E  P1,SS4,S1_device            ;если пришла заявка с типом 4,то идем далее,если нет,то переходим в метку S1_device
    SAVEVALUE 2-,1          ;счетчик кол-во заявок,значение в переменной 2 уменьш.на 1(убираем из счетчика управл. заявку)
    SAVEVALUE 1,1           ;заносим в переменную 1,значение 1 (флаг) о том,что управляющая заявка пришла
    
    TEST E  X2,0            ;если количество заявок равно 0,то выпускаем управляющую заявку
    TRANSFER ,TERM          ;управляющая заявка идет на выход
    SAVEVALUE   1,0         ;возвращаем флаг в ноль,для перехода в нормальный режим работы
S1_device   TEST NE X1,1,LOSS           ;если есть управляющая заявка в системе,то теряем новые заявки
    QUEUE   OCH1            ;Вход заявки в очередь OCH1
    SEIZE   DEVICE_1            ;Проверка занятости устройства DEVICE_1
    DEPART  OCH1            ;Выход заявки из очереди OCH1
    SAVEVALUE 2+,1          ;счетчик кол-во заявок,значение в переменной 2 увелич. на 1
    ADVANCE 1.2,0.5         ;Задержка времени на обслуживание,распред. по норм. закону
    RELEASE DEVICE_1            ;Освобождения устройства DEVICE_1
    TRANSFER    ,FN$tipe            ;Переход по типу заявки
 
SS1 TRANSFER    .5,SS2,SS3          ;переход с вероятностью 50% в метку 2 или в метку 3
 
SS2 QUEUE   OCH2            ;Вход заявки в очередь OCH2
    SEIZE   DEVICE_2            ;Проверка занятости устройства DEVICE_2
    DEPART  OCH2            ;Выход заявки из очереди OCH2
    ADVANCE (Exponential(1,0,0.28))     ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_2            ;Освобождения устройства DEVICE_2
    TRANSFER    ,S4_device          ;Переход в метку S4_device
 
SS3 QUEUE   OCH3            ;Вход заявки в очередь OCH3
    SEIZE   DEVICE_3            ;Проверка занятости устройства DEVICE_3
    DEPART  OCH3            ;Выход заявки из очереди OCH3
    ADVANCE (Exponential(1,0.33,0.4))   ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_3            ;Освобождения устройства DEVICE_3
    TRANSFER    ,S4_device          ;переход в метку S4_device
 
SS4 TRANSFER    ,TERM           ;потом удалю
 
S4_device   QUEUE   OCH4            ;Вход заявки в очередь OCH4
    SEIZE   DEVICE_4            ;Проверка занятости устройства DEVICE_4
    DEPART  OCH4            ;Выход заявки из очереди OCH4
    ADVANCE (Exponential(1,0,0.66))     ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_4            ;Освобождения устройства DEVICE_4
    TEST NE X1,1,TERM           ;если в системе присутсвует,управ. заявка,то переходим в метку TERM(выход из системы)
    TRANSFER    ,S1_device          ;переход в метку S1_device (образуем/замыкаем цикл)
 
TERM    SAVEVALUE 2-,1          ;при выходе из системы уменьшаем значения счетчика на еденицу
    TERMINATE 1         ;выход 1-ой заявки из системы
    
    
LOSS    TERMINATE 1         ;метка выхода для учета потерянных заявок
 
START 100
0
 Аватар для Dukalys
1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
26.11.2013, 23:32
Гляну вечерком.

Добавлено через 7 часов 50 минут
TRANSFER ,TERM ;управляющая заявка идет на выход
SAVEVALUE 1,0 ;возвращаем флаг в ноль,для перехода в нормальный режим работы
S1_device TEST NE X1,1,LOSS ;если есть управляющая заявка в системе,то теряем новые заявки
Средняя строка не достижима заявкой - это так и надо?

Добавлено через 6 минут
ДА критично, получается что первые несколько - может 6 заявок проходят на выход, потом поступает в систему управляющая = происходит Х1=1, а Х1=0 НИКОГДА больше не выполниться потомучто эта инструкция недостижима .
думайте куда переместить строчку Х1=0.
0
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 14
27.11.2013, 00:19  [ТС]
Цитата Сообщение от Dukalys Посмотреть сообщение
Средняя строка не достижима заявкой - это так и надо?
Добавлено через 6 минут
ДА критично, получается что первые несколько - может 6 заявок проходят на выход, потом поступает в систему управляющая = происходит Х1=1, а Х1=0 НИКОГДА больше не выполниться потомучто эта инструкция недостижима .
думайте куда переместить строчку Х1=0.
Переставил её в метку выхода управляющей заявки ничего особо не поменялось,проверил программу по шагам и ошибка в том,что все заявки на проверке
Цитата Сообщение от Stiksol Посмотреть сообщение
TEST NE X1,1,LOSS * * * * * ;если есть управляющая заявка в системе,то теряем новые заявки
уходят в LOSS
что в ней не так?
0
 Аватар для Dukalys
1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
27.11.2013, 10:29
код скиньте что куда переставили?
0
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 14
27.11.2013, 12:49  [ТС]
Ещё немного переделал,завел 2 глобальный переменные на флаг(FLAG) и количество(KOL)
Программа запускается,но опять же из 1000 заявок 994 уходит в LOSS (потерянные заявки)
Код:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
tipe FUNCTION RN1,D4
0.35,SS1/0.65,SS2/0.95,SS3/1,SS4
INITIAL X$KOL,0 
INITIAL X$FLAG,0
    GENERATE (Exponential(1,0,10))      ;генерация заявок через интервалы времени,распределенные по эксп. закону
    ASSIGN 1,FN$tipe            ;записываем в первый параметр заявки его тип
    SAVEVALUE KOL+,1            ;счетчик кол-во заявок,значение в переменной 2 увелич. на 1
    TEST NE X$FLAG,1,LOSS           ;если есть управляющая заявка в системе,то теряем новые заявки
    TEST E P1,SS4,S1_device         ;если пришла заявка с типом 4,то идем далее,если нет,то переходим в метку S1_device
    SAVEVALUE KOL-,1            ;счетчик кол-во заявок,значение в переменной 2 уменьш.на 1(убираем из счетчика управл. заявку)
    SAVEVALUE FLAG,1            ;заносим в переменную 1,значение 1 (флаг) о том,что управляющая заявка пришла
    
    TEST E X$KOL,0          ;если количество заявок равно 0,то выпускаем управляющую заявку
    SAVEVALUE   FLAG,0          ;возвращаем флаг в ноль,для перехода в нормальный режим работы
    TRANSFER ,OUT           ;управляющая заявка идет на выход
S1_device   QUEUE   OCH1            ;Вход заявки в очередь OCH1
    SEIZE   DEVICE_1            ;Проверка занятости устройства DEVICE_1
    DEPART  OCH1            ;Выход заявки из очеред``и OCH1
    ADVANCE 1.2,0.5         ;Задержка времени на обслуживание,распред. по норм. закону
    RELEASE DEVICE_1            ;Освобождения устройства DEVICE_1
    TRANSFER    ,FN$tipe            ;Переход по типу заявки
 
SS1 TRANSFER    .5,SS2,SS3          ;переход с вероятностью 50% в метку 2 или в метку 3
 
SS2 QUEUE   OCH2            ;Вход заявки в очередь OCH2
    SEIZE   DEVICE_2            ;Проверка занятости устройства DEVICE_2
    DEPART  OCH2            ;Выход заявки из очереди OCH2
    ADVANCE (Exponential(1,0,0.28))     ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_2            ;Освобождения устройства DEVICE_2
    TRANSFER    ,S4_device          ;Переход в метку S4_device
 
SS3 QUEUE   OCH3            ;Вход заявки в очередь OCH3
    SEIZE   DEVICE_3            ;Проверка занятости устройства DEVICE_3
    DEPART  OCH3            ;Выход заявки из очереди OCH3
    ADVANCE (Exponential(1,0.33,0.4))   ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_3            ;Освобождения устройства DEVICE_3
    TRANSFER    ,S4_device          ;переход в метку S4_device
 
SS4 TRANSFER    ,OUT            ;потом удалю
 
S4_device   QUEUE   OCH4            ;Вход заявки в очередь OCH4
    SEIZE   DEVICE_4            ;Проверка занятости устройства DEVICE_4
    DEPART  OCH4            ;Выход заявки из очереди OCH4
    ADVANCE (Exponential(1,0,0.66))     ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_4            ;Освобождения устройства DEVICE_4
    TEST E  X$FLAG,1,S1_device          ;если в системе присутсвует,управ. заявка,то переходим в метку TERM(выход из системы)
    TRANSFER    ,TERM           ;переход в метку S1_device (образуем/замыкаем цикл)
 
TERM    SAVEVALUE KOL-,1            ;при выходе из системы уменьшаем значения счетчика на еденицу
    TERMINATE 1         ;выход 1-ой заявки из системы
    
    
LOSS    SAVEVALUE KOL-,1
    TERMINATE 1         ;метка выхода для учета потерянных заявок
 
OUT TERMINATE   1                       ;выход управл. заявок
 
START 1000
Вот,что выдает программа запущенные в режиме Ctrl+alt+1 (по шагам):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
11/27/13 11:44:25  STEP 1
11/27/13 11:44:25  Simulation in Progress. 
11/27/13 11:44:25  Halt. XN: 1002. Block 2 Next. 
11/27/13 11:44:25    Clock:9834.045625. Next: ASSIGN. Line 6. 
11/27/13 11:44:25   ASSIGN 1,FN$tipe            ;записываем в первый параметр заявки его тип
11/27/13 11:44:25  STEP 1
11/27/13 11:44:25  Simulation in Progress. 
11/27/13 11:44:25  Halt. XN: 1002. Block 3 Next. 
11/27/13 11:44:25    Clock:9834.045625. Next: SAVEVALUE. Line 7. 
11/27/13 11:44:25   SAVEVALUE KOL+,1            ;счетчик кол-во заявок,значение в переменной 2 увелич. на 1
11/27/13 11:44:26  STEP 1
11/27/13 11:44:26  Simulation in Progress. 
11/27/13 11:44:26  Halt. XN: 1002. Block 4 Next. 
11/27/13 11:44:26    Clock:9834.045625. Next: TEST. Line 8. 
11/27/13 11:44:26   TEST NE X$FLAG,1,LOSS           ;если есть управляющая заявка в системе,то теряем новые заявки
11/27/13 11:44:26  STEP 1
11/27/13 11:44:26  Simulation in Progress. 
11/27/13 11:44:26  Halt. XN: 1002. Block 40 Next. 
11/27/13 11:44:26    Clock:9834.045625. Next: SAVEVALUE. Line 53. 
11/27/13 11:44:26  LOSS SAVEVALUE KOL-,1
11/27/13 11:44:26  STEP 1
11/27/13 11:44:26  Simulation in Progress. 
11/27/13 11:44:26  Halt. XN: 1002. Block 41 Next. 
11/27/13 11:44:26    Clock:9834.045625. Next: TERMINATE. Line 54. 
11/27/13 11:44:26   TERMINATE 1         ;метка выхода для учета потерянных заявок
11/27/13 11:44:28  STEP 1
11/27/13 11:44:28  Simulation in Progress. 
11/27/13 11:44:28  Halt. XN: 9. Block 8 Next. 
11/27/13 11:44:28    Clock:9834.045625. Next: TEST. Line 13. 
11/27/13 11:44:28   TEST E X$KOL,0          ;если количество заявок равно 0,то выпускаем управляющую заявку
11/27/13 11:44:58  STEP 1
11/27/13 11:44:58  Simulation in Progress. 
11/27/13 11:44:58  Halt. XN: 1003. Block 2 Next. 
11/27/13 11:44:58    Clock:9834.541678. Next: ASSIGN. Line 6. 
11/27/13 11:44:58   ASSIGN 1,FN$tipe            ;записываем в первый параметр заявки его тип
Как видно,проверка срабатывает,как будто флаг равен 1 и заявка идет сразу в LOSS,хотя мы его вначале инициируем с нулем,а потом того,как это заявка уходит вообще срабатывает ТЕST, вообще не пойму почему так...
0
 Аватар для Dukalys
1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
27.11.2013, 13:59
Вот, наверно комментарий верный
SS4 TRANSFER ,OUT ;потом удалю
KOL-,1 то для них не делали, таким образом в системе минимальное KOL=4 было
1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 14
27.11.2013, 15:47  [ТС]
Добавил SAVEVALUE KOL-,1 в метку выхода OUT
количество заявок в LOSS уменьшилось с 992 до 974,но в целом картину не поменяло
0
 Аватар для Dukalys
1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
27.11.2013, 15:58
УДАЛЯЙТЕ OUT

Приводите во всей программе название к 1 названию например SS4 (S4_device ....)
1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 14
27.11.2013, 16:30  [ТС]
Спасибо помогло,удалил OUT в цикле,но сам выход оставил для выхода управляющей заявки без снижения количества заявок в системе (чтобы не было отрицательного значения). Теперь из 1000 заявки: 849 успешно,108 потерянных и 43 управляющих,думаю так и должно быть,спасибо)
0
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 14
09.12.2013, 20:11  [ТС]
Надо реализовать 2 модификации программы из этой темы:
- Определение, на 100 прогонах среднее время эксплуатации систему до первого запуска режима удаления заявок, среднеквадратичное отклонение этого время;
- Определение коэффициентов использования каждого устройства и каждой очереди по каждому типу заявок;
Вот,может подкинет кто идейку,как это сделать? В первом случае я пробовал поставить MARK 4 в самом начале кода,после GENERATE и мне узнать время,когда придет заявка SS4, я вставлял почти сразу MARK 5,одно от другого отменял,но что-то всё время нули или я что не так делаю...
А по-второй модификации коэф. использования устройства это ладно,стандартно в репорте есть. А вот каждой очереди по каждому типу заявки--это как?
Сообственно сам код:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
*****БЛОК ЗАДАНИЯ ТАБЛИЦ, ФУНКЦИЙ, ЯЧЕЕК И НАКОПИТЕЛЯ*****
GIST_SS1    TABLE   (M1),0,30,20        ;Таблица регистрации времени пребывания заявок типа А в системе
GIST_SS2    TABLE   (M1),0,75,18        ;Таблица регистрации времени пребывания заявок типа В в системе
GIST_SS3    TABLE   (M1),0,75,18        ;Таблица регистрации времени пребывания заявок типа С в системе
GIST_SS4    TABLE   (M1),0,10,16        ;Таблица регистрации времени пребывания заявок типа D в системе
 
 
GIST_OCH1   QTABLE  OCH1,0,10,18        ;Таблица регистрации времени пребывания заявок в очереди О1
GIST_OCH2   QTABLE  OCH2,0,1,10     ;Таблица регистрации времени пребывания заявок в очереди О2
GIST_OCH3   QTABLE  OCH3,0,1,10     ;Таблица регистрации времени пребывания заявок в очереди О3
GIST_OCH4   QTABLE  OCH4,0,2,10     ;Таблица регистрации времени пребывания заявок в очереди О5
 
*****БЛОК ГЕНЕРАЦИИ ЗАЯВОК И ОБЬЯВЛЕНИЯ ПЕРЕМЕННЫХ*****
tipe FUNCTION RN1,D4            ;Функция распределения 4 виов заявок с вероятностьями появления от 0 до 1
0.35,SS1/0.65,SS2/0.95,SS3/1,SS4            ;вероятности пояления заявки и метки перехода
INITIAL X$KOL,0             ;иницилизация переменной в которой сохраняем количество заявок в системе
INITIAL X$FLAG,0                ;иницилизация переменной флага: 1-управ. заявка в системе,0-не в системе
 
    GENERATE (Exponential(1,0,10))      ;генерация заявок через интервалы времени,распределенные по эксп. закону
    ASSIGN  1,FN$tipe           ;записываем в первый параметр заявки его тип
    ASSIGN  2,0                             ;обнуляем второй параметр заявок
    SAVEVALUE KOL+,1            ;счетчик кол-во заявок,значение в переменной 2 увелич. на 1
    TEST NE X$FLAG,1,LOSS           ;если есть управляющая заявка в системе,то теряем новые заявки
    TEST E P1,SS4,S1_device         ;если пришла заявка с типом 4,то идем далее,если нет,то переходим в метку S1_device
    SAVEVALUE KOL-,1            ;счетчик кол-во заявок,значение в переменной 2 уменьш.на 1(убираем из счетчика управл. заявку)
    SAVEVALUE FLAG,1            ;заносим в переменную 1,значение 1 (флаг) о том,что управляющая заявка пришла
    TRANSFER ,S1_device         ;вход управл. заявки в устройство S1
 
*****БЛОК ОБРАБОТКИ В УСТРОЙСТВЕ S1*****
S1_device   QUEUE   OCH1        ;Вход заявки в очередь OCH1
    SEIZE   DEVICE_1            ;Проверка занятости устройства DEVICE_1
    DEPART  OCH1            ;Выход заявки из очеред``и OCH1
    TEST E  P1,SS4,S1_CONTIN            ;если это не управляющая заявка переход в метку S1_CONTIN,иначе далее
    TEST E  X$KOL,0         ;висит урпавляющая заявка пока количество заявок в системе не будет равно 0
    SAVEVALUE   FLAG,0          ;устанавливаем нормальный режим работы
    TRANSFER    ,OUT            ;управляющая заявка идет на выход
S1_CONTIN   ADVANCE 1.2,0.5         ;Задержка времени на обслуживание,распред. по норм. закону
    RELEASE DEVICE_1            ;Освобождения устройства DEVICE_1
    TRANSFER    ,FN$tipe            ;Переход по типу заявки
 
SS1 TRANSFER    .5,PREO_2,PREO_3            ;переход с вероятностью 50% в метку 2 или в метку 3
 
PREO_2  ASSIGN  1,SS2           ;заявки первого типа преобразуем к заявкам второго типа
    ASSIGN  2,1         ;во 2 параметр записываем 1,что означает,что раньше заявка была 1 типа
    TRANSFER    ,SS2            ;переход в обслуживание на второе устройство
 
PREO_3  ASSIGN  1,SS3           ;заявки первого типа преобразуем к заявкам третьего типа
    ASSIGN  2,1         ;во 2 параметр записываем 1,что означает,что раньше заявка была 1 типа
    TRANSFER    ,SS3            ;переход в обслуживание на третье устройство
 
*****БЛОК ОБРАБОТКИ В УСТРОЙСТВЕ S2*****
SS2 QUEUE   OCH2            ;Вход заявки в очередь OCH2
    SEIZE   DEVICE_2            ;Проверка занятости устройства DEVICE_2
    DEPART  OCH2            ;Выход заявки из очереди OCH2
    ADVANCE (Exponential(1,0,0.28))     ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_2            ;Освобождения устройства DEVICE_2
    TRANSFER    ,SS4            ;Переход в метку SS4
 
*****БЛОК ОБРАБОТКИ В УСТРОЙСТВЕ S3*****
SS3 QUEUE   OCH3            ;Вход заявки в очередь OCH3
    SEIZE   DEVICE_3            ;Проверка занятости устройства DEVICE_3
    DEPART  OCH3            ;Выход заявки из очереди OCH3
    ADVANCE (Exponential(1,0.33,0.4))   ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_3            ;Освобождения устройства DEVICE_3
    TRANSFER    ,SS4            ;переход в метку SS4
 
*****БЛОК ОБРАБОТКИ В УСТРОЙСТВЕ S2*****
SS4 TEST NE P2,1,SS4_CON            ;если 2-ой параметр равен 1,то это была заявка первого типа
    ASSIGN  1,SS1
SS4_CON QUEUE   OCH4            ;Вход заявки в очередь OCH4
    SEIZE   DEVICE_4            ;Проверка занятости устройства DEVICE_4
    DEPART  OCH4            ;Выход заявки из очереди OCH4
    ADVANCE (Exponential(1,0,0.66))     ;Задержка времени на обслуживание,распред. по эксп. закону
    RELEASE DEVICE_4            ;Освобождения устройства DEVICE_4
    TEST E  X$FLAG,1,S1_device      ;если в системе присутсвует,управ. заявка,то идем дальше иначе переход в метку S1_device (образуем/замыкаем цикл)
    TRANSFER    ,TERM           ;переход в метку TERM (выход заявки из цикла)
 
*****БЛОК ВЫХОДА ЗАЯВОК ИЗ СИСТЕМЫ*****
TERM    TEST E P1,SS1,CHECK         ;проверка на принадлежность заявки к первому типу
    TABULATE GIST_SS1           ;регистрация времени пребывания в таблицу GIST_SS1 заявки первого тип
    SAVEVALUE KOL-,1            ;при выходе заявки из системы уменьшаем значения счетчика на еденицу
    TERMINATE 1         ;выход  заявки из системы
    
CHECK   TEST E P1,SS2,CHECK_C           ;проверка на принадлежность заявки ко второму типу
    TABULATE GIST_SS2           ;регистрация времени пребывания в таблицу GIST_SS2 заявки второго типа
    SAVEVALUE KOL-,1            ;при выходе заявки из системы уменьшаем значения счетчика на еденицу
    TERMINATE   1           ;выход заявки из системы
 
CHECK_C TABULATE GIST_SS3           ;регистрация времени пребывания в таблицу GIST_SS3 заявки третьего типа
    SAVEVALUE KOL-,1            ;при выходе заявки из системы уменьшаем значения счетчика на еденицу
    TERMINATE   1           ;выход заявки из системы
 
 
LOSS    SAVEVALUE KOL-,1            ;при выходе заявки из системы уменьшаем значения счетчика на еденицу
    TERMINATE 1         ;метка выхода для учета потерянных заявок
 
OUT RELEASE DEVICE_1            ;Освобождения устройства DEVICE_1
    TABULATE GIST_SS4           ;регистрация времени пребывания в таблицу GIST_SS4 заявки четвертого типа
    TERMINATE   1           ;метка выхода управляющей заявки
 
 
START 100                   ;выполнение одного цикла моделирования длиной в 10 часов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.12.2013, 20:11
Помогаю со студенческими работами здесь

(Моделирование системы массового обслуживания с параллельными каналами обслуживания с повторами)
Помогите написать программу Рассмотрим систему массового обслуживания с заданным числом устройств...

Система массового обслуживания с параллельными каналами обслуживания с повторами
Всем доброго времени суток. Прошу вашей помощи в следующей задаче (Нет, не очередной ловец халявы:...

Обслуживания неоднородного потока заявок с ограничением очередей обслуживания
На вход СМО поступает поток заявок 2-х типов, с вероятностями поступления 0,7 и 0,3 соответственно....

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru