logo
Обработка данных / Томашевский_Имитационное моделирование в среде GPSS_2003

9.11. Организация экспериментов вGpssWorId

Система GPSSWorldобеспечивает два вида автоматически про­водимых экспериментов: разработанные для пользователя и разрабо­танные пользователем. Разработанные для пользователя и встроен­ные вGPSSWorldавтоматические генераторы отсеивающих и опти­мизирующих экспериментов не предполагают повторных прогонов, т.е. эти эксперименты проводятсяcмоделями, работающими в ста­ционарном режиме. Для таких моделей оценки точности результатов моделирования могут быть получены за один достаточно длительный прогон модели (см. параграф 9.4). Данные переходного периода в этих экспериментах могут не учитываться. Эти модели не предусмат­ривают повторений экспериментов для каждого уровня сочетания факторов.

Отсеивающие и оптимизирующие эксперименты также не могут быть использованы в тех случаях, когда в процессе экспериментиро­вания необходимо изменять количество устройств в МКУ, которое задается оператором STORAGE.

Пользовательские эксперименты могут проводиться cмоделями, работающими в переходном режиме, и позволяют организовать по­вторение экспериментов. В этом случае необходимо заранее до пла­нирования экспериментов для каждого сочетания уровней факторов определить количество повторений экспериментов (см. параграф 9.4). Наличие встроенного языка программированияPLUSпозволяет раз­рабатывать пользовательские эксперименты любой сложности, вклю­чая и переопределение емкости МКУ.

Отсеивающий эксперимент в GPSS World. Этот эксперимент используется для определения факторов, существенно влияющих на систему. Полученная информация важна для проведения дальнейших экспериментовcцелью создания более эффективных оптимизирую­щих экспериментов. Результаты отсеивающего эксперимента показы­вают, какие факторы менее эффективны и должны в дальнейшем по­лучить меньший приоритет при рассмотрении. Для получения досто­верных результатов необходимо правильно выбирать значения фак­торов,cкоторыми будет проводиться эксперимент. В случаях, когда область допустимых значений фактора велика, может возникнуть не­обходимость проведения нескольких экспериментов для разных зна­чений факторов из этой области. В общем случае значения каждого фактора желательно выбирать равноудаленно от границ области и друг от друга.

Для того, чтобы воспользоваться встроенным генератором от­сеивающих экспериментов GPSSWorld, необходимо выполнить пункт менюEdit/Insert Experiment/Screening, в результате чего поя­вится диалоговое окно Screening Experiment Generator. Отсеиваю­щий эксперимент проводится только для двух значений каждого уровня факторовValue 1 и Value 2, так как в его основе лежит ли­нейная регрессионная модель.

Для организации эксперимента необходимо иметь отлаженную имитационную модель, которая должна быть проверена при всевоз­можных значениях входных переменных. Необходимо гарантировать, что модель будет правильно работать при любой комбинации уров­ней факторов.

В результате заполнения полей диалогового окна в эту модель ав­томатически будет добавлен код на языке PLUS. По выбору пользова­теля для запуска эксперимента может быть назначена функциональная клавиша (обычноF11, но ее можно переопределить). В этом случае по­сле трансляции модели (команда пункта менюCom­mand/Create Simulation или Ctrl+Alt+S) для запуска отсеивающего эксперимента достаточно будет нажать функциональную клавишуF11.

Пример 9.4

Отсеивающий эксперимент для модели работы компьютерной сети.

Локальная сеть (ЛС) имеет кольцевую топологию. В ней исполь­зуется 15 рабочих станций и один сервер, который также подключен к глобальной сети.

Пользователи рабочих станций посылают на сервер запросы для выполнения локальных заданий (обращения к базе данных, находя­щейся на сервере, составляют 15% запросов) и для обращения в глобальную сеть (поиск информации составляет 85% запросов).

