Опубликован: 07.11.2014 | Доступ: свободный | Студентов: 446 / 37 | Длительность: 15:17:00
ISBN: 978-5-9556-0161-8
Тема: САПР
Лекция 6:

Модель функционирования системы связи

Сегмент Статистика

Результаты моделирования выводятся в сегменте Имитация дежурства. Тем не менее, организуем вывод результатов моделирования, можно сказать, в более презентабельном виде. Для этого создадим сегмент Статистика (Рис. 5.12).

  1. Создайте область просмотра для размещения элементов сегмента Статистика.
  2. Перетащите элемент Область просмотра.
  3. Перейдите на панель Свойства.
  4. В поле Имя: введите статистика.
  5. Задайте Выравнивать по: Верхн. левому углу.
  6. Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  7. На странице Местоположение и размер введите в поля X: 0, Y: 1076, Ширина: 960, Высота: 630.
  8. Перетащите элемент Прямоугольник.
  9. На странице Местоположение и размер введите в поля X: 20, Y: 1116, Ширина: 930, Высота: 580.
    Сегмент Статистика

    увеличить изображение
    Рис. 5.12. Сегмент Статистика
  10. Перетащите элемент text и в поле Текст: введите Результаты моделирования. На странице Местоположение и размер введите в поля X: 360, Y: 1126.
  11. Перетащите еще тринадцать элементов text, разместите и введите в соответствующие поля Текст: надписи, как на Рис. 5.12. Например, при размещении надписи Максимальный доход по типам СС укажите в полях X: 100, Y: 1160, при размещении надписи Коэффициенты использования типов средств связи укажите в полях X: 280, Y: 1490, а при размещении надписи Затраты на содержание резервов по типам средств связи в полях X: 280, Y: 1440.
Использование элемента Текстовое поле

Текстовое поле является простейшим текстовым элементом управления, позволяющим пользователю вводить небольшие объемы текста. Вы можете также связать этот элемент управления с переменной или параметром типа String, double или int. Мы будеи выводить в эти текстовые поля результаты моделирования.

  1. Копированием разместите согласно Рис. 5.12 элементы Текстовое поле. При копировании используйте следующие рекомендации. Перетащите первый элемент Текстовое поле. В поле Имя: дайте ему имя editbox1.
  2. На странице Внешний вид в полях Шрифт: установите шрифт по своему усмотрению из выпадающего списка или оставьте предложенный, размер шрифта установите 14.
  3. На странице Местоположение и размер введите в поля X: 70, Y: 1210, Ширина: 80, Высота: 20.
  4. Скопируйте editbox1. Вставьте ещё пять таких элементов. При вставке ориентируйтесь на клетки рабочего поля. Например, в данном случае между элементами по вертикали две клетки.
  5. Слева от элементов, используя элемент Текст, разместите номера типов СС 1…5. Шестому элементу введите имя Сумма.
  6. Скопируйте только что созданные номера элементов Текстовое поле и сами элементы. Вставьте скопированное четыре раза.
  7. Вставьте пятый раз. Разместите шесть элементов Текстовое поле горизонтально как на Рис. 5.12.
  8. Перетащите элемент Текстовое поле с именем editbox37. С использованием элемента Текст введите Коэффициент готовности системы связи.
Таблица 5.5. Имена элементов Текстовое поле
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 поддерживает несколько видов диаграмм.

Простые диаграммы:

  • столбиковая диаграмма;
  • диаграмма с накоплением;
  • круговая диаграмма.

Диаграммы с историей (временные диаграммы):

  • график;
  • временной график;
  • временная диаграмма с накоплением;
  • временная цветовая диаграмма.

Используйте диаграмму с накоплением.

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

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

  1. Перетащите первый элемент Диаграмма с накоплением из палитры Статистика и разместите согласно Рис. 5.12.
  2. На панели Свойства установите: Масштаб: Фиксированный, Обновлять данные автоматически.
  3. На странице Внешний вид установите:
    • Направление: вертикальное
    • Цвет текста, цвет фона и цвет границы установите по своему усмотрению.
  4. На странице Местоположение и размер введите в поля X: 40, Y: 1510, Ширина: 230, Высота: 180.
  5. На странице Легенда установите Высота: 20, Расположение сверху.
  6. На страницы Область диаграммы введите в поля Смещение по оси X: 40, Смещение по оси Y: 10, Ширина: 60, Высота: 140.
  7. Щёлкните Добавить элемент данных.
  8. В поле Заголовок: введите СС1.
  9. В поле Значение: введите Java код
    degCC1.statsUtilization.mean()
  10. Скопируйте первый элемент Диаграмма с накоплением.
  11. Вставьте четыре элемента 2…5. После вставки в полях Заголовок: вставленных элементов внесите правки для получения имён СС2, СС3, СС4, СС5 соответственно.
  12. В поле Значение: вводите Java коды также для элементов 2…5 соответственно:
    degCC2.statsUtilization.mean()
    degCC3.statsUtilization.mean()
    degCC4.statsUtilization.mean()
    degCC5.statsUtilization.mean()

На этом построение сегмента Статистика завершено.

Использование способа Событие

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

Есть три типа событий.

Событие, происходящее по истечении таймаута. Оно используется тогда, когда Вам нужно запланировать выполнение какого-то действия на определенный момент времени (отстоящий на заданное количество времени (таймаут) от текущего момента). Событие, происходящее по истечению таймаута, предоставляет дополнительные возможности: вы можете сделать событие циклическим, либо же вообще управлять этим событием "вручную".

Событие, происходящее при выполнении заданного условия. Оно используется тогда, когда Вам нужно отслеживать выполнение определенного условия и производить какое-то действие при его происхождении.

Событие, происходящее с заданной интенсивностью. Оно используется для моделирования потока независимых событий (пуассоновский поток). Это часто требуется при моделировании поступления, например, заявок в системах массового обслуживания.

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

Для вывода результатов моделирования воспользуйтесь событием, происходящим по истечении таймаута.

  1. Перетащите элемент Событие из палитры Основная на диаграмму размещения элементов Переменная для вывода результатов моделирования (Рис. 5.10). Измените его имя на РезультатыМоделирования. Нажмите Enter.
  2. Установите флажок Отображать имя. С помощью выпадающего списка Tип события: выберите По таймауту.
  3. Установите Режим: Срабатывает один раз.
  4. Время срабатывания (абсолютное) 1000000.
  5. В поле Действие введите 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);
Игорь Маникин
Игорь Маникин

Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю?

Еще раз спасибо за прекрасный курс!

Артём Нагайцев
Артём Нагайцев

Выдает ошибку "entity cannot be resolved to a variable" при попытке запуска. В чем может быть причина? Ошибка в строках

entity.time_vxod=time(); 

time_obrabotki.add(time()-entity.time_vxod);