Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю? Еще раз спасибо за прекрасный курс! |
Модель функционирования предприятия
Модель функционирования предприятия в AnyLogic
Формализованное описание
Модель, исходя из структуры предприятия (см. Рис. 6.1), должна состоять из следующих сегментов:
- ввода исходных данных;
- имитации работы цехов по изготовлению блоков;
- имитации работы постов контроля блоков;
- имитации работы пунктов сборки изделий;
- имитации работы стендов контроля собранных изделий;
- имитации работы пунктов приема изделий;
- имитации склада готовых изделий;
- имитации склада бракованных блоков;
- вывода результатов моделирования.
Блоки и изделия в модели следует имитировать заявками со следующими полями (параметрами):
- block - номер цеха (коды 1…4 соответственно), выпустившего блок;
- sign1 - признак брака на постах контроля блоков, стендах контроля изделий и на пунктах приема изделий;
- numBlBrak1 … numBlBrak4 - признаки забракованных блоков 1…4 соответственно;
- timeSbor - время сборки изделия (замены блоков);
- cost - стоимость готового изделия.
Указанные поля предназначены для отслеживания технического состояния блоков и изделий и в зависимости от этого прохождения их по фазам изготовления изделия.
Поле timSbor введено для удобства построения модели. В это поле заносится либо время сборки изделия из четырех блоков, либо время замены каких-либо забракованных блоков в уже собранном изделии.
Стоимость изготовления изделия может возрасти по сравнению с минимальной стоимостью (CMIN) за счёт выявления брака и замены блоков. Для фиксации этой стоимости введено поле cost.
Для обеспечения работы модели вводятся следующие параметры процесса изготовления изделий из блоков:
- aveTimeShop1…aveTimeShop4 - средние интервалы времени выпуска блоков 1…4 цехами 1…4;
- stKomplBlock1…stKomplBlock4 - стоимости комплектующих блоков 1…4;
- stIzgBlock1…stIzgBlock4 - стоимость изготовления блоков 1…4;
- postKontr1…postKontr4 - количество постов контроля блоков 1…4;
- procBrakBlock1…procBrakBlock4 - проценты брака блоков 1…4 на постах контроля блоков;
- stTestBlock1…stTestBlock4 - стоимости тестирования (одного блока) блоков 1…4;
- kolPunSborki - количество пунктов сборки изделий;
- timeSborki - среднее время сборки одного изделия;
- stSborki - стоимость сборки одного изделия;
- kolStendKontr - количество стендов контроля собранных изделий;
- timeKontrIzd - среднее время контроля на стенде одного собранного изделия;
- procBrakIzd - процент брака собранных изделий на стендах контроля;
- stKontrIzd - стоимость контроля на стенде одного собранного изделия;
- verBlock1 - вероятность того, что забракованным в уже собранном изделии окажется один блок;
- verBlock2 - вероятность того, что забракованными в уже собранном изделии окажутся два блока;
- verBlNum1…verBlNum4 - вероятности брака на стенде контроля блоков 1…4;
- timeZamBlock1… timeZamBlock4 - среднее время замены (одного блока) блоков 1…4;
- stZamBlock1…stZamBlock4 - стоимость замены (одного блока) блоков 1…4;
- kolPunPriem - количество пунктов приема изделий, прошедших пункты контроля;
- timePriemIzd - среднее время приема одного изделия;
- procBrakPriem - процент брака изделий на пунктах приема изделий;
- stPriemIzd - стоимость приема одного изделия.
В ходе моделирования на основе приведенных исходных данных формируется и выводится на текущее модельное время следующая информация:
- kolIzBlock1…kolIzBlock4 - количество изготовленных блоков 1…4;
- kolTestBlock1…kolTestBlock4 - количество протестированных блоков 1…4 (как исправных, так и забракованных);
- brakBlock1…brakBlock4 - количество забракованных на постах контроля блоков 1…4;
- gotBlock1…gotBlock4 - количество изготовленных всего готовых блоков 1…4;
- ostGotBlock1…ostGotBlock4 - количество оставшихся готовых блоков 1…4;
- kolSobrIzd, testSobrIzd, brakSobrIzd - количество собранных на пунктах сборки изделий, проверенных и забракованных на стендах контроля;
- kolPriemIzd, brakPriemIzd - количество принятых и забракованных приемкой изделий соответственно;
- zamBlock1…zamBlock4 - количество замененных блоков 1…4, забракованных на стендах контроля и пунктах приема изделий;
- allBrakBlock1…allBrakBlock4 - всего забракованных блоков 1…4;
- minCostIzd - минимальная стоимость одного изделия;
- минСтоимГотИзд - минимальная стоимость готовых изделий;
- колГотИзд - количество готовых изделий, отправленных на склад.
На текущее модельное время собирается статистика по следующим стоимостным показателям функционирования предприятия:
- costKomplBlock1…costKomplBlock4,costKomplBlock - стоимости комплектующих блоков 1…4 и суммарная стоимость комплектующих всех блоков;
- costIzgBlock1…costIzgBlock4,costIzgBlock - стоимости изготовления блоков 1…4 и суммарная стоимость изготовления всех блоков (без учета стоимости тестирования блоков);
- CostBlock1…CostBlock4 - стоимости изготовления блоков 1…4 с учётом тестирования;
- sumCostBlock1…sumCostBlock4, sumCostBlock - суммарные стоимости изготовления блоков 1…4 с учётом тестирования и суммарная стоимость изготовления всех блоков;
- costTestBlock1…costTestBlock4,costTestBlock - стоимости тестирования блоков 1…4 на постах контроля и суммарная стоимость тестирования всех блоков;
- costSborIzd, costTestIzd, costPriemIzd - стоимости сборки, проверки и приемки изделий;
- стоимБракБл - суммарные затраты на все забракованные блоки;
- стоимГотИзд - затраты на выпуск готовых изделий;
- costBlockIzd - стоимость блоков одного изделия;
- costIzd - стоимость одного изделия;
- времяИзгИзд - среднее время изготовления одного изделия;
- коэфУвелСтоимИзд - коэффициент увеличения себестоимости изделия.
Минимальная стоимость изделий будет тогда, когда не будет бракованных блоков и изделий. В терминах постановки задачи это условие имеет вид:
где N_{изд} - количество готовых изделий (поступивших на склад);
- минимальная себестоимость производства одного изделия, вычисляется по формуле:
Собирается также статистика о коэффициентах загрузки подразделений предприятия.
В случае наличия брака себестоимость производимой продукции увеличится и составит . То есть коэффициент увеличения себестоимости будет равен
Запишем в идентификаторах исходных данных и результатов моделирования то же самое:
Ввод исходных данных
Для ввода исходных данных используем элемент Параметр.
- Выполните команду Файл/Создать/Модель на панели инструментов.
- В поле Имя модели диалогового окна Новая модель введите Предприятие.
- Выберите каталог, в котором будут сохранены файлы модели. Щёлкните кнопку Готово.
- В Палитре выделите Презентация. Создайте область просмотра Данные для размещения элементов исходных данных.
- Перетащите элемент Область просмотра. В поле Имя: введите Данные.
- На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 1700, Ширина: 760, Высота: 330.
- Перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
- На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 1750, Ширина: 740, Высота: 270.
- Перетащите элемент text и на странице Основные панели Свойства в поле Текст: вместо слова text введите Исходные данные.
- В Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Исходные данные. Разместите их так, как показано на Рис. 6.2. Значения свойств установите согласно Табл. 6.1.
Элементы и их свойства | |||||
---|---|---|---|---|---|
Параметр | Параметр | ||||
Имя | Тип | Значение по умолчанию | Имя | Тип | Значение по умолчанию |
aveTimeShop1 | double | 19 | stKomplBlock1 | double | 35 |
aveTimeShop2 | double | 11 | stKomplBlock2 | double | 32 |
aveTimeShop3 | double | 15 | stKomplBlock3 | double | 43 |
aveTimeShop4 | double | 18 | stKomplBlock4 | double | 48 |
stIzgBlock1 | double | 35 | timeTestBlock1 | double | 12 |
stIzgBlock2 | double | 27 | timeTestBlock2 | double | 16 |
stIzgBlock3 | double | 36 | timeTestBlock3 | double | 21 |
stIzgBlock4 | double | 37 | timeTestBlock4 | double | 17 |
postKontr1 | int | 2 | procBrakBlock1 | double | 0,02 |
postKontr2 | int | 2 | procBrakBlock2 | double | 0,03 |
postKontr3 | int | 2 | procBrakBlock3 | double | 0,04 |
postKontr4 | int | 2 | procBrakBlock4 | double | 0,06 |
stTestBlock1 | double | 12 | kolStendKontrIzd | int | 2 |
stTestBlock2 | double | 23 | timeKontrIzd | double | 26 |
stTestBlock3 | double | 32 | procBrakIzd | double | 0,05 |
stTestBlock4 | double | 28 | stKontrIzd | double | 74 |
kolPunSborki | int | 2 | verBlock1 | double | 0,9999 |
timeSborki | double | 22 | verBlock2 | double | 0,999999 |
stSborki | double | 67 | |||
verBlockNum1 | double | 0,25 | timeZamBlock1 | double | 12 |
verBlockNum2 | double | 0,25 | timeZamBlock2 | double | 15 |
verBlockNum3 | double | 0,25 | timeZamBlock3 | double | 12 |
verBlockNum4 | double | 0,25 | timeZamBlock4 | double | 21 |
stZamBlock1 | double | 34 | kolPunPriem | int | 2 |
stZamBlock2 | double | 46 | timePriemIzd | double | 18 |
stZamBlock3 | double | 38 | procBrakPriem | double | 0,15 |
stZamBlock4 | double | 54 | stPriemIzd | double | 53 |
Вывод результатов моделирования
Для вывода результатов моделирования используем элемент Переменная. Для удобства обозрения и анализа результатов моделирования разделим их на две группы. В первую группу включим данные о количестве подготовленных и забракованных блоков и изделий, во вторую группу - стоимостные показатели функционирования предприятия.
- Создайте область просмотра Результаты для размещения элементов Переменная.
- Перетащите элемент Область просмотра. В поле Имя: введите Результаты.
- На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 700, Ширина: 700, Высота: 520.
- Перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой.
- На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 750, Ширина: 690, Высота: 450.
- Перетащите элемент text и на панели Свойства в поле Текст: введите Данные о количестве подготовленных и забракованных блоков и изделий.
- Перетащите ещё элемент text и введите Стоимостные показатели функционирования предприятия.
- Перетащите третий элемент text и в поле Текст: введите Показатели использования пунктов предприятия.
- В Палитре выделите Основная. Перетащите элементы Переменная. Используйте копирование. Разместите их и дайте им имена так, как показано на Рис. 6.3. Тип всех переменных, используемых для вывода количества подготовленных и забракованных блоков и изделий на текущее модельное время - int. Тип переменных для вывода стоимостных показателей работы предприятия и показателей использования его пунктов - double.
- Выровняйте элементы. Для этого нужно вначале выделить те элементы, которые вы хотите выровнять, а затем открыть правым щелчком мыши по выделенным фигурам контекстное меню и выбрать нужную команду выравнивания из подменю Выравнивание. Не поддерживается выравнивание элементов диаграмм состояний и диаграмм действий, потому что при выравнивании таких элементов может нарушиться логика модели.
Построение событийной части модели
В событийную часть модели включим указанные ранее сегменты согласно представлению предприятия как системы массового обслуживания (см. Рис. 6.1).
Модель будет содержать три активных объекта, элементы которых не могут физически вместиться в область диаграммы в окне презентации при выполнении модели, поэтому используем для каждого активного объекта элемент область просмотра. В дальнейщем после построения всех сегментов событийной части модели организуем переключение между областями просмотра.
Создайте область просмотра для размещения сегментов событийной части модели на диаграмме класса Main.
- В Палитре выделите Презентация. Перетащите элемент Область просмотра.
- Перейдите на страницу Основные панели Свойства.
- В поле Имя: введите Mainview.
- На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 0, Ширина: 990, Высота: 390.
- Перетащите элемент Скруглённый прямоугольник. В нём мы разместим все сегменты модели. Оставьте имя, предложенное системой.
- На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 60, Ширина: 970, Высота: 320.
- Перетащите элементы Скруглённый прямоугольник, укажите имена сегментов и свойства согласно Табл. 6.2. Шрифт, цвет и т.д. выберите по своему усмотрению.
Сегмент | Свойства | |||
---|---|---|---|---|
Х: | Y: | Ширина: | Высота: | |
Цеха | 20 | 80 | 140 | 270 |
Посты контроля блоков | 170 | 80 | 160 | 270 |
Пункты сборки изделий | 340 | 80 | 120 | 270 |
Стенды контроля изделий | 470 | 80 | 150 | 270 |
Пункты приёма изделий | 630 | 80 | 170 | 270 |
Склад готовых изделий | 810 | 80 | 160 | 130 |
Склад бракованных изделий | 810 | 220 | 160 | 130 |
Имитация работы цехов предприятия
Данный сегмент предназначен для имитации работы цехов, то есть изготовления и выпуска блоков через случайные интервалы времени, счёта количества изготовленных блоков, стоимости комплектующих изготовленных блоков по типам и за предприятие, стоимости изготовления блоков по типам и суммарной стоимости за предприятие.
- Из Библиотеки моделирования процессов перетащите объект sourсe на агент Main и разместите в скругленном прямоугольнике с именем Цеха.
- Для записи и хранения параметров блоков и изделий в дополнительные поля заявок нужно создать нестандартный тип заявки. Создайте тип заявки Product.
- В панели Проект щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите в меню Создать Java класс.
- Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса Product.
- В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните кнопку Далее.
- Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса, которые потребуются в дальнейшем при разработке модели:
int numBlock; int sign1; int numBlBrak1; int numBlBrak2; int numBlBrak3; int numBlBrak4; double timeSbor; double cost;
- Оставьте выбранными флажки Создать конструктор и Создать метод toString().
- Щёлкните кнопку Готово. Появится редактор кода и автоматически созданный код вашего Java класса. Закройте код.
- Щёлкните правой кнопкой мыши в панели Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента.
- Появится окно c параметрами типа заявок Product.
- Выделите объект source. На странице Основные панели Свойства установите свойства согласно Табл. 6.3.
Таблица 6.3. Свойства объектов source Имя Свойства Значения Цех1 Отображать имя Установите флажок Тип заявки Product Прибывают согласно Времени между прибытиями Время между прибытиями exponential(1/aveTimeShop1) Новая заявка Product Действия При выходе: if (a==0){costBlock1=stKomplBlock1+stIzgBlock1+stTestBlock1; costBlock2=stKomplBlock2+stIzgBlock2+stTestBlock2; costBlock3=stKomplBlock3+stIzgBlock3+stTestBlock3; costBlock4=stKomplBlock4+stIzgBlock4+stTestBlock4; costBlockIzd=costBlock1+costBlock2+costBlock3+costBlock4; minCostIzd=costBlockIzd+stSborki+ stKontrIzd+stPriemIzd; a=1;} kolIzgBlock1++; entity.numBlock = 1; entity.timeSbor = exponential(1/timeSborki); costKomplBlock1 += stKomplBlock1; costKomplBlock += stKomplBlock1; costIzgBlock1 += stIzgBlock1; sumCostBlock1 += (stKomplBlock1+stIzgBlock1); costIzgBlock += stIzgBlock1; sumCostBlock += stKomplBlock1+stIzgBlock1); цех2 Отображать имя Установите флажок Тип заявки Product Прибывают согласно Времени между прибытиями Время между прибытиями exponential(1/aveTimeShop2) Новая заявка Product Действия При выходе: kolIzgBlock2++; entity.numBlock = 2; costKomplBlock2 += stKomplBlock2; costKomplBlock += stKomplBlock2; costIzgBlock2 += stIzgBlock2; sumCostBlock2 += (stKomplBlock2+stIzgBlock2); costIzgBlock += stIzgBlock2; sumCostBlock += (stKomplBlock2+stIzgBlock2); цех3 Отображать имя Установите флажок Тип заявки Product Прибывают согласно Времени между прибытиями Время между прибытиями exponential(1/aveTimeShop3) Новая заявка Product Действия При выходе: kolIzgBlock3++; entity.numBlock = 3; costKomplBlock3 += stKomplBlock3; costKomplBlock += stKomplBlock3; costIzgBlock3 += stIzgBlock3; sumCostBlock3 += (stKomplBlock3+stIzgBlock3); costIzgBlock += stIzgBlock3; sumCostBlock += (stKomplBlock3+stIzgBlock3); цех4 Отображать имя Установите флажок Тип заявки Product Прибывают согласно Времени между прибытиями Время между прибытиями exponential(1/aveTimeShop4) Новая заявка Product Действия При выходе: kolIzgBlock4++; entity.numBlock = 4; costKomplBlock4 += stKomplBlock4; costKomplBlock += stKomplBlock4; costIzgBlock4 += stIzgBlock4; sumCostBlock4 += (stKomplBlock4+stIzgBlock4); costIzgBlock += stIzgBlock4; sumCostBlock += (stKomplBlock4+stIzgBlock4); - Щёлкните выделенный source правой кнопкой мыши и в контекстном меню выберите Копировать.
- Вставьте в скругленный прямоугольник с именем Цеха еще три объекта source. Разместите их вертикально один под другим. Во время вставки имена объектов будут изменяться: цех2, цех3, цех4. Однако остальные свойства останутся такими же, как и у объекта цех1.
- Поэтому, последовательно выделяя второй, третий и четвертый объекты source, скорректируйте их свойства также согласно Табл. 6.3.