Опрос рабочих станций в ЛС происходит cпомощью маркера по кольцевому алгоритму каждые 1,5c. Время переключения маркераcодной рабочей станции на другую составляет 0,1c. Если у рабочей станции есть сообщение, оно передается на сервер.

Поток запросов на обслуживание от всех рабочих станций явля­ется пуассоновским cинтенсивностью 1 запрос за 30c. Длина возникающих сообщений (кбайт) имеет гамма-распределениеcпараметра­миa= 88,P= 0,4. Каждое сообщение в ЛС разбивается на пакеты размером 1 Кбайт. Каждый пакет передается на сервер в течение 10 мс. Для сборки пакетов на сервере затрачивается по 1 мс на пакет.

Для обработки запросов по обращению к базе данных сервера требуется 50 ± 40 мс. Объем данных, которые нужно будет передать пользователю cсервера, равномерно распределен в интервале от 0,01 до 1 Мбайт.

Связь cглобальной сетью осуществляется по полудуплексному каналу (прием и передача не могут происходить в один и тот же мо­мент времени) со скоростью 3,6 кбайт/с. Время поиска информации в глобальной сети в секундах имеет гамма-распределениеcпараметра­ми α = 10, β = 0,2. Объем передаваемых данных от сервера на рабо­чие станции распределен по равномерному закону и составляет 100±50кбайт.

Канал связи занят во время передачи данных от рабочих станций к серверу и в обратном направлении. Одновременно могут передавать­ся данные только по одному запросу. Если в момент, когда канал за­нят, возникает запрос на использование канала, он становится в об­щую очередь запросов. После освобождения канала сначала проверя­ется содержимое очереди запросов. Если она пустая, то продолжается опрос рабочих станций, начиная со следующей после освободившей канал станции. Данные могут передаваться по каналу связи, даже ко­гда процессор сервера обрабатывает запрос. Запросы обрабатываются центральным процессором (ЦП) сервера по правилу FIFO.Bто время, как ЦП выполняет обращение к базе данных или глобальной сети, он освобождает канал связи. Результаты обработки запросов передаются на рабочую станцию сразу же, как только освободится канал.

Необходимо промоделировать работу сети на протяжении 24 ча­сов, оценить среднее время обработки запросов от рабочих станций и определить факторы, влияющие на это время.

Программа:

* Обработка запроса к глобальной сети

* Поиск в глобальной сети. Время поиска зависит от скорости соединения cсе­тью

Создадим отсеивающий эксперимент, в ходе которого оценим влияние на критерий эффективности модели следующих факторов:

– время опроса (фактор А);

– время передачи одного пакета по каналу связи (фактор В);

– интервал времени между возникновениями запросов на рабо­чих станциях (фактор C);

– время доступа к глобальной сети (фактор D).

Для изменения значений этих факторов воспользуемся операто­рами EQU, которые определены в начале программы.

Для создания отсеивающего эксперимента выберем команду в меню Edit/Insert Experiment/Screening... и заполним поля диалого­вого окна (рис. 9.9).

Назначение элементов диалогового окна:

Experiment Name (название эксперимента). В данном случае «ScreenNetwork».

'Run Procedure' Name (название процедуры прогона). В данном случае «DoTheRun».

Factors (факторы), которых должно быть не более шести. В со­ответствующие поля необходимо ввести имена факторов, заданных в модели операторомEQU, и два значения уровней факторов(Value 1 иValue 2).

Fraction (доля) определяет, какая часть от полного факторного эксперимента будет выполнена, т.е. план2k-p. Bэтом случае прогоны выполняются для каждого варианта значений уровней факторов, заданных в поляхValue 1 иValue 2.

Result, Expression (выражение для выходной переменной, для которой проводится эксперимент). В это поле могут быть введены на­звания переменных пользователя, СЧА или выражения.

Generate Run Procedure, Load F11 with CONDUCT command (флажки «Генерация процедуры прогона» и «Загрузка командыCONDUCTв клавишуF11») необходимо установить для автоматиза­ции и упрощения запуска эксперимента.

