интересно
Предыдущая | Содержание | Следующая

Пример создания имитационной модели экономического процесса

В качестве примера, иллюстрирующего создание моделей с помощью конструктора, рассмотрим следующий объект. Имеется предприятие, принимающее заказы на изготовление продукции типов А и В. Заказы на продукцию типа А поступают в среднем раз в 30 дней, а на продукцию типа В - раз в 5 дней. Для производства продукции типа А необходимо 10 дней, а для продукции типа В -2 дня. Одновременно может идти производство только по одному заказу. При этом заказы на продукцию А являются первоочередными. Все сведения о выполнении заказов типов А и В фиксируются в отдельных документах. Модель строится для исследования очереди задержек заказов.

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

Опишем создание имитационной модели с помощью графического конструктора как последовательность технологических шагов.

Шаг I. Создание графа модели.

Рассмотрим в качестве автономных процессов:

производство и фиксацию выполненных заказов;

формирование заказов и очередь заказов на производство.

Определим единицу модельного времени для последующего формирования параметров модели. Очевидно, в данном примере за единицу времени удобно взять один рабочий день.

Запустим конструктор на выполнение.

В основном меню выберем Файл -> Создать. В результате, в рабочей области экрана появится пустое окно с именем Плоскость 1. Это пустая корневая плоскость.

Из панели узлов в левой части экрана перетащим в плоскость построения узлы типов parent, serv. В панели узлов также найдем узел типа ag и щелкнем.мышью по узлу ag. Надпись на панели сменится на term. Добавим в плоскость построения два узла типа term. Расположим узлы в рабочей области так, какпоказано на рис. 5.15.

Зададим имена узлов. Для этого нужно дважды щелкнуть мышью по каждому из узлов и в появившемся диалоговом окне в поле Имя вместо находящегося там Object... ввести: Производство для узла 102; Отчет А для узла 103, Отчет В для узла 104. Узел 101 будет содержать подуровень формирования заказов; он будет рассмотрен позже.

Определим маршруты транзактов. Для этого захватим изображение круга с перекрестием на панели узлов и перетащим на узел Производство. После отпускания кнопки мыши за курсором потянется стрелка. Далее необходимо щелкнуть мышью по узлу Отчет А, в результате чего появится стрелка, символизирующая маршрут прохождения транзактов из узла Производство в Отчет А. Аналогичную операцию повторим, задав маршруты из узла Производство в Отчет А и из Object 101 в Производство.

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

Создадим плоскость формирования заявок. Дважды щелкнем по узлу Object 101, в результате чего получим новую пустую плоскость 10 с именем Object 101. В этой плоскости теми же операциями, что и ранее, создадим граф, как показано на рис. 5.17. Останемся в этой плоскости.

Можно увидеть, что в информационной строке в нижней части экрана красным цветом отображены надписи Вход не назначен и Выход не назначен. В нашем случае плоскость 10 не будет иметь входа, так как сама предназначена для генерации заявок, однако выход необходимо назначить. В левой части экрана щелкнем по кнопке Слой. В диалоговом окне введем имя слоя Заказы и выход 107. Вход установим на значение попе, т.е. отсутствующий. Результат приведен на рис. 5.18. После нажатия кнопки ОК одна из красных надписей в информационной строке будет заменена на Выход: Ю7.

Шаг II. Определение глобальных переменных модели!

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

Шаг III. Определение свойств узлов.

Определим свойства узлов плоскости 10. Узел 105 будет формировать заказы типа А, узел 106 - типа В. Необходимо дважды щелкнуть мышью по узлу 105, в результате чего появится диалоговое окно Свойства узла. В нем щелкнуть по кнопке Определить параметры. В результате появится окно определения параметров узлов типа ag (рис. 5.20). Очевидно, для заявок типа А значение Приоритет нужно указать равным 1. На выборе закона распределения не будем останавливаться, -выберем его как norm - нормальное. В строке Мат. ожидание введем значение 30, а Отклонение примем равным 10. Повторим процедуру для узла 106. Но значение приоритета укажем 2, математическое ожидание примем равным 5, а отклонение - равным 2. Теперь генераторы подготовлены.

Аналогичным образом определим параметры для узла 107 Очередь заявок. Здесь всего один параметр, его необходимо устаг новить в значение prty. Это будет означать, что заказы проходят очередь в соответствии с приоритетами. Поэтому заявки на произ-водство продукции типа А будут проходить прежде заявок на продукцию типа В.

Определим свойства узлов плоскости 1. Начнем с узла 102 типа serv. Дважды щелкнем по нему мыщыр - появится диалоговое окно Свойства узла (рис. 5.21). В поле Выходы на выберем строку Из 102 в 103. В поле Условие перехода укажем t—>рг = = 1. Это значит, что по этой ссылке перейдут только те транзакты, которые в качестве параметра t->pr (приоритет) имеют значение 1. В поле C++ текст, располагающееся под Условием перехода, введем строку proc_time = 10. Далее, выбрав в поле Выходы строку Из 102 в 104, в поле C++ текст напишем proc_time = 2. Щелкнем по кнопке Определить параметры. В появившемся диалоговом окне Serv детализация зададим параметры: число каналов = 1; приоритетность = abs; закон распределения = norm; математическое ожидание = procjime; отклонение = proc_time/2; дополнительно = попе (рис. 5.22). Таким образом, определен обслуживающий прибор с одним каналом и временем обслуживания, зависящим от приоритета транзакта.

Для узлов типа term параметров не существует.

Шаг IV. Определение параметров функций modbeg и modend.

1. Определим параметры функции modbeg. В левой панели инструментов щелкнем по кнопке modbeg либо выберем соответствующий пункт меню раздела Модель. В появившемся диалоговом окне зададим имя модели Очередь заказов. Параметр Узлы обозначает порядковый номер последнего узла модели и рассчитывается автоматически. Поле Время подразумевает время выполнения модели, в моделируемых единицах времени. Поскольку за единицу времени взят один день, то рассмотрим модель на отрезке времени 365 единиц, т.е. один год. Параметр ПСЧ служит для настройки датчика случайных чисел. Значение, отображенное по умолчанию, позволяет при каждом запуске получать различные результаты моделирования. Поле Пространство используется при пространственном моделировании и в нашем случае не понадобится. В поле .Задержка необходимо ввести номер узла типа queue, информация о котором будет отображаться при выполнении модели, т.е. в нашем случае это номер 107. Поля Поток и Точность оставим без изменений. Результат определения параметров в диалоговом окне приведен на рис. 5.23.

2. Определим параметры функции modend. Для нашей задачи оставим параметры modend, заданные по умолчанию. Вызов диалогового окна для ввода параметров осуществляется аналогично вызову окна modbeg.

Ш а г V. Генерация текста имитационной модели в операторах Pilgrim.

Итак, модель готова. Для нее сформирован граф, заданы переменные, определены параметры узлов и функций. Для генерации программного файла необходимо в основном меню выбрать Выполнить, а затем - Генерировать C++ файл. При этом конструктором сначала будет выполнена проверка модели, в нашем случае не обнаружившая никаких ошибок или подозрительных участков на графе модели (рис. S.24). После нажатия кнопки ОК будет выведено стандартное диалоговое окно, предлагающее сохранить файл с расширением срр. Сохраненный конструктором файл можно далее компилировать в среде Visual C++.

Программная модель, автоматически сгенерированная конструктором и помещенная в срр-файл, имеет следующий вид:

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