На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (54) « Первая ... 12 13 [14] 15 16 ...  53 54  ( Перейти к последнему сообщению )  
> GPSS , Вопрос для знающих
    Все верно. SELECT'тами выбираешь очередь минимальной длинны и занимаешь ее, несмотря на то что до 8 касс могут
    быть в этот момент свободними. Самый простой случай: обслуживается только 1 покупатель у 1ой кассы. Приходит второй,
    SELECT проверяет очереди - все пустые, и выбирает первую попавшуюся очередь минимальной длинны. Эта очередь к первой кассе.
    И того, на 1ой кассе обслуживается покупатель и второй - ждет в очереди в эту же кассу и т.п.

    Решение здесь GPSS задача (сообщение #2181443)

    ExpandedWrap disabled
      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 - не занято
      ой, и правда ведь! я как-то раньше и не подумала, что нужно учесть занятость устройства :wall: Евгений, Вы гений! (уж простите за тавтологию) :rolleyes:
        ;)
        ExpandedWrap disabled
          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
        ExpandedWrap disabled
          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
          Цитата Eugen @
          ExpandedWrap disabled
            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 входов.... :huh:
            MEGERA С 8 марта! ;)
            13 строка выполняется только при отсутствии свобдных касс, т.е. в момент прихода транзакта есть хотя бы одна свободная касса и нет необходимости становиться в очередь. Чтобы проверить правильность кода, увелич интенсивность прихода покупателей в магазин, в строке 13 должны появиться транзакты.
              Спасибо, Eugen! :wub:
              Я себя с этим кодом ощущаю, как в твоей цитате про изображение трехногой лошади :yes-sad:
              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) они будто и не проходили!!! :'(
                MEGERA, изображение трехногой лошади - это совсем не о том ) Это про правильно поставленное ТЗ. А у тебя нормальный творческий процесс )

                С 8-м Марта тебя =)

                А где собсно последний вариант кода? я тоже хо посмотреть )
                  Спасибо, TEMENb! В таком случае, моя лошадь была безногой, ибо ТЗ звучит примерно так: "Сделай модель в Арене, по GPSS-модели, которая взялась, х.з. откуда, и х.з., правильно ли работает" :D

                  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

                  Вот такой стала эта горе-модель, благодаря вашим с Евгением советам ))) однако, как ты уже видел выше, есть проблемка, из-за которой я не могу сопоставить результат с ареновским...
                  Сообщение отредактировано: MEGERA -
                    Цитата 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



                    :P

                    Добавлено
                    Остальной код не разбирал. уж очень большой )
                    А ошибочка - нормальная. совсем не сразу ее заметил )
                      :lool: ну ты юморист, ага!
                      вот здесь ошибка? ;)

                      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
                        Цитата MEGERA @
                        TEST E F*Minque,1,met9 ; если есть - занимает ее

                        * - вот тут ошибка (10-й символ )))

                        называется ошибка - "косвенная адресация"

                        F$Minque - индикатр занятсти устройства с именем Minque
                        F*Minque - индикатр занятсти устройства, номер которого лежит в параметре транзакта с именем Minque

                        кстати, для таких вещей есть тотал командер с его незаменимой функцией "Файлы->Сравнить по содержимому..." ;)
                          Цитата Eugen @
                          ExpandedWrap disabled
                            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
                          ExpandedWrap disabled
                            2 TEST E F*Xque,1,met1
                            11 Norm SELECT MIN Minque,Checkout_1,Checkout_N,,F
                            12 TEST E F*Minque,1,met2
                            ого! ничего себе ошибка! я бы еще 3 месяца ее выискивала, точно! :D все исправила, вроде, работает ;)
                              осталось плюсануть "ну, за рыбалку" и "-=За ВДВ...=-" :D
                                да запросто! :D только на рыбалку мы вместе не ходили, и в армию я, слава богу, не призывалась :D :D
                                Сообщение отредактировано: MEGERA -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (54) « Первая ... 12 13 [14] 15 16 ...  53 54


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,2927 ]   [ 15 queries used ]   [ Generated: 18.06.25, 16:05 GMT ]