Alias Groups (группы смешивания). Эта кнопка открывает диа­логовое окноDefining Relation (определение отношений, рис. 9.10).

Puc. 9.9

Puc. 9.10

Часто время одного прогона модели настолько велико, что де­лать все 2k экспериментовcg повторениями не представляется воз­можным (особенно, когда факторов 4...6,ag = 100 или больше). В таком случае генератор отсеивающего эксперимента позволяет задать меньшее количество экспериментов (Fraction), т.е.2k. Этого можно добиться, благодаря смешиванию некоторых эффектов (AliasGroups). Следует, однако, учитывать, что при этом будет получена только часть информации. Кроме того, при превышении определен­ного предела числа прогонов уже нельзя будет определить эффекты отдельных факторов. В таких случаях можно сделать предположение о влиянии определенного фактора по значению эффекта, полученного для групп, в которые он входит и для которых это значение удалось рассчитать даже при меньшем количестве прогонов. Однако следует учитывать, что влияние факторов из одной группы может быть вза­имно противоположными. Может создаться впечатление, что эти факторы этой группы не оказывают на модель существенного влия­ния, в то время как в действительности каждый в отдельности оказы­вает такое влияние. Рекомендуется так группировать факторы, чтобы в каждой группе оказывался только один существенный фактор.

В приведенном примере в качестве критерия эффективности вы­брано среднее время (в мс) обработки запроса от момента появления его на рабочей станции до момента окончания приема результатов запроса на этой станции. Для получения этого времени используется регистратор очереди network.Bкачестве критерия выбран СЧАqt$network– среднее время нахождения транзактов в системе, кото­рое будет стремиться к истинному среднему только тогда, когда сис­тема будет работать в стационарном режиме. Если же запросы будут поступатьcчастотой, превышающей частоту их обработки, то длина очереди на обработку будет стремиться к бесконечности.

После заполнения диалога в модель будут вставлены такие про­цедуры:

ScreenNetwork– собственно отсеивающий эксперимент;

ScreenNetwork_GetResult– процедура выполнения прогонов, служит для фиксации результатов каждого прогона и перехода к сле­дующему прогону;

DoTheRun– процедура прогона, которая служит для установки начальных значений генераторов случайных чисел и запуска каждого нового прогона.

Генератор отсеивающего эксперимента GPSSWorldдо версии 4.3.5 не всегда прописывает название процедурыDoTheRunна языкеPLUS. Необходимо проверить добав­ляемый код и в случае, если эта процедура оказалась без названия, ввести его вручную.

Отсеивающий эксперимент в GPSSWorldпредполага­ет, что модель работает в стационарном режиме и оценки 1 выходной величины или критерия эффективности получаются по одному достаточно длинному прогону, поэтому в процедуре для отсеивающего эксперимента нет повторений для каждой комбинации уровней факторов.

Итак, для того, чтобы результаты эксперимента были достовер­ными, необходимо экспериментировать cмоделью, которая находит­ся в стационарном режиме. Поэтому сначала необходимо исследовать модель на стационарность. Для этого воспользуемся графиком изме­нения величиныqt$network– среднего времени обработки запроса (рис. 9.11) в модельном времени (выполнив пункт менюWin­dow/Simulation Window/Plot Window...).

Рис. 9.11

Из графика видно, что время переходного процесса равно при­мерно 20мин (1200000 мс) и оказалось, как минимум, в 72 раза меньше времени одного прогона системы. Окончательную длитель­ность прогона для стационарного процесса надо определять в зави­симости от требуемой точности получения оценок для выходной пе­ременной. Это можно сделать для эргодических или регенерирующих процессов, как описано в параграф 9.4.

Для того, чтобы статистические данные, собираемые во время переходного процесса, не давали смещения для выходной перемен­ной, их необходимо удалять cпомощью оператораRESET. Автоматически сгенерированный отсеивающий эксперимент в конце проце­дурыDoTheRun предполагает, что переходный период в модели за­кончится после прохождения 100 транзактов (GetpasttheStartupPe­riod).

