Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю? Еще раз спасибо за прекрасный курс! |
Модель функционирования системы связи
Сегмент Статистика
Результаты моделирования выводятся в сегменте Имитация дежурства. Тем не менее, организуем вывод результатов моделирования, можно сказать, в более презентабельном виде. Для этого создадим сегмент Статистика (Рис. 5.12).
- Создайте область просмотра для размещения элементов сегмента Статистика.
- Перетащите элемент Область просмотра.
- Перейдите на панель Свойства.
- В поле Имя: введите статистика.
- Задайте Выравнивать по: Верхн. левому углу.
- Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
- На странице Местоположение и размер введите в поля X: 0, Y: 1076, Ширина: 960, Высота: 630.
- Перетащите элемент Прямоугольник.
- На странице Местоположение и размер введите в поля X: 20, Y: 1116, Ширина: 930, Высота: 580.
- Перетащите элемент text и в поле Текст: введите Результаты моделирования. На странице Местоположение и размер введите в поля X: 360, Y: 1126.
- Перетащите еще тринадцать элементов text, разместите и введите в соответствующие поля Текст: надписи, как на Рис. 5.12. Например, при размещении надписи Максимальный доход по типам СС укажите в полях X: 100, Y: 1160, при размещении надписи Коэффициенты использования типов средств связи укажите в полях X: 280, Y: 1490, а при размещении надписи Затраты на содержание резервов по типам средств связи в полях X: 280, Y: 1440.
Использование элемента Текстовое поле
Текстовое поле является простейшим текстовым элементом управления, позволяющим пользователю вводить небольшие объемы текста. Вы можете также связать этот элемент управления с переменной или параметром типа String, double или int. Мы будеи выводить в эти текстовые поля результаты моделирования.
- Копированием разместите согласно Рис. 5.12 элементы Текстовое поле. При копировании используйте следующие рекомендации. Перетащите первый элемент Текстовое поле. В поле Имя: дайте ему имя editbox1.
- На странице Внешний вид в полях Шрифт: установите шрифт по своему усмотрению из выпадающего списка или оставьте предложенный, размер шрифта установите 14.
- На странице Местоположение и размер введите в поля X: 70, Y: 1210, Ширина: 80, Высота: 20.
- Скопируйте editbox1. Вставьте ещё пять таких элементов. При вставке ориентируйтесь на клетки рабочего поля. Например, в данном случае между элементами по вертикали две клетки.
- Слева от элементов, используя элемент Текст, разместите номера типов СС 1…5. Шестому элементу введите имя Сумма.
- Скопируйте только что созданные номера элементов Текстовое поле и сами элементы. Вставьте скопированное четыре раза.
- Вставьте пятый раз. Разместите шесть элементов Текстовое поле горизонтально как на Рис. 5.12.
- Перетащите элемент Текстовое поле с именем editbox37. С использованием элемента Текст введите Коэффициент готовности системы связи.
1 | 2 | 3 | 4 | 5 | Сумма |
---|---|---|---|---|---|
Максимальный доход по типам СС | |||||
editbox1 | editbox2 | editbox3 | editbox4 | editbox5 | editbox6 |
Доход от дежурства по типам СС и всего | |||||
editbox7 | editbox8 | editbox9 | editbox10 | editbox11 | editbox12 |
Стоимость ремонта по типам СС и всего | |||||
editbox13 | editbox14 | editbox15 | editbox16 | editbox17 | editbox18 |
Суммарная прибыль от использования СС и всего | |||||
editbox19 | editbox20 | editbox21 | editbox22 | editbox23 | editbox24 |
Коэффициенты прибыли по типам СС и всего | |||||
editbox25 | editbox26 | editbox27 | editbox28 | editbox29 | editbox30 |
Затраты на содержание резервов по типам СС и всего | |||||
editbox31 | editbox32 | editbox33 | editbox34 | editbox35 | editbox36 |
Использование элемента Диаграмма
С помощью диаграмм AnyLogic позволяет динамически визуализировать данные, собираемые в результате работы модели. Набор диаграмм схож с тем, что предлагается программой MS Excel. Библиотека обладает мощным и удобным интерфейсом, не требующим при создании диаграммы программирования.
Термин диаграмма используется для обозначения, как обычных диаграмм, так и гистограмм. Гистограммы отображают статистически обработанные данные в виде функции плотности вероятности (PDF) и интегральной функции распределения (CDF), учитывающие все когда-либо добавленные на гистограмму значения. Диаграммы отображают текущие значения элементов данных (а некоторые - также недавнюю историю изменения значений).
AnyLogic поддерживает несколько видов диаграмм.
Простые диаграммы:
- столбиковая диаграмма;
- диаграмма с накоплением;
- круговая диаграмма.
Диаграммы с историей (временные диаграммы):
- график;
- временной график;
- временная диаграмма с накоплением;
- временная цветовая диаграмма.
Используйте диаграмму с накоплением.
Диаграмма с накоплением показывает вклад нескольких элементов данных в суммирующий результат в виде столбцов, расположенных друг над другом. Высота каждого столбца пропорциональна значению соответствующего элемента данных.
Самый нижний столбец соответствует элементу данных, добавленному вами на диаграмму первым, затем добавленному вторым и т. д. Не допускается присутствие отрицательных значений - в этом случае возникнет ошибка. Вы можете изменить направление роста столбца и его ширину с помощью свойств Направление и Относительная ширина (они находятся на странице свойств Внешний вид).
- Перетащите первый элемент Диаграмма с накоплением из палитры Статистика и разместите согласно Рис. 5.12.
- На панели Свойства установите: Масштаб: Фиксированный, Обновлять данные автоматически.
- На странице Внешний вид установите:
- Направление: вертикальное
- Цвет текста, цвет фона и цвет границы установите по своему усмотрению.
- На странице Местоположение и размер введите в поля X: 40, Y: 1510, Ширина: 230, Высота: 180.
- На странице Легенда установите Высота: 20, Расположение сверху.
- На страницы Область диаграммы введите в поля Смещение по оси X: 40, Смещение по оси Y: 10, Ширина: 60, Высота: 140.
- Щёлкните Добавить элемент данных.
- В поле Заголовок: введите СС1.
- В поле Значение: введите Java код
degCC1.statsUtilization.mean()
- Скопируйте первый элемент Диаграмма с накоплением.
- Вставьте четыре элемента 2…5. После вставки в полях Заголовок: вставленных элементов внесите правки для получения имён СС2, СС3, СС4, СС5 соответственно.
- В поле Значение: вводите Java коды также для элементов 2…5 соответственно:
degCC2.statsUtilization.mean() degCC3.statsUtilization.mean() degCC4.statsUtilization.mean() degCC5.statsUtilization.mean()
На этом построение сегмента Статистика завершено.
Использование способа Событие
Событие является самым простым способом планирования действий в модели. События часто используются для моделирования задержек и таймаутов. Вы можете сделать это и с помощью срабатывающих по таймауту переходов диаграмм состояний, но использование событий является более рациональным. В некоторых случаях поведение может быть смоделировано только с помощью таймеров.
Есть три типа событий.
Событие, происходящее по истечении таймаута. Оно используется тогда, когда Вам нужно запланировать выполнение какого-то действия на определенный момент времени (отстоящий на заданное количество времени (таймаут) от текущего момента). Событие, происходящее по истечению таймаута, предоставляет дополнительные возможности: вы можете сделать событие циклическим, либо же вообще управлять этим событием "вручную".
Событие, происходящее при выполнении заданного условия. Оно используется тогда, когда Вам нужно отслеживать выполнение определенного условия и производить какое-то действие при его происхождении.
Событие, происходящее с заданной интенсивностью. Оно используется для моделирования потока независимых событий (пуассоновский поток). Это часто требуется при моделировании поступления, например, заявок в системах массового обслуживания.
AnyLogic поддерживает еще один тип события, задаваемый уже другим модельным элементом - динамическое событие. Динамические события используются для планирования сразу нескольких одновременных и независимых событий. Например, канал связи, параллельно передающий произвольное количество сообщений, может быть смоделирован с помощью динамических таймеров, создаваемых для каждого сообщения.
Для вывода результатов моделирования воспользуйтесь событием, происходящим по истечении таймаута.
- Перетащите элемент Событие из палитры Основная на диаграмму размещения элементов Переменная для вывода результатов моделирования (Рис. 5.10). Измените его имя на РезультатыМоделирования. Нажмите Enter.
- Установите флажок Отображать имя. С помощью выпадающего списка Tип события: выберите По таймауту.
- Установите Режим: Срабатывает один раз.
- Время срабатывания (абсолютное) 1000000.
- В поле Действие введите Java код, который будет выполняться при появлении этого события.
//Расчет результатов по СС1 DoxDegCC1=round((DoxDegCC1/КолПрогон)*100); DoxDegCC1=DoxDegCC1/100; ZatrRemCC1=round((ZatrRemCC1/КолПрогон)*100); ZatrRemCC1=ZatrRemCC1/100; UbitokCC1=round((1-degCC1.statsUtilization.mean())*main.ubitokCC1*ВремяРабСист*KCC1*100); UbitokCC1=UbitokCC1/100; PribCC1=round((DoxDegCC1-(ZatrResCC1+ZatrRemCC1+UbitokCC1))*100); PribCC1=PribCC1/100; koefPribCC1=round((PribCC1/DoxMaxCC1)*1000); koefPribCC1=koefPribCC1/1000; //Расчет результатов по СС2 DoxDegCC2=round((DoxDegCC2/КолПрогон)*100); DoxDegCC2=DoxDegCC2/100; ZatrRemCC2=round((ZatrRemCC2/КолПрогон)*100); ZatrRemCC2=ZatrRemCC2/100; UbitokCC2=(1-degCC2.statsUtilization.mean())*main.ubitokCC2*ВремяРабСист*KCC2; PribCC2=round((DoxDegCC2-(ZatrResCC2+ZatrRemCC2+UbitokCC2))*100); PribCC2=PribCC2/100; koefPribCC2=round((PribCC2/DoxMaxCC2)*1000); koefPribCC2=koefPribCC2/1000; //Расчет результатов по СС3 DoxDegCC3=round((DoxDegCC3/КолПрогон)*100); DoxDegCC3=DoxDegCC3/100; ZatrRemCC3=round((ZatrRemCC3/КолПрогон)*100); ZatrRemCC3=ZatrRemCC3/100; UbitokCC3=(1-degCC3.statsUtilization.mean())* main().ubitokCC3*ВремяРабСист*KCC3; PribCC3=round((DoxDegCC3-(ZatrResCC3+ZatrRemCC3+UbitokCC3))*100); PribCC3=PribCC3/100; koefPribCC3=round((PribCC3/DoxMaxCC3)*1000); koefPribCC3=koefPribCC3/1000; //Расчет результатов по СС4 DoxDegCC4=round((DoxDegCC4/КолПрогон)*100); DoxDegCC4=DoxDegCC4/100; ZatrRemCC4=round((ZatrRemCC4/КолПрогон)*100); ZatrRemCC4=ZatrRemCC4/100; UbitokCC4=(1-degCC4.statsUtilization.mean())* main.ubitokCC4*ВремяРабСист*KCC4; PribCC4=round((DoxDegCC4-(ZatrResCC4+ZatrRemCC4+UbitokCC4))*100); PribCC4=PribCC4/100; koefPribCC4=round((PribCC4/DoxMaxCC4)*1000); koefPribCC4=koefPribCC4/1000; //Расчет результатов по СС5 DoxDegCC5=round((DoxDegCC5/КолПрогон)*100); DoxDegCC5=DoxDegCC5/100; ZatrRemCC5=round((ZatrRemCC5/КолПрогон)*100); ZatrRemCC5=ZatrRemCC5/100; UbitokCC5=(1-degCC5.statsUtilization.mean())* main.ubitokCC5*ВремяРабСист*KCC5; PribCC5=round((DoxDegCC5-(ZatrResCC5+ZatrRemCC5+UbitokCC5))*100); PribCC5=PribCC5/100; koefPribCC5=round((PribCC5/DoxMaxCC5)*1000); koefPribCC5=koefPribCC5/1000; //Расчет суммарных результатов SumDoxDeg=DoxDegCC1+DoxDegCC2+DoxDegCC3+ DoxDegCC4+DoxDegCC5; SumZatrRem=round((SumZatrRem)*100/КолПрогон); SumZatrRem=SumZatrRem/100; SumUbitok=UbitokCC1+UbitokCC2+UbitokCC3+ UbitokCC4+UbitokCC5; SumPribil=round((SumDoxDeg-(SumZatrRes+SumZatrRem+SumUbitok))*100); SumPribil=SumPribil/100; koefPribil=round((SumPribil/SumDoxMax)*1000); koefPribil=koefPribil/1000; //вывод максимального дохода, дохода от дежурства по типам СС и всего editbox1.setText(DoxMaxCC1); editbox7.setText(DoxDegCC1); editbox2.setText(DoxMaxCC2); editbox8.setText(DoxDegCC2); editbox3.setText(DoxMaxCC3); editbox9.setText(DoxDegCC3); editbox4.setText(DoxMaxCC4); editbox10.setText(DoxDegCC4); editbox5.setText(DoxMaxCC5); editbox11.setText(DoxDegCC5); editbox6.setText(SumDoxMax); editbox12.setText(SumDoxDeg); //вывод стоимости ремонта по типам СС и всего editbox13.setText(ZatrRemCC1); editbox14.setText(ZatrRemCC2); editbox15.setText(ZatrRemCC3); editbox16.setText(ZatrRemCC4); editbox17.setText(ZatrRemCC5); editbox18.setText(SumZatrRem); //вывод чистой прибыли от использования по типам СС и всего editbox19.setText(PribCC1); editbox20.setText(PribCC2); editbox21.setText(PribCC3); editbox22.setText(PribCC4); editbox23.setText(PribCC5); editbox24.setText(SumPribil); //вывод коэфициентов прибыли по типам СС и всего editbox25.setText(koefPribCC1); editbox26.setText(koefPribCC2); editbox27.setText(koefPribCC3); editbox28.setText(koefPribCC4); editbox29.setText(koefPribCC5); editbox30.setText(koefPribil); //вывод затрат на содержание резервов по типам СС и всего editbox31.setText(ZatrResCC1); editbox32.setText(ZatrResCC2); editbox33.setText(ZatrResCC3); editbox34.setText(ZatrResCC4); editbox35.setText(ZatrResCC5); editbox36.setText(SumZatrRes); //вывод коэфициента готовности системы связи КоэфГотСС=(degCC1.statsUtilization.mean()+ degCC2.statsUtilization.mean()+ degCC3.statsUtilization.mean()+ degCC4.statsUtilization.mean()+ degCC5.statsUtilization.mean())/КолТипСС; editbox37.setText(КоэфГотСС);
Из кода следует, что по окончании моделирования, которое длится 1 000 000 единиц модельного времени, сработает метод событие, будут рассчитаны и выведены результаты моделирования.
Для округления результатов моделирования (коэффициентов прибыли до трех знаков после запятой, а абсолютных величин прибыли и затрат - до двух знаков) использован метод round(). Предварительно результат умножался на 1000 и 100, а потом делился на эти же величины.
Для вывода результатов моделирования в текстовые поля editbox используется функция setText(), в качестве аргумента которой указывается имя элемента Переменная, например,
editbox1.setText(DoxMaxCC1);