
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (54) « Первая ... 12 13 [14] 15 16 ... 53 54 ( Перейти к последнему сообщению ) |
Сообщ.
#196
,
|
|
|
Все верно. SELECT'тами выбираешь очередь минимальной длинны и занимаешь ее, несмотря на то что до 8 касс могут
быть в этот момент свободними. Самый простой случай: обслуживается только 1 покупатель у 1ой кассы. Приходит второй, SELECT проверяет очереди - все пустые, и выбирает первую попавшуюся очередь минимальной длинны. Эта очередь к первой кассе. И того, на 1ой кассе обслуживается покупатель и второй - ждет в очереди в эту же кассу и т.п. Решение здесь GPSS задача (сообщение #2181443) ![]() ![]() 1 SELECT MIN Xque,Check_1,Check_N,,F 2 TEST E F$Xque,1,met1 3 SELECT MIN Xque,Check_1,Check_N,,Q ; выбирает кассу с минимальной очередью 4 met1 QUEUE P$Xque 5 SEIZE P$Xque 6 DEPART P$Xque 7 ADVANCE V$Cashier 8 RELEASE P$Xque 9 LEAVE P$Container 10 TRANSFER ,go 11 Norm SELECT MIN Xque,Checkout_1,Checkout_N,,F 12 TEST E F$Xque,1,met2 13 SELECT MIN Minque,Checkout_1,Checkout_N,,Q ; выбирает кассу с минимальной очередью 14 met2 QUEUE P$Minque 15 SEIZE P$Minque 16 DEPART P$Minque 17 ADVANCE V$Cashier 18 RELEASE P$Minque 19 LEAVE P$Container 1-2,11-12 есть ли свободные кассы 1 проверка параметра F$ каждого из устройств Check_1 - Check_N. В параметр P$Xque записывается номер устройства с мин F$. 2 проверка на занятость выбранного устройства. Не занято - переход на метку met1. Занято, - и только в этом случает выбор минимальной очереди. F$ -занятость устройства. 1 - занято, 0 - не занято |
Сообщ.
#197
,
|
|
|
ой, и правда ведь! я как-то раньше и не подумала, что нужно учесть занятость устройства
![]() ![]() |
Сообщ.
#198
,
|
|
|
![]() ![]() ![]() 1 TEST LE P$Qty_purchases,10,QCart ; если покупок меньше 10, то он встает в очередь за корзиной, если больше - то за тележкой 2 GATE SNF Basket,QCart 3 QUEUE Basket_Q 4 ENTER Basket 5 DEPART Basket_Q 6 ASSIGN Container,Basket 7 TRANSFER ,Shop 8 QCart QUEUE Cart_Q 9 ENTER Cart 10 DEPART Cart_Q 11 ASSIGN Container,Cart от блоков 3,5 пользы никакой т.к. заранее определяем в блоке 2, что корзины есть, и покупатель никогда не задерживается, чтобы войти в блок 4 т.е. статистика по очереди Basket_Q всегда фиксирует только нулевые входы.. Для случая менее 10 покупок и отсутствия корзин, покупатель проходит в очередь за тежками и остается в ней. Здесь возможна ситуация, нет тележек и есть корзины, и покупать при этом остается ждать телегу. вариант 1 ![]() ![]() 1 TEST LE P$Qty_purchases,10,Qcart30 2 QUEUE Basket_Q 3 TEST NE (R$Basket+R$Cart),0 4 TRANSFER BOTH,,QCart 5 ENTER Basket 6 DEPART Basket_Q 7 ASSIGN Container,Basket 8 TRANSFER ,Shop 9 QCart ENTER Cart 10 DEPART Basket_Q 11 ASSIGN Container,Cart 12 TRANSFER ,Shop 13 Qcart30 QUEUE Cart_Q 14 ENTER Cart 15 DEPART Cart_Q 16 ASSIGN Container,Cart 17 Shop.. Действия покупателей: если покупок <= 10 - берем карзину, если корзин нет берез тележку, иначе ожидаем корзину/телегу; если покупок > 10 - берем телегу. функционирование очередей: очередь Basket_Q - выделена для ожидающих корзины, назначение фиксировать время ожидания корзины/телеги; очередь Cart_Q - выделена только для ожидающих тележки. 1 разделяем покупателей на тех кому нужны корзины и тележки 13-16 только для тех кому нужны тележки 2 встать в очередь за корзиной/тележкой 3 если ((R$Basket + R$Cart) !=0) пройти вниз, иначе продолжать проверять то условие. R - число свободные ед. памяти 4 пройти вниз или на метку QCart, туда где есть свободные корзины или тележки, сначале проверяестя наличие корзин, затем телег 5-6,9-10 занятие Basket/Cart, выход из очереди Basket_Q вариант 2(оптимизация кода, не более) Для организации очередей использовать блоки LINK/UNLINK, причина: убрать проверку TEST NE (R$Basket+R$Cart),0 - проверка выполняется для каждого транзакта после измененния модельного времени на 0.000001 |
Сообщ.
#199
,
|
|
|
Цитата Eugen @ ![]() ![]() 1 SELECT MIN Xque,Check_1,Check_N,,F 2 TEST E F$Xque,1,met1 3 SELECT MIN Xque,Check_1,Check_N,,Q ; выбирает кассу с минимальной очередью 4 met1 QUEUE P$Xque 5 SEIZE P$Xque 6 DEPART P$Xque 7 ADVANCE V$Cashier 8 RELEASE P$Xque 9 LEAVE P$Container 10 TRANSFER ,go 11 Norm SELECT MIN Xque,Checkout_1,Checkout_N,,F 12 TEST E F$Xque,1,met2 13 SELECT MIN Minque,Checkout_1,Checkout_N,,Q ; выбирает кассу с минимальной очередью 14 met2 QUEUE P$Minque 15 SEIZE P$Minque 16 DEPART P$Minque 17 ADVANCE V$Cashier 18 RELEASE P$Minque 19 LEAVE P$Container 1-2,11-12 есть ли свободные кассы 1 проверка параметра F$ каждого из устройств Check_1 - Check_N. В параметр P$Xque записывается номер устройства с мин F$. 2 проверка на занятость выбранного устройства. Не занято - переход на метку met1. Занято, - и только в этом случает выбор минимальной очереди. F$ -занятость устройства. 1 - занято, 0 - не занято насчет очередей за корзинами и телегами, это действиетльно хорошая мысль, потому что я уже заметила, что код неоптимальный получился! а вот насчет предыдущей темы про выбор очередей, я всю логику отлично поняла. более того, задачку про коммутаторы я в свое время решала даже ))) только другим способом, но вот сейчас смотрю выходную статистику, и вижу, что транзакты второй select (строка 13) упорно огибают: 0 входов.... ![]() |
Сообщ.
#200
,
|
|
|
MEGERA С 8 марта!
![]() 13 строка выполняется только при отсутствии свобдных касс, т.е. в момент прихода транзакта есть хотя бы одна свободная касса и нет необходимости становиться в очередь. Чтобы проверить правильность кода, увелич интенсивность прихода покупателей в магазин, в строке 13 должны появиться транзакты. |
Сообщ.
#201
,
|
|
|
Спасибо, Eugen!
![]() Я себя с этим кодом ощущаю, как в твоей цитате про изображение трехногой лошади ![]() LABEL LOC BLOCK TYPE ENTRY COUNT CURRENT COUNT RETRY PARKING 1 TRANSFER 1528 0 0 2 ENTER 536 0 0 3 ADVANCE 536 0 0 ENTRAR 4 ASSIGN 2081 0 0 5 TEST 2081 0 0 6 QUEUE 666 22 0 7 TEST 644 0 0 8 TRANSFER 644 0 0 9 ENTER 644 0 0 10 DEPART 644 0 0 11 ASSIGN 644 0 0 12 TRANSFER 644 0 0 QCART 13 ENTER 0 0 0 14 DEPART 0 0 0 15 ASSIGN 0 0 0 16 TRANSFER 0 0 0 QCART_1 17 QUEUE 1415 326 0 18 ENTER 1089 0 0 19 DEPART 1089 0 0 20 ASSIGN 1089 0 0 SHOP 21 ADVANCE 1733 49 0 22 SELECT 1684 0 0 23 TEST 1684 0 0 24 SELECT 0 0 0 MET9 25 QUEUE 1684 96 0 26 SEIZE 1588 0 0 27 DEPART 1588 0 0 28 ADVANCE 1588 5 0 Видишь, как получается? 96 человек стоит в очереди, но через select (24) они будто и не проходили!!! ![]() |
Сообщ.
#202
,
|
|
|
MEGERA, изображение трехногой лошади - это совсем не о том ) Это про правильно поставленное ТЗ. А у тебя нормальный творческий процесс )
С 8-м Марта тебя =) А где собсно последний вариант кода? я тоже хо посмотреть ) |
Сообщ.
#203
,
|
|
|
Спасибо, TEMENb! В таком случае, моя лошадь была безногой, ибо ТЗ звучит примерно так: "Сделай модель в Арене, по GPSS-модели, которая взялась, х.з. откуда, и х.з., правильно ли работает"
![]() Checkout_1 EQU 1 Checkout_N EQU 5 ; есть 5 очередей N_Purchases VARIABLE Uniform(1,0,30) ;количество покупок, которые покупатель собирается совершить Basket STORAGE 50 ; 50 корзин Cart STORAGE 100 ; 100 тележек Park STORAGE 40 ; 40 парковочных мест Cashier VARIABLE (P$Qty_purchases#0.05)+ 0.7 ; время обслуживания на кассе Time_shop VARIABLE P$Qty_purchases#1.3 ; время, проведенное в магазине за выбором товаров Parking TRANSFER Both,,Lost ENTER Park ; покупатель занимает место на парковке ADVANCE 1,0.7 ; идет от машины к магазину Entrar ASSIGN Qty_purchases,V$N_Purchases ; ему назначается количество покупок, которые он собирается совершить TEST LE P$Qty_purchases,10,QCart_1 ; если покупок больше 10, то покупатель идет в очередь за карзинами QCart_1 QUEUE Basket_Q ; если меньше 10, то ему нужна корзина, но он может взять и телегу, поэтому он ждет TEST NE (R$Basket+R$Cart),0 ; пока что-нибудь из них не освободится TRANSFER BOTH,,QCart ; сначалы пытается взять корзину. если их нет, идет за телегой QCart ENTER Basket DEPART Basket_Q ASSIGN Container,Basket TRANSFER ,Shop QCart ENTER Cart DEPART Basket_Q ASSIGN Container,Cart TRANSFER ,Shop QCart_1 QUEUE Cart_Q ENTER Cart DEPART Cart_Q ASSIGN Container,Cart Shop ADVANCE V$Time_shop ; выбирает товары SELECT MIN Minque,Checkout_1,Checkout_N,,F ;проверяет есть ли свободная касса TEST E F$Minque,1,met9 ; если есть - занимает ее SELECT MIN Minque,Checkout_1,Checkout_N,,Q ; если нет, ищет кассу с наименьшей очередью met9 QUEUE P$Minque SEIZE P$Minque DEPART P$Minque ADVANCE V$Cashier RELEASE P$Minque LEAVE P$Container TEST E P$Transport,2,Fin LEAVE Park Fin TERMINATE Lost TERMINATE ***************************************************************************** generate ,,,1 met1 advance (Exponential(1,0,60/40)) split 1,ent test g ac1,(3#60),met1 met2 advance (Exponential(1,0,60/80)) split 1,ent test g ac1,(6#60),met2 met3 advance (Exponential(1,0,60/175)) split 1,ent test g ac1,(9#60),met3 met4 advance (Exponential(1,0,60/225)) split 1,ent test g ac1,(12#60),met4 TERMINATE ent ASSIGN Transport,1 TRANSFER ,Entrar generate ,,,1 met5 advance (Exponential(1,0,60/40)) split 1,ent1 test g ac1,(3#60),met5 met6 advance (Exponential(1,0,60/80)) split 1,ent1 test g ac1,(6#60),met6 met7 advance (Exponential(1,0,60/175)) split 1,ent1 test g ac1,(9#60),met7 met8 advance (Exponential(1,0,60/225)) split 1,ent1 test g ac1,(12#60),met8 TERMINATE ent1 ASSIGN Transport,2 TRANSFER ,Parking ***************************************************************************** GENERATE (12#60) TERMINATE 1 START 1 Вот такой стала эта горе-модель, благодаря вашим с Евгением советам ))) однако, как ты уже видел выше, есть проблемка, из-за которой я не могу сопоставить результат с ареновским... |
Сообщ.
#204
,
|
|
|
Цитата MEGERA @ Checkout_1 EQU 1 Checkout_N EQU 5 ; есть 5 очередей N_Purchases VARIABLE Uniform(1,0,30) ;количество покупок, которые покупатель собирается совершить Basket STORAGE 50 ; 50 корзин Cart STORAGE 100 ; 100 тележек Park STORAGE 40 ; 40 парковочных мест Cashier VARIABLE (P$Qty_purchases#0.05)+ 0.7 ; время обслуживания на кассе Time_shop VARIABLE P$Qty_purchases#1.3 ; время, проведенное в магазине за выбором товаров Parking TRANSFER Both,,Lost ENTER Park ; покупатель занимает место на парковке ADVANCE 1,0.7 ; идет от машины к магазину Entrar ASSIGN Qty_purchases,V$N_Purchases ; ему назначается количество покупок, которые он собирается совершить TEST LE P$Qty_purchases,10,QCart_1 ; если покупок больше 10, то покупатель идет в очередь за карзинами QCart_1 QUEUE Basket_Q ; если меньше 10, то ему нужна корзина, но он может взять и телегу, поэтому он ждет TEST NE (R$Basket+R$Cart),0 ; пока что-нибудь из них не освободится TRANSFER BOTH,,QCart ; сначалы пытается взять корзину. если их нет, идет за телегой QCart ENTER Basket DEPART Basket_Q ASSIGN Container,Basket TRANSFER ,Shop QCart ENTER Cart DEPART Basket_Q ASSIGN Container,Cart TRANSFER ,Shop QCart_1 QUEUE Cart_Q ENTER Cart DEPART Cart_Q ASSIGN Container,Cart Shop ADVANCE V$Time_shop ; выбирает товары SELECT MIN Minque,Checkout_1,Checkout_N,,F ;проверяет есть ли свободная касса TEST E F*Minque,1,met9 ; если есть - занимает ее SELECT MIN Minque,Checkout_1,Checkout_N,,Q ; если нет, ищет кассу с наименьшей очередью met9 QUEUE P$Minque SEIZE P$Minque DEPART P$Minque ADVANCE V$Cashier RELEASE P$Minque LEAVE P$Container TEST E P$Transport,2,Fin LEAVE Park Fin TERMINATE Lost TERMINATE ***************************************************************************** generate ,,,1 met1 advance (Exponential(1,0,60/40)) split 1,ent test g ac1,(3#60),met1 met2 advance (Exponential(1,0,60/80)) split 1,ent test g ac1,(6#60),met2 met3 advance (Exponential(1,0,60/175)) split 1,ent test g ac1,(9#60),met3 met4 advance (Exponential(1,0,60/225)) split 1,ent test g ac1,(12#60),met4 TERMINATE ent ASSIGN Transport,1 TRANSFER ,Entrar generate ,,,1 met5 advance (Exponential(1,0,60/40)) split 1,ent1 test g ac1,(3#60),met5 met6 advance (Exponential(1,0,60/80)) split 1,ent1 test g ac1,(6#60),met6 met7 advance (Exponential(1,0,60/175)) split 1,ent1 test g ac1,(9#60),met7 met8 advance (Exponential(1,0,60/225)) split 1,ent1 test g ac1,(12#60),met8 TERMINATE ent1 ASSIGN Transport,2 TRANSFER ,Parking ***************************************************************************** GENERATE (12#60) TERMINATE 1 START 1 ![]() Добавлено Остальной код не разбирал. уж очень большой ) А ошибочка - нормальная. совсем не сразу ее заметил ) |
Сообщ.
#205
,
|
|
|
![]() вот здесь ошибка? ![]() SELECT MIN Minque,Checkout_1,Checkout_N,,F ;проверяет есть ли свободная касса TEST E F*Minque,1,met9 ; если есть - занимает ее SELECT MIN Minque,Checkout_1,Checkout_N,,Q ; если нет, ищет кассу с наименьшей очередью met9 QUEUE P$Minque SEIZE P$Minque DEPART P$Minque ADVANCE V$Cashier RELEASE P$Minque LEAVE P$Container |
Сообщ.
#206
,
|
|
|
Цитата MEGERA @ TEST E F*Minque,1,met9 ; если есть - занимает ее * - вот тут ошибка (10-й символ ))) называется ошибка - "косвенная адресация" F$Minque - индикатр занятсти устройства с именем Minque F*Minque - индикатр занятсти устройства, номер которого лежит в параметре транзакта с именем Minque кстати, для таких вещей есть тотал командер с его незаменимой функцией "Файлы->Сравнить по содержимому..." ![]() |
Сообщ.
#207
,
|
|
|
Цитата Eugen @ ![]() ![]() 1 SELECT MIN Xque,Check_1,Check_N,,F 2 TEST E F$Xque,1,met1 3 SELECT MIN Xque,Check_1,Check_N,,Q ; выбирает кассу с минимальной очередью 4 met1 QUEUE P$Xque 5 SEIZE P$Xque 6 DEPART P$Xque 7 ADVANCE V$Cashier 8 RELEASE P$Xque 9 LEAVE P$Container 10 TRANSFER ,go 11 Norm SELECT MIN Xque,Checkout_1,Checkout_N,,F 12 TEST E F$Xque,1,met2 13 SELECT MIN Minque,Checkout_1,Checkout_N,,Q ; выбирает кассу с минимальной очередью 14 met2 QUEUE P$Minque 15 SEIZE P$Minque 16 DEPART P$Minque 17 ADVANCE V$Cashier 18 RELEASE P$Minque 19 LEAVE P$Container точно косвенная адресация стороки 2,11 и 11-12 ![]() ![]() 2 TEST E F*Xque,1,met1 11 Norm SELECT MIN Minque,Checkout_1,Checkout_N,,F 12 TEST E F*Minque,1,met2 |
Сообщ.
#208
,
|
|
|
ого! ничего себе ошибка! я бы еще 3 месяца ее выискивала, точно!
![]() ![]() |
Сообщ.
#209
,
|
|
|
осталось плюсануть "ну, за рыбалку" и "-=За ВДВ...=-"
![]() |
Сообщ.
#210
,
|
|
|
да запросто!
![]() ![]() ![]() |