После этого выполняется оператор RESET и начинается период измерений (BegintheMeasurementPeriod). Полный прогон модели (RuntheSimulation) заканчивается после прохождения через нее 1000 транзактов.

В данном примере моделирование заканчивается через 24 часа (86400000 мс). Учитывая то, что один прогон модели занимает значи­тельное время и для 4-х факторов на двух уровнях надо выполнить для полного факторного эксперимента 24прогонов, то сократим дли­тельность прогона до 10 длительностей переходного периода. Для этого установим таймер в модели на 1200000 мс.

GENERATE 1200000 Cучетом этого внесем изменения в процедуруDoTheRun.

После трансляции модели (пункт меню Command/Create Simulation илиcпомощью комбинации клавишCtrl+Alt+S) выполним полный(Full) отсеивающий эксперимент, нажав функциональную клавишуF11. В результате будут получены такие данные.

Как видно из результатов, только два эффекта – CиD– значи­мы, причем рост интенсивности запросов на рабочих станциях отри­цательно сказывается на среднем времени пребывания в сети, А увеличение скорости передачи пакетов уменьшает это время.

Оптимизирующий эксперимент. Этот эксперимент предназна­чен для построения уравнения поверхности отклика для заданных факторов модели и поиска численного значения оптимума (сочетания таких значений факторов, при котором заданная функция принимает экстремальное значение – максимум или минимум). Максимально возможное количество изменяемых факторов – пять. Эксперимент проводитсяcуже созданной моделью. Факторы, которые будут изме­няться, должны быть в модели представлены в виде констант, кото­рые определяютсяcпомощью оператораEQUили переменных. В хо­де эксперимента производится многократный прогон модели, фикса­ция результатов и использование их для получения поверхности от­клика и поиска оптимума.

Оптимизирующий эксперимент добавляется в созданную и от­лаженную модель. Для этого необходимо выбрать пункт меню Edit/Insert Experiment/Optimizing, после чего откроется диалоговое окно Optimizing Experiment Generator (рис. 9.12).

Рис. 9.12

В нем указываются необходимые для выполнения эксперимента параметры. В полях Experiment Name и Run Procedure Name зада­ются соответственно название эксперимента иRun-процедуры прогонов модели. По умолчанию название эксперимента –RSM(отRe­sponseSurfaceModel). Это имя будет добавлено ко всем названиям процедур и переменных, которые автоматически генерируются для этого эксперимента. Пользователю доступны для изменений все про­цедуры, относящиеся к эксперименту, кроме однойRSM_FitSurfaceToData(имя процедуры фиксировано и не изменится при задании другого названия эксперимента). В качестве названияRun-процедуры рекомендуется использоватьDoTheRun, хотя можно использовать и любое другое имя.

В полях Factor Name А, В, C, D, E указываются изменяемые ве­личины (факторы) и задаются значения их верхних и нижних уровнейValue 1 и Value 2.

Поля Low Limit, High Limit для Movement Limits задают мак­симальные границы перемещения (могут иногда помочь при поиске оптимума, но в большинстве случаев можно оставлять значения по умолчанию 0 и 100). Значение поляRedirection Limit ограничивает количество из­менений направлений при поиске оптимума. В некоторых случаях достаточно 1, но обычно нужно выбирать 2 или 3.

В поле Expression указывается целевая функция – выражение на языкеPLUS, заключенное в круглые скобки, или переменная модели, в которой задана эта функция.Cпомощью переключателяMaximize-Minimize выбирается направление оптимизации.

При выборе Generate Run Procedure создается процедура про­гонов модели, в противном случае придется ее написать. ВыборLoad F12... позволяет запускать экспериментcпомощью нажатия одной клавишиF12 вместо того, чтобы выбирать в менюCom­mand/Conduct и в нем вводитьCONDUCTRSM() или другое вы­бранное название эксперимента.

