Опубликован: 15.02.2013 | Доступ: свободный | Студентов: 256 / 0 | Длительность: 16:52:00
ISBN: 978-5-9556-0146-5
Лекция 6:

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

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

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

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

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

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

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

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

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

  1. Перетащите элемент Событие из палитры Модель на диаграмму класса активного объекта. Измените его имя на ResulsModeling. Нажмите Enter.
  2. Установите флажок Отображать имя.
  3. С помощью выпадающего списка Tип события: выберите По таймауту.
  4. Установите Режим: Срабатывает один раз.
  5. Время срабатывания (абсолютное) 1000000.
  6. В поле Действие введите Java код, который будет выполняться при появлении этого события.
    //Расчет результатов по СС1
    DoxDegCC1=round((DoxDegCC1/КолПрогон)*100);
    DoxDegCC1=DoxDegCC1/100;
    ZatrRemCC1=round((ZatrRemCC1/КолПрогон)*100);
    ZatrRemCC1=ZatrRemCC1/100;
    UbitokCC1=round((1-degCC1.statsUtilization.mean())*get_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())*get_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())*
    get_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())*
    get_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())*
    get_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);
    editbox11.setText(DoxDegCC1);
    editbox2.setText(DoxMaxCC2);
    editbox12.setText(DoxDegCC2);
    editbox3.setText(DoxMaxCC3);
    editbox13.setText(DoxDegCC3);
    editbox4.setText(DoxMaxCC4);
    editbox14.setText(DoxDegCC4);
    editbox5.setText(DoxMaxCC5);
    editbox15.setText(DoxDegCC5);
    editbox.setText(SumDoxMax);
    editbox16.setText(SumDoxDeg);
    //вывод стоимости ремонта по типам СС и всего
    editbox21.setText(ZatrRemCC1);
    editbox22.setText(ZatrRemCC2);
    editbox23.setText(ZatrRemCC3);
    editbox24.setText(ZatrRemCC4);
    editbox25.setText(ZatrRemCC5);
    editbox26.setText(SumZatrRem);
    //вывод чистой прибыли от использования по типам СС и всего
    editbox31.setText(PribCC1);
    editbox32.setText(PribCC2);
    editbox33.setText(PribCC3);
    editbox34.setText(PribCC4);
    editbox35.setText(PribCC5);
    editbox36.setText(SumPribil);
    //вывод коэфициентов прибыли по типам СС и всего
    editbox41.setText(koefPribCC1);
    editbox42.setText(koefPribCC2);
    editbox43.setText(koefPribCC3);
    editbox44.setText(koefPribCC4);
    editbox45.setText(koefPribCC5);
    editbox46.setText(koefPribil);
    //вывод затрат на содержание резервов по типам СС и всего
    editbox6.setText(ZatrResCC1);
    editbox7.setText(ZatrResCC2);
    editbox8.setText(ZatrResCC3);
    editbox9.setText(ZatrResCC4);
    editbox10.setText(ZatrResCC5);
    editbox17.setText(SumZatrRes);

Из кода следует, что по окончании моделирования, которое длится 1 000 000 единиц модельного времени, сработает метод событие, будут рассчитаны и выведены результаты моделирования.

Для округления результатов моделирования (коэффициентов прибыли до трех знаков после запятой, а абсолютных величин прибыли и затрат - до двух знаков) использован метод round(). Предварительно результат умножался на 1000 и 100, а потом делился на эти же величины.

Для вывода результатов моделирования в текстовые поля editbox используется функция setText(), в качестве аргумента которой указывается имя элемента Простая переменная, например, editbox1.setText(DoxMaxCC1);

Запустите модель. На рис. 5.13 и рис. 5.14 показаны результаты моделирования.

Результаты моделирования

увеличить изображение
Рис. 5.13. Результаты моделирования
Результаты сегмента Статистика

увеличить изображение
Рис. 5.14. Результаты сегмента Статистика
Алексей Гроссман
Алексей Гроссман

Здравствуйте, прошел курс "Концептуальное проектирование систем в AnyLogic и GPSS World". Можно ли получить по нему сертификат? У нас в институте требуют сертификаты для создания портфолио.

Елена Блинаева
Елена Блинаева