0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
|
1 | |
Моделирование устройства обслуживания заявок двух типов15.09.2015, 22:39. Показов 18370. Ответов 25
Метки нет Все метки)
(
Так как вопрос касается СМО и дабы не плодить тем , задам его в этой теме. Я не программист и с GPSS никогда не работал, но требуется решить задачу, а разобраться хочется.
Суть задачи такова: На обработку в устройство поступают "заявки" двух типов, они подчинены закону Пуассона. Известны средние значения времени А и времени B заявок. Данные "заявки" поступают в устройство состоящее из трех приборов. Время выполнения "заявок" равномерно распределено на интервалах . Вероятность попасть в интервал (I1,I2) равна Р1, в интервал (I2,I3) равна Р2, в интервал (I3,I4) - Р3 и в интервал (I4,I5) - Р4. Приоритет выполнения заявок с большим потоком - ниже чем у потока с меньшим количеством "заявок". Определить в каком случае количество выполненных "заявок" будет максимально (в случае общей очереди ко всем приборам или же наличия очереди к каждому прибору отдельно). Известно общее время работы - N. Так как хочу разобраться, вопросы буду задавать последовательно. Формирование "заявок" осуществляется блоком выражений GENERATE. А так как изначально известно что формируются они согласно закону Пуассона, соответственно указываем GENERATE (Poisson(A,B,C,D,E)) - я правильно понимаю? Тогда как разграничить формирование заявок различных типов, дважды прописать GENERATE (Poisson(A,B,C,D,E)) ? Если так, то как разграничить заявки по типам? Здесь же еще один вопрос: параметр A - среднее значение интервала времени заявки (это мне известно, А и B соответственно для первого и второго типов "заявок"); параметры В и С я "опускаю" до вида ", ," и перехожу к параметру D - его я могу в принципе задать исходя из общего времени работы, или лучше этого не делать, а завершить программу в конце блоками выражений Код
GENERATE N TERMINATE 1 START1 У меня уже голова закипела за сегодняшний день, как правильно сформировать два типа заявок?
0
|
15.09.2015, 22:39 | |
15.09.2015, 22:39 | |
Ответы с готовыми решениями:
25
Смоделировать работу системы обслуживания заявок двух типов Моделирование одноканальной многофазной системы массового обслуживания с двумя потоками заявок
|
![]() 1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
|
|
16.09.2015, 07:02 | 2 |
Добрый день.
В принципе всё верно понимаете. Можно сделать генерацию 2х типов заявок двумя генераторами GENERATE. При этом даже более, можно программу представить двумя сегментами. Сегмент GENERATE ... TERMINATE и второй такой-же. Как-бы условно-независимые сегменты моделирующие обслуживание. ПО факту они будут связаны процессом обслуживания. Это моделируется просто - путём использования внутри сегмента одних и тех-же названий очередей, обслуживающих устройств. Можно разделять заявки и чуть-чуть посложнее - с помощью индивидуальных параметров заявок ASSIGN. Теперь про GENERATE - структура этого блока GENERATE A,B,C,D,E В поле А указывается время, которое определяет интервал между моментами генерации транзактов блоком GENERATE. При этом в качестве аргумента А вы используете функцию распределения времени POISSON. У функции POISSON свои входные параметры, не имеющие отношения к параметрам GENERATE (Важно не путать!). POISSON(A,B) A - номер генератора случайных чисел от 1 до 8 B - среднее значение интервала времени между входящими заявками По литературе можете вначале просмотреть Кудрявцев Имитационное моделирование на GPSS. Более основательной литературой - по каждому программному блоку - Шрайбер Имитационное моделирование на GPSS.
1
|
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
|
16.09.2015, 13:15 [ТС] | 3 |
Уважаемый Dukalys, спасибо за ответ! Уже понял одну свою ошибку с функцией POISSON. Кудрявцева уже вчера скачал, помогает. Плюс справочное руководство по GPSS WORLD.
Добавлено через 2 часа 23 минуты Наваял "сырой" код для одной очереди и одного устройства. По-моему я слишком усложнил. Теперь не пойму как задать несколько приборов в одному устройстве для обработки очереди. А если это сделать, соответственно аналогичным образом можно сделать несколько очередей, я правильно понимаю? Вот что еще, не совсем пойму работу оператора TRANSFER. В задании суть заключается в том что даны три вероятности времени обслуживания прибором, а четвертый интервал времени обслуживания - это оставшаяся вероятность. Я ее высчитал самостоятельно и вписал в код (выделено жирным цветом) или же ее мне нужно "опустить"?!
0
|
![]() 1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
|
|
16.09.2015, 19:26 | 4 |
Ухх действительно, не самый лучший приём с Transfer !!!
Во первых, проанализируйте пример - разделить поток заявок на 50%, 20% и 30% процентов Как вы запишите трансферы? 2 трансфера первый 50% а второй 20% или 30% Код
TRANSFER 0.5,,metka1 TRANSFER 0.3,,metka2 metka3 ; сюда пойдут по вашему 20%. После первого трансфера отсеено 50% но НИЖЕ на следующий трансфер уже приходит поток который по факту представляет 100% и чтобы выделить из него 30% то выделить нужно из 100, а не из тех 50% что пришли. поэтому TRANSFER 0.6,,metka2 metka3 ; сюда пойдут 0.4 от 100% или 20% реальных. Ладно это всё лирика. Вобщем заменяйте конструкцию с трансферами на функцию FUNCTION которая будет возвращать значение времени обслуживания в зависимости от вероятности Код
vremya FUNCTION RN1,D4 ; по функциям хорошо в Шрайбере написано с примерами 0.37,(UNIFORM(1,40,67))/... /... / ... ADVANCE FN$vremya ; вызываем функцию расчёта времени обслуживания
1
|
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
|
16.09.2015, 19:50 [ТС] | 5 |
Я размышляю как обыватель, но вижу что слишком сложная получается конструкция. Ваше предложение я понял. Я думал что будет приходить 100 процентов на каждый трансфер. По Шрайберу пытался организовать многоканальное устройство чтобы сымитировать те самые три прибора в устройстве. Использовал комбинацию приборов ENTER и LEAVE, предварительно прописал STORAGE как показано в примере. Но после нажатия Create Simulation программа ничего не делала, только лишь две первые строки выводилось что программа запущена.
0
|
![]() 1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
|
|
16.09.2015, 19:58 | 6 |
Это скорее всего значит что программа выполняется. можете перейти при этом в меню Window/Simulation Window/Block Window - увидите что происходит в модели, скорее всего заявки как-то зацикливаются, либо тупо накапливаются (пример устройства были заняты, и не освобождены при выходе заявок, или например устройства не справляются с потоком заявок и происходит накопления большого числа заявок).
1
|
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
|
16.09.2015, 20:02 [ТС] | 7 |
Хорошо, спасибо! Завтра постараюсь разобраться с функциями.
0
|
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
||||||
05.10.2015, 22:48 [ТС] | 8 | |||||
Прерывал я решение этой задачи, но снова возобновил) Сделал как Вы и посоветовали, применил вышеуказанную конструкцию. К тому же были еще кто советовал ее использовать, НО! Не работает с ней программа. Тут же вопрос, а правильно ли я расставил вероятности? Их нужно было суммировать или оставить на круги своя 0,37, 0,12, 0,23, 0,28?
Получается что конструкция (UNIFORM(1,40,67)) не производит вычисление по равномерному распределению в пределах GMIN - GMAX. Шрайбер писал что нужно ставить "." между парами, но актуальность этого я пока не могу проверить, программа ругается.
0
|
![]() 1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
|
|
06.10.2015, 16:44 | 9 |
1
|
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
|
06.10.2015, 17:48 [ТС] | 10 |
Вот оно в чем дело! Если я правильно понимаю получается следующее: при обращении в теле программы к конструкции FN$<имя функции> происходит расчет функции по заданному нами алгоритму. А так как в теле FUNCTION второй параметр в парах определяется стандартным числовым атрибутом (UNIFORM(1,40,67)), если я правильно понял, то когда была конструкция вида FUNCTION RN1,D4 программа ждала появления числа, а получала вместо числа (UNIFORM(1,40,67)). Теперь же, изменив на FUNCTION RN1,E4 функция видит что значение определяется равномерным распределением (UNIFORM(A,GMIN,GMAX)). Я почему так расписываю, мало ли кому пригодится и вопрос решится еще на стадии осмысления.
Добавлено через 46 секунд Даже не поблагодарил. Спасибо Вам, Dukalys!
0
|
![]() 1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
|
|
06.10.2015, 17:57 | 11 |
Да всё верно понимаете. Вместо числа gpss получал атрибут ("функцию" uniform).
0
|
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
|
06.10.2015, 18:12 [ТС] | 12 |
Кстати, а вероятности правильно заданы? Необходимы значения 0,37, 0,12, 0,23 и 0,28. Что соответствует 0.37,UNIFORM(1,40,67)/0.49,UNIFORM(1,67,93)/0.72,UNIFORM(1,93,119)/1.0,UNIFORM(1,119,146). Или же выставлять 0,37, 0,12, 0,23 и 0,28?
0
|
![]() 1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
|
|
06.10.2015, 18:29 | 13 |
Да правильно, накапливаемый процент, показывающий как-бы интервалы которые будет попадать случайная величина RN1 = 0..0.999
1
|
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
||||||
06.10.2015, 21:19 [ТС] | 14 | |||||
Так, теперь ломаю голову над несколькими приборами в одном устройстве в конструкции, т.е. сформировать многоканальное устройство. Как я понимаю использовать необходимо блоки ENTER и LEAVE, но предварительно необходимо определить емкость многоканального устройства при помощи оператора STORAGE в конструкции <имя устройства> STORAGE <емкость>. Если не ошибаюсь в теле программы необходимо заменить SEIZE на ENTER, и RELEASE на LEAVE. При этом имя прибора, допустим, задаю Pribor, а программа автоматом сформирует три прибора в устройстве, необходимых мне. Или все-таки целиком и полностью придется все тело программы три раза повторить, но это слишком громоздко.
Мне предложили вариант "SELECT MIN 1,1,3,,FC", но этот вариант, по-моему, не формирует три прибора, а только лишь проверяет заняты они или нет. Добавлено через 42 минуты
0
|
![]() 1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
|
|
07.10.2015, 08:01 | 15 |
Лучше вот так
Код
SELECT E 1,1,3,0,F Код
SEIZE P1 ADVANCE RELEASE P1 Теперь по поводу seize-release - одноканальное устройство, ENTER-LEAVE - многоканальное. Использовать многоканальное можно, НО оно не даст подробной статистики по каждому каналу, только в целом по многоканальному. И наоборот - одноканальные знают статистику только о себе, и в отчёте не будет статистики по многоканальному. Поэтому обычно эти конструкции юзают в совокупности чтобы в отчёте получить нужную статистику. Код
QUEUE ENTER DEPART SELECT SEIZE P1 ADVANCE RELEASE P1 LEAVE
1
|
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
||||||||||||||||
07.10.2015, 18:16 [ТС] | 16 | |||||||||||||||
Поигрался я тут, теперь нахожусь в смятении.
Первая конструкция: задано трехканальное устройство при помощи ENTER LEAVE. Как я понимаю транзакты поступают по одному и ожидают когда освободится один из трех каналов.
Вторая конструкция: трехканальное устройство задано при помощи SELECT. SELECT проверяет занятость приборов и в случае положительного результата формирует очереди в устройства в соответствии с минимальной длиной очереди.
Третья конструкция: по идее работает как первая, но с использованием SELECT. Но результат меня вообще смутил.
Кстати, SELECT в предложенной конструкции ругается, работает только как я написал с МИН.
0
|
![]() 1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
|
|
07.10.2015, 18:30 | 17 |
1.
2. Сократите код программы - зачем у вас одинаковые структуры в модели? Код
QUEUE Och_1 ; занимаем очередь ENTER Pribor ; занимаем прибор DEPART Och_1 ; фиксируем выход заявки из очереди SEIZE P1 ADVANCE FN$time ; обработка заявки в соответствии с вероятностым ; распределением функции времени RELEASE P1 LEAVE Pribor ; освобождаем прибор TERMINATE ; удаляем обслуженную заявку [/quote] Код
Generate 1 transfer ,OBSL ; Перенаправляем на метку обсл Generate 2 OBSL QUEUE ... ; метка обслуживания, единый блок обслуживания заявок разных типов. ... ![]() 3. Код
SELECT E 1,1,3,0,F
1
|
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
|
07.10.2015, 18:51 [ТС] | 18 |
Спасибо! Сразу много нового узнал. Конструкцию пока упрощать не буду, мониторю прохождение заявок. А насчет SELECT, это я опрофанился. Видел как Вы сделали, но решил переставить на другое место. Теперь наблюдаю каков истинный результат. А я когда читал так понял что трансфер в случае если все очереди заняты заново транзакт прогоняет по кругу и ставит заявку в минимальную очередь. А он, значит, просто заявку пропускает дальше мимо очереди, отсюда такой хороший результат с обработкой транзактов?
0
|
![]() 1817 / 1031 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
|
|
07.10.2015, 20:19 | 19 |
По первой части ок.
А вот по второй не до конца понял про что речь идёт.
0
|
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 14
|
|
07.10.2015, 23:10 [ТС] | 20 |
Прошу прощения, устал сегодня и мысли разбегаются. Думал про SELECT, а писал TRANSFER. Я правильно понимаю что SELECT в моем случае решает последнюю задачу задания касаемо очереди к каждому прибору в отдельности. Если из конструкции исключить блок SELECT, получается что пара QUEUE - DEPART формирует общую очередь к устройству. А включив SELECT, получаем формирование очереди к каждому из приборов многоканального устройства в отдельности?
0
|
07.10.2015, 23:10 | |
07.10.2015, 23:10 | |
Помогаю со студенческими работами здесь
20
Две очереди заявок двух типов (Моделирование системы массового обслуживания с параллельными каналами обслуживания с повторами) Изменение времени обслуживания заявок
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
![]() |
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Mapped-типы в TypeScript
stackOverflow 17.02.2025
TypeScript предоставляет развитые средства для типизации данных, и одним из наиболее гибких инструментов являются mapped-типы. По сути, mapped-тип или сопоставленный тип - это способ создания нового. . .
|
Как вернуть энтузиазм
Uswer 17.02.2025
Приветствую тебя читатель.
Сначала небольшая предыстория.
Лет 5-6 тому назад появилась у меня идея автоматизации некоего процесса на работе. А так как я уже много лет увлекаюсь (не путать с. . .
|
Оператор satisfies в TypeScript: как он работает и где применять
stackOverflow 17.02.2025
Оператор satisfies - одна из наиболее полезных возможностей TypeScript, позволяющая проверять типы значений без изменения их исходного типа. В отличие от других операторов типизации, satisfies дает. . .
|
Почему могут не шифроваться русские символы в Java
Wired 17.02.2025
При разработке на Java нередко возникают сложности с шифрованием русских символов. Эта проблема особенно актуальна для разработчиков, создающих программное обеспечение для русскоязычной аудитории. . . .
|
Отличия ОС для x86_64 и ARM
Wired 17.02.2025
На данный момент сосуществуют две основные архитектуры процессоров - x86_64 и ARM. Эти архитектуры имеют принципиально разные подходы к организации вычислений и обработке данных, что накладывает. . .
|
Многопоточность в Python: как использовать Thread
bytestream 17.02.2025
Поток выполнения (thread) - это наименьшая последовательность инструкций, которая может управляться планировщиком операционной системы. Представьте себе, что ваша программа - это книга, а потоки -. . .
|
Как воспроизвести Race Condition в Python
bytestream 17.02.2025
В многопоточном программировании существует множество подводных камней, и одним из самых коварных является состояние гонки (Race Condition). Этот термин описывает ситуацию, когда результат выполнения. . .
|
Ошибка "node: --openssl-legacy-provider is not allowed in NODE_OPTIONS"
bytestream 17.02.2025
Каждый разработчик рано или поздно сталкивается с ситуацией, когда при запуске проекта Node. js неожиданно выскакивает ошибка "node: --openssl-legacy-provider is not allowed in NODE_OPTIONS". Это. . .
|
Ошибка pip Python "AttributeError: module 'lib' has no attribute 'OpenSSL_add_all_algorithms'"
bytestream 17.02.2025
При разработке на Python частенько сталкиваешься с разными сюрпризами, но ошибка AttributeError: module 'lib' has no attribute 'OpenSSL_add_all_algorithms' - это что-то особенное. Знаете, это как. . .
|
Сообщение Play Store "You must complete the advertising ID declaration before you can release an app that targets"
bytestream 17.02.2025
Рекламный идентификатор - это уникальный, но восстанавливаемый строковый идентификатор для каждого устройства Android. Думаю, вы удивитесь, но даже если ваше приложение не показывает рекламу. . .
|