Для запуска автоматической генерации эксперимента нужно на­жать на кнопку Insert Experiment, но сначала необходимо задать пе­речисленные параметры.

Покажем на примерах, как можно использовать оптимизирую­щий эксперимент.

Пример 9.5

Исследуем работу алгоритма поиска экстремума функции cдвумя переменными, которая представляет собой верх­нюю часть сферыcрадиусом 3. Для того, чтобы можно было создать оптимизирующий эксперимент, воспользуемся простой моделью:

GENERATE 10

TERMINATE 1

В ней через 10 единиц модельного времени приходит транзакт, завершающий процесс моделирования, который должен начинаться cпомощью оператора управленияSTART1.

Диалоговое окно эксперимента заполним так, как показано на рис. 9.13 (при задании имен констант, переменных лучше использо­вать символ подчеркивания – это гарантирует избежание конфликтов имен).

В данном случае полезно в MovementLimitsпоменять пределы на 0 и 1, вследствие чего намного уменьшается количество итераций и увеличивается точность. Результат получается идеальным.

Рис. 9.13

После нажатия кнопки Insert Experiment откроется окно Run Procedure Generation (рис. 9.14), в котором отображается автомати­чески сгенерированный текст Run-процедуры, названной именем Do-TheRun.

Рис. 9.14

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

PROCEDURE DoTheRun(RunNumber) BEGIN

DoCommand("CLEAR OFF");

DoCommand("START 1");

END;

Теперь надо оттранслировать модель, выполнив пункт меню Command/Create Simulation. При этом мы увидим, что все процеду­ры регистрируются.

Нажмем клавишу F12и начнем эксперимент. В журнале сессии будет представлена следующая информация о ходе эксперимента.

Полученные оптимальные значения (входные переменные my_x= 0,my_y= 0, выходная переменнаяYield= 3) совпадаютcтео­ретическими.

Это как раз тот случай, когда можно увидеть, что сначала была попытка применить линейную модель Y= 2.86125 – 0.206216A+ 0.203185B, она не удалась и поэтому была применена модель второго порядкаY= 3.00049 + 0A+ 0B+ 0AB– 0.180775A2– 0.17918В2. Также этот пример продемонстрировал, что оптимум не обязательно должен находиться между указанными значениями по­лейValue 1, Value 2 диалогового окнаOptimizing Experiment Gen­erator.

Пример 9.6

Рассмотрим задачу нахождения оптимального количества ра­ботников производственного участка (аналог задачи о печи [10]).

Имеется производственный участок, на котором работают не­сколько человек. Чтобы изготовить изделие, работники сначала его собирают в течение 30±5 мин (процесс сборки осуществляется параллельно), А потом обрабатываютcпомощью общей машины в течение 8+2 мин. В каждый момент времени на машине можно обрабатывать только одно изделие. После этого изделие считается готовым, и ра­ботник начинает собирать новое изделие. Доход от одного изделия составляет 5 единиц стоимости, использование машины обходится в 400 единиц стоимости в неделю, зарплата одного рабочего 150 единиц стоимости в неделю. Нужно определить, сколько нужно рабочих, чтобы доход от производства был максимальным. Моделирование необходимо выполнить для пятидневной неделиcвосьмичасовым ра­бочим днем.

Программа:

Нужно найти такое значение параметра NWorkers, при котором доход достигал бы максимального значения. В выражение доходаPRIBY входит количество изготовленных изделий, равное значению СЧА N$OUT. Понятно, что доход может быть как отрицательным (убытки от производства), так и положительным (когда производство становится прибыльным).

Диалоговое окно эксперимента заполним, как показано на рис. 9.15. Используем ту же процедуру DoTheRun, что и в примере 9.5.

Рис. 9.15

Таким образом, получен следующий результат: в процессе поис­ка решения была построена модель второго порядка Y= -344.694 + 121.531A- 11.8367A2.

Оптимальные значения: входная переменная NWorkers=5.13, выходная переменнаяYield= 254.96.Cучетом условия целочисленности количества работников, имеем: оптимальное число работников для этой модели равно 5 .

При некоторых значениях полей Value1,Value2 диалогового окнаOptimizing Experiment Generator про­цедура оптимизирующего эксперимента не выполняет по­следний прогон «RunningthepredictedOptimum» и не вы­дает искомый результат. Также может быть выдано такое сообщение «Goodnessoffittestfails.Standard Error is 0. Cannot perform F test". В этих случаях нужно изменить значенияValue1 иValue2.

Эксперименты пользователя. Пользовательский эксперимент вGPSSWorld– очень гибкий и мощный инструмент, так какcпомо­щью встроенного языкаPLUSможно задать выполнение разнообраз­ных, достаточно сложных действий. Кроме того, выполняющийся эксперимент позволяет вызывать любые командыGPSSиз процедур на языкеPLUS. Подпрограммы на языкеPLUSделятся на процедуры (в заголовке используется ключевое словоPROCEDURE) и экспери­менты(EXPERIMENT) Эти подпрограммы должны находиться в файле модели. Разница между этими двумя видами подпрограмм за­ключается в следующем. Процедурыcпомощью оператораRETURN могут возвращать значение, которое можно посмотретьcпомощью командыSHOW, либо использовать в других подпрограммах. Для этого сначала нужно оттранслировать модель вместеcпроцедурой или же просто процедуру, если модель не используется. При этом процедура регистрируется. Затем в меню нужно выбрать пунктCommand/SHOW и написать там название процедуры, указав в скобках нужные параметры или ничего не указывая (если параметров нет). После этого процедура выполняется и выдается результат.

Процедуры на языке PLUSтакже могут использоваться в коман­дахGPSSв качестве операндов. В этом случае они заключаются в круглые скобки. Эти процедуры, в свою очередь, в качестве парамет­ров могут использовать вызовы других процедур. Это очень мощное новшествоGPSSWorldзначительно повышает возможности и гиб­кость модели.

Эксперимент отличается от процедуры тем, что он может быть вызван (выполнен) только пользователем. Для этого нужно выбрать пункт меню Command/CONDUCT и написать там название экспе­римента, указав в круглых скобках параметры, если они имеются, или ничего не указывая, если параметров нет. Что нового дает экспери­мент? Ключевым моментом является то, чтоcпомощью библиотеч­ной процедурыDoCommand можно вызывать любую командуGPSS, а это позволяет многократно выполнять прогоны модели и в каждом прогоне получать доступ к текущим результатам. Из подпрограммы эксперимента могут вызываться процедуры, которые в свою очередь могут вызывать другие процедуры и т.д. Причем из любой процеду­ры, на какой бы глубине вложенности вызовов она ни была, можно вызывать процедуруDoCommand. Поэтому структура выполняемого кода эксперимента может быть какой угодно сложной. Таким обра­зом, пользовательский эксперимент объединяет в себе набор проце­дур на языкеPLUS, в котором одна из процедур имеет в заголовке ключевое словоEXPERIMENT. Выполнить такой эксперимент мож­ноcпомощью командыCONDUCT. Разные эксперименты могут иметь общие вызываемые процедуры.

В пользовательском эксперименте для задания последователь­ности команд и исходных данных каждого прогона модели удобно использовать PLUS-процедуру. Такая процедура может инициализировать генераторы случайных чисел, выполнять команды и управлять имитацией.

В руководстве по GPSSWorldпользовательские эксперименты используются исключительноcпроцедуройANOVA, однако, их можно использовать для решения совершенно разных задач. Рассмотрим несколько практических примеров пользовательского экспе­римента.

В этих задачах нужно найти значения параметров системы, при которых ее критерий эффективности достигает оптимума. Алгоритм поиска решения базируется на том, что экономические показатели реальных систем обычно представляют собой функции, имеющие единственный локальный экстремум, который и является глобаль­ным. Рассмотрим еще раз задачу из примера 9.6. Использование в этом примере оптимизирующего эксперимента было не совсем кор­ректным. Оптимизирующий эксперимент рассчитан на модели, рабо­тающие в стационарном режиме, а для данного примера нет гарантий, что за пять дней работы моделируемая система войдет в такой режим.

Поэтому следует считать, что система работает в переходном режиме, и для каждого значения количества работников необходимо провести некоторое число прогонов модели.

Воспользуемся программой из примера 9.6 и организуем для этой модели пользовательский эксперимент, но прежде рассмотрим алгоритм поиска оптимума. Предполагаем, что целевая функция, оп­ределяющая прибыль, имеет единственный оптимум. Если бы време­на сборки и обработки детали на машине были бы детерминирован­ными, то оптимальное количество работников находилось бы вблизи величины, равной отношению времени сборки к времени обработки. В этом случае машина была бы максимально загружена и работники не простаивали бы в ожидании ее освобождения. В действительности, в силу случайного характера этих времен, оптимальное число работ­ников будет отличаться от значения, рассчитанного таким образом. Так как количество вариантов невелико, то можно воспользоваться методом их перебора, проводя эксперименты cразным числом работ­ников, начинаяcодного. Таким образом, предполагаемый доход бу­дет вначале увеличиваться до некоторого момента, а когда на каком-то шаге (при большем количестве работников) доход станет меньше, чем на предыдущем шаге, нужно остановиться. Оптимальное количе­ство работников соответствует шагуcсамым большим значением до­хода.

Для оценки дохода на каждом шаге при некотором фиксирован­ном количестве работников будем выполнять 10 прогонов cразными начальными множителями генераторов случайных чисел и рассчитывать среднее арифметическое получаемого дохода. В общем случае число прогонов надо рассчитыватьcучетом требуемой точности оценки прибыли.

Добавим к модели программный текст на языке PLUS, реали­зующий вышеприведенный алгоритм поиска оптимального количест­ва работников.

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

Переменная Curlполучает значение дохода на текущем шаге. Если предыдущее значение дохода больше текущего, то выдается ре­зультат и осуществляется выход из цикла.

Для запуска эксперимента сначала нужно оттранслировать мо­дель вместе cнаписанным программным текстом. Для этого выпол­няем пункт менюCommand/Create Simulation. Bceнаписанные про­цедуры регистрируются в системе. Затем в меню нужно выбрать пунктCommand/CONDUCT. В результате появится диалоговое окно'Conduct Experiment' Command (рис. 9.16).

Рис. 9.16

Для запуска пользовательского эксперимента, осуществляющего поиск оптимального числа работников, нужно в поле окна дописать название эксперимента Seek_Opt(). Если же нас интересует оценка величины прибыли для конкретного числа рабочих, например, для трех, то необходимо вызвать экспериментGo(3).

В результате выполнения эксперимента Seek_Opt() в журнале сессии появится множество записей, соответствующих выполняемым прогонам и, в конце концов, такой результат:

Понятно, что при желании можно выдавать любые промежуточ­ные данные. Таким образом, оптимальное количество рабочих со­ставляет 5, А доход равен 298,89 единиц стоимости, что совпадаетcоптимизирующим экспериментом (отличие в величине дохода объяс­няется разными подходами к формированию этой величины).

Подобным образом можно искать оптимум в задачах cлюбым количеством изменяемых параметров, нужно только вложить друг в друга циклыWHILEи перед поиском наилучшего значения целевой функции для конкретного значения параметра запоминать значение отклика для предыдущего значения этого параметра.

Пример 9.7 [10]. Рассмотрим швейное производство, в котором используются 40 собственных станков для изготовления продукции. Эти станки работают 150 ± 26 часов, после чего ломаются. Поломав­шийся станок забирается в ремонтную мастерскую, где работает не­которое число рабочих, каждый из которых может ремонтировать один станок. Ремонт осуществляется в течение 8 ± 3 часов, после чего станки снова готовы к работе. Недозагрузка производственных мощ­ностей обходится в 140 единиц стоимости в час за один станок из-за потерь, которые несет производство по недовыпуску продукции. Оп­лата одного рабочего составляет 4,75 единиц стоимости в час.

Кроме 40 собственных станков, имеющихся у предприятия, можно для подмены ломающихся арендовать аналогичные станки, Это обходится в 2,5 единицы стоимости в час за станок. Если в рабо­те уже задействовано 40 станков, то отремонтированный станок ста­новится в резерв.

Определить количество арендуемых станков и количество ра­ботников в ремонтной мастерской, при которых средние затраты на производство были бы минимальными.

Для поиска оптимума будем «разрезать» поверхность отклика плоскостями, которые соответствуют фиксированным значениям ко­личества арендуемых станков и нанятых ремонтников. При фиксированном значении одного параметра график функции затрат будет представлять собой кривую в двумерном пространстве cодним ми­нимумом (его можно найти точно так же, как в предыдущем примере). Таким образом, если мы будем последовательно изменять один параметр, по которому производится разрезание поверхности, то по­лучаемые значения функции затрат при этом фиксируемом параметре будут сначала уменьшаться, А потом в какой-то момент снова пойдут на увеличение. Самое маленькое значение и будет наилучшим. Это следует из предполагаемого вида поверхности.

Программа:

Тексты пользовательских PLUS-процедур:

Оптимизировать в данном случае нужно средние затраты на производство за час, которые вычисляются следующим образом:

Среднее число работающих станков за все время моделирования, определяет СЧА SA$MANUF. Начальное количество ремонтников в модели может не задаваться. Оно нужно только для автономного за­пуска модели без подключенного эксперимента.

Внешний цикл эксперимента Seek_Opt() организует изменение количества арендуемых станков. Внутренний цикл последовательно изменяет количество работников (чтобы найти минимум функции за­трат, становящейся двумерной). ПеременныеFlagl,Flag2 управляют выходом из циклов. ПеременныеPrevl,Curl,Flaglсоответствуют внешнему циклу;Prev2,Cur2,Flag2 – внутреннему. ПеременнаяPrev_N_WRKхранит значение количества рабочих на предыдущем шаге внешнего цикла (при меньшем фиксированном значении коли­чества арендуемых станков), соответствующее наименьшему значе­нию функции затрат. ПроцедураShow_lпредназначена для отобра­жения промежуточных наименьших значений функции затрат и при каких значениях параметров они достигаются.

Для данной модели выполним два пользовательских экспери­мента. Первый (Go) позволяет определить затраты на производство при конкретных значениях числа арендуемых станков и ремонтников, которые задаются как параметры в процедуре. Как и в предыдущем примере, средние затраты рассчитываются по 10 прогонам модели. Для выполнения этого эксперимента необходимо оттранслировать модельcподключенными процедурами, выполнить пункт менюCommand/CONDUCT и в диалоговом окне 'Conduct Experi­ment' Command вызвать процедуру GO

CONDUCT Go(5,3),

где 5 – число арендуемых станков и 3 – число ремонтников. Результат этого эксперимента:

Второй эксперимент Seek_Opt() запускается командой

CONDUCT Seek_Opt()

и позволяет методом направленного перебора найти вариант, соот­ветствующий минимальным затратам. Для каждого нового варианта сочетания числа станков и рабочих при старте в операторе STORAGEпереопределяется емкость МКУ для нового значения количества ре­монтников. Опустив промежуточные результаты, приведем конечный результат для этого эксперимента.

Из приведенных результатов видно, что на предыдущем шаге рассматривался вариант c8 станками и 6 рабочими, однако, затраты при этом сочетании оказались больше, чем при 7 станках и 6 рабочих.

Поэтому в качестве окончательного был принят вариант c7 станками и 6 рабочими при средних часовых затратах на производство 52.5568 единиц стоимости.