Эксперт по сдаче вступительных испытаний в ВУЗах
Тихвинский В.И.
Практическая работа № 3 по курсу Многоагентное моделирование
1. ПОСТАНОВКА ЗАДАЧИ
Необходимо построить модель, изучающую распространение инфекционного заболевания среди населения. Численность населения пусть будет равна 10 000 человек, и задаваться параметром с именем TotalPopulation. На первоначальном этапе заражения популяции болен один человек, а все остальные лишь восприимчивы к болезни. Человек, в организм которого попал вирус, становится латентно зараженным. Латентно зараженные люди, это те люди, у которых инкубационный период для вируса еще не прошел, и нет выраженных симптомов болезни, в этот период вирус в организме человека не способен заражать других людей. После инкубационного периода человек становится больным с выраженными симптомами, и вирус, находящийся в его организме, способе заражать других людей на протяжении болезни человека. Любой человек после выздоровления становится невосприимчивым к болезни т.к. у него вырабатывается иммунитет.
Для решения задачи введем параметр ContactRateInfectious, он показывает, что один зараженный человек в среднем контактирует с другими незараженными людьми с интенсивностью равной 1,25 человек в день.
Вероятность передачи инфекции восприимчивому к болезни человеку будет равна 0.6 и задаваться параметром Infectivity.
Длительность инкубационного периода в днях задается параметром AverageIncubationTime и равна 10.
Средняя длительность болезни после инкубационного периода составляет 15 дней и задается параметром AverageIllnessDuration.
Название нашей модели SEIR. SEIR – это аббревиатура, образованная сокращением названий основных стадий распространения инфекции: Susceptible — Exposed — Infectious — Recovered.
• Susceptible – Восприимчивые к заражению люди, которые еще не были заражены вирусом.
• Exposed – Люди, находящиеся в латентной стадия заражения (они уже заражены, но еще не могут заражать других).
• Infectious – Люди в активной стадии заражения (они могут заражать других людей).
• Recovered – Выздоровевшие люди (они приобрели иммунитет к данному заболеванию).
Стадии распространения инфекций естественным образом определяют четыре накопителя модели, по одному на каждую стадию заболевания, имя накопителей совпадает с названиями стадий.
2. ЭТАП 1 СОЗДАНИЕ ДИАГРАММЫ ПОТОКОВ И НАКОПИТЕЛЕЙ
1. Создадим новую модель через пункт меню: Файл-Создать-Модель. Назовем модель SEIR и выберем дни в качестве единиц модельного времени (Рис. 1).
Рис. 1. Создание новой модели
2. Откроем палитру Системная Динамика и перетащим элемент Накопитель из палитры Системная динамика на диаграмму Main(см. Рис. 2). Назовем его Susceptible.
Рис. 2. Установка накопителя
3. Аналогичным образом создадим накопители Exposed, Infectious и Recovered (Рис. 3).
Рис. 3. Четыре накопителя системы
4. Добавим первый поток, который ведет из накопителя Susceptible в накопитель Exposed. Для этого щелкнем двойным кликом мыши по накопителю, из которого поток выходит (Susceptible) и затем щелкнем по накопителю, в который поток входит (Exposed) (Рис. 4).
Рис. 4. Добавление потока
5. Назовем поток ExposedRate. После создания и переименования потока автоматически создадутся соответствующие формулы накопителей (Рис. 5).
Рис. 5. Созданный поток с автоматически созданными формулами
6. Создадим еще два потока модели с именами InfectiousRate,
RecoveredRate (Рис. 6).
Рис. 6. Три потока модели
7. Расположим метки с именами потоков, как показано на рисунке 7.
Чтобы переместить метку, выделим поток в графическом редакторе и затем
переместим метку с именем.
Рис. 7. Изменение расположения меток потоков
8. Добавим пять Параметров перетащив их с панели палитра на
диаграмму Main, и через панель свойств зададим им имена и значения по
умолчанию TotalPopulation = 10000, Infectivity = 0.6, ContactRateInfectious =
1.25, AverageIncubationTime = 10, AverageIllnessDuration = 15 (см. Рис. 2.44).
Рис. 8. Параметры модели
9. Через панель свойств зададим накопителю Infectious начальное
значение равное 1.
10. Зададим накопителю Susceptible начальное значение равное
TotalPopulation-1 (Рис. 9). Для ввода формулы вызовем мастер подстановки
кода (горячие клавиши Ctrl+пробел, в Mac OS: Alt+пробел), затем выберем имя
параметра из мастера подстановок.
Рис. 9. Начальное значение накопителя Susceptible
11. Нарисуем связь, ведущую из параметра TotalPopulation в накопитель
Susceptible. Для этого щелкнем двойным кликом мышью по элементу Связь
палитры Системная динамика, затем щелкнем по параметру TotalPopulation и
затем щелкнем по накопителю Susceptible (Рис. 10).
Рис. 10. Последовательность двойных щелчков мыши для создания линий
связей
12. Зададим формулу потока ExposedRate. Для этого выделим поток
щелчком мыши и введем следующую формулу с помощью мастера
подстановки кода:
Infectious*ContactRateInfectious*Infectivity*Susceptible/TotalPopulation
Рис. 11. Формула потока ExposedRate
13. Создадим новые связи. Для этого в графическом редакторе кликнем правой кнопкой мыши по потоку ExposedRate и выберем опцию Исправить ошибки в связях-Создать недостающие связи из контекстного меню. При этом появятся недостающие для этого потока связи зависимостей (Рис. 12).
14. Зададим формулу Exposed/AverageIncubationTime для потока InfectiousRate, и формулу Infectious/AverageIllnessDuration для потока RecoveredRate.
15. Добавим все недостающие связи зависимостей (Рис. 13).
16. Запустим модель и исследуя динамику процесса с помощью похожих на виджеты информационных окон этих переменных. Открыть информационное окно переменной можно, щелкнув мышью по этой переменной. (Рис. 14).
Рис. 12. Обновление связей зависимостей
Рис. 13. Все обновленные связи зависимостей
17. Для переключения виджета в режим графика, щелкнем самый левый значок его панели управления(Рис. 14). Чтобы изменить размер окна, необходимо потянуть его мышью за правый нижний угол.
18. Для увеличения скорости выполнения модели необходимо кликнуть мышью по соответствующему элементу управления(Рис. 14).
Рис. 14. Запуск модели
3. ЭТАП 2 ДОБАВЛЕНИЕ ГРАФИКА ДЛЯ ВИЗУАЛЬНОЙ ДИНАМИКИ
ПРОЦЕССА
1. Перетащим элемент Цикл из палитры Системная динамика на
диаграмму(Рис. 15).
Рис. 15. Элемент цикла на диаграмме
2. Перейдем в панель Свойства и изменим Тип цикла на R (что означает
Reinforcing, то есть «усиливающий»). Оставим заданное по умолчанию
Направление: по часовой стрелке и укажим текст, который AnyLogic будет
отображать возле значка цикла: Contagion (то есть, «заражение»).
3. Перетащим элемент Временной график
из палитры Статистика
на диаграмму и увеличим размер графика( Рис. 16).
Рис. 16. Элемент временной график
4. Для добавления элемента данных, который будет отображаться на графике, в панели Свойства перейдем в раздел Данные и щелкнем по кнопке Добавить
(Рис. 17). В появившемся окне изменим свойства созданного элемента данных: Заголовок = Susceptible people (то есть, восприимчивые к заболеванию люди), Значение = Susceptible (при введении имени переменной используйте мастер подстановки кода) (Рис. 18).
Рис. 17. Добавление элемента данных
Рис. 18. Окно свойств элемента данных графика
5. Добавим еще три элемента данных, которые будут отображать
значения накопителей Exposed, Infectious, и Recovered соответственно.
Каждому элементу необходимо задать соответствующий заголовок(Рис. 19).
6. Запустим модель и изучим динамику распространения болезни с
помощью временного графика (Рис. 20).
Рис. 19. Задание свойств элементов данных графика
Рис. 20. Запуск модели с временном графиком
4. ЭТАП 3 ЭКСПЕРИМЕНТАЛЬНОЕ ВАРЬИРОВАНИЕ ПАРАМЕТРОВ
1. Чтобы создать эксперимент, щелкнем правой кнопкой мыши по модели
в панели Проекты и выберите из контекстного меню пункт Создать –
Эксперимент(Рис. 21). В появившемся окне Новый эксперимент введем
ContactRateVariation в поле Имя, оставим по умолчанию тип агента верхнего
уровня равным Main, выберем Варьирование параметров в списке Тип
эксперимента и нажмем кнопку Готово. (Рис. 22).
Рис. 21. Создание эксперимента
11
Рис. 22. Окно нового эксперимента
2. В панели свойств нового эксперимента перейдем в секцию
Параметры. Выберем в списке параметр ContactRateInfectious и измените его
минимальное и максимальное значения параметра (от Мин. 0.3 до Макс. 2), а
также зададим Шаг 0.1. (Рис. 23).
Рис. 23. Параметры в окне свойств
3. Выше в свойствах эксперимента, кликнем по кнопке Создать
интерфейс (Рис. 24). В графическом редакторе появится стандартный
интерфейс(Рис. 25), создаваемый по умолчанию для данного типа
эксперимента: текстовые метки, отображающие имена и текущие значения
параметров модели.
Рис. 24 Создание интерфейса
Рис. 25. Окно стандартного графического интерфейса
4. Для ограничения периода моделирования кликнем мышью по
эксперименту ContactRateVariation в панели Проекты, чтобы открыть панель
Свойства(Рис. 26). В свойствах эксперимента раскроем секцию Модельное
время. По умолчанию, в выпадающем списке Остановить уже выбрана опция
В заданное время, поэтому нам нужно только задать 300 в поле Конечное
время(Рис. 27).
Рис. 26. Эксперимент ContactRateVariation на панели Проекты
Рис. 27. Изменение конечного времени на панели свойств
5. Для добавления временного графика откроем диаграмму Main, затем
кликнем правой кнопкой мыши по накопителю Infectious и выберем из
контекстного меню опцию Создать набор данных (см. Рис. 28).
Рис. 28. Создание набора данных
6. Перейдем в панель свойств созданного набор данных InfectiousDS. Мы
хотим наблюдать за динамикой развития болезни во времени, поэтому оставим
выбранную опцию Использовать время в качестве значения по оси X. Выберем
опцию Обновлять данные автоматически и оставим Период равным 1, чтобы в
набор данных добавлялись новые измерения для каждого моделируемого дня.
Чтобы увидеть на графике все собранные значения, зададим в свойствах набора
данных: Хранить до 300 последних измерений (Рис. 29).
Рис. 29. Набора данных InfectiousDS
6. Откроем диаграмму эксперимента ContactRateVariation и перетащим
туда элемент Временной график
из палитры Статистика
. (Рис. 30).
7. Перейдем в свойства временного графика. В секции Масштаб на панели свойств и зададим Временной диапазон равным 300 единицам модельного времени.
8. Увеличим площадь графика, отведенную под легенду, потянув за ромбовидную метку(Рис. 30).
Рис. 30. Временной график на диаграмме эксперимента
9. Выделим эксперимент ContactRateVariation в панели Проекты и перейдем в его свойства. Добавим данные на график с помощью кода, который нужно ввести в секции свойства эксперимента Действия Java, в поле Действие после «прогона» модели: plot.addDataSet( root.InfectiousDS, «CR=» + format( root.ContactRateInfectious ) ); 1 (Рис. 31).
1 Мы бы хотели, чтобы наш график отображал по одной кривой на каждый прогон модели, но мы не можем сделать это привычным нам образом в свойствах графика. Причина в том, что каждый прогон модели уничтожает агента верхнего уровня и все его данные, поэтому пользователь должен самостоятельно позаботиться о сохранении данных модели на уровне эксперимента.
После каждого выполнения модели AnyLogic собирает данные в наборе данных InfectiousDS, который находится на диаграмме Main. Агент верхнего уровня эксперимента доступен здесь как root, поэтому, чтобы получить доступ к набору данных, мы указываем root.InfectiousDS.
Мы могли бы использовать функцию графика addDataset(root.InfectiousDS), чтобы добавить набор данных в график с заданным по умолчанию заголовком «Data set» и линией предустановленного цвета и толщины. Но мы хотим добавить для каждой кривую ее отличительную легенду, которая бы давала нам понять, какому именно прогону модели эта кривая соответствует. Поэтому мы используем нотацию функции addDataSet() с двумя аргументами: addDataSet(DataSet ds, String title).
Рис. 31. Действие после «прогона» модели
10. Откроем секцию свойств эксперимента Специфические и снимите
флажок с опции Разрешить параллельное выполнение итераций.
11. Запустим новый эксперимент, для этого выберием SEIR /
ContactRateVariation из списка вариантов кнопки Запустить или кликнем
правой кнопкой мыши по эксперименту в дереве модели и выберем Запустить.
12. Запустим новый эксперимент, для этого выберем SEIR /
ContactRateVariation из списка вариантов кнопки Запустить или кликнем
правой кнопкой мыши по эксперименту в дереве модели и выберем Запустить.
13. В появившемся окне кликнем по кнопке Запустить в окне
эксперимента (Рис. 32).
Рис. 32. Запуск нового эксперимента
Для каждой кривой мы формируем легенду в виде строки, состоящей из имени параметра
CR= («contact rate», то есть, «частота контактов») и его значения. Так как параметр
ContactRateInfectious задан в агенте верхнего уровня (доступном в коде эксперимента как
root), то мы получаем доступ к значению параметра, написав root.ContactRateInfectious.
Затем мы используем функцию format(double value), которая форматирует текстовое
представление численных данных (округляет такие значения, как 0.3000001 до 0.3).
В ходе эксперимента было выполнено 18 итераций для различных значений параметра ContactRateInfectious в диапазоне от 0.3 до 2, что и отражено на графике.
5. ЭТАП 4 КАЛИБРОВКА ПАРАМЕТРОВ МОДЕЛИ
1. Откроем диаграмму Main и добавим на нее Табличную функцию
из палитры Системная динамика. Назовем эту функцию InfectiousHistory.
2. Откроем текстовый файл HistoricData.txt из папки Каталог C:\Program Files\AnyLogic 8 Personal Learning Edition\resources\AnyLogic in 3 days\SEIR2 и скопируем содержимое текстового файла в буфер обмена, затем перейдем в секцию свойств табличной функции Табличные данные и кликнем по кнопке Вставить из буфера
. Столбцы таблицы Аргумент и Значение заполнятся данными (Рис. 33).
3. Открыв секцию свойств табличной функции Предв. просмотр, мы увидим кривую динамики распространения болезни, которая наблюдалась в реальной жизни(Рис. 34).
Рис. 33. Кнопка для вставки данных из буфера
2 Расположение файла зависит от той папки, в которую был установлен AnyLogic.
Рис. 34. Кривая построенная по данным
4. Выше в свойствах, выберем у параметра Если аргумент выходит за
пределы опцию Ближайший(Рис. 35). В этом случае функция будет корректно
обрабатывать случаи, когда функции передается аргумент, лежащий за
пределами интервала аргументов, заданного нами в секции Табличные данные.
Рис. 35. Выбор аргумента Ближайший
5. Кликнем правой кнопкой мыши по модели SEIR в панели Проекты и
выберите из контекстного меню пункт Создать-Эксперимент. В окне мастера
Новый эксперимент выберем Калибровка в секции Тип эксперимента и затем
щелкните Далее.
6. Мы выбрали эксперимент калибровки, в этом случае настройка
параметров эксперимента проводится прямо в окне Мастера создания
эксперимента. Изменим тип параметров, которые мы хотим калибровать
(Infectivity и ContactRateInfectious), с фиксированного на непрерывный. Зададим
минимальное (Мин) и максимальное (Макс) значения диапазона калибровки
(Рис. 36).
Рис. 36. Изменение параметров калибровки
7. Введите следующую информацию в расположенную ниже таблицу
критериев калибровки:
• Заголовок: Infectious curve match
• Тип: выберите из списка набор данных
• Результат моделирования: root.InfectiousDS
• Реальные данные: root.InfectiousHistory
• Коэффициент: 1.0 (Рис. 37).
Рис. 37. Изменение критерия
8. Кликнем по кнопке Готово. При этом откроется диаграмма
эксперимента Calibration с созданным по умолчанию интерфейсом этого
эксперимента (Рис. 38).
Рис. 38. Диаграмма эксперимента
9. В панели свойств эксперимента введем необходимые данные (Рис. 39).
Рис. 39. Оптимизация эксперимента методом минимальных квадратов
10. Откроем секцию свойств Специфические и снимем флажок
Разрешить параллельное выполнение итераций.
11. Запустим эксперимент кликнув правой кнопкой мыши в панели
Проекты по эксперименту Calibration и выберем Запустить из
контекстного меню.
12. Когда эксперимент калибровки будет завершен, вы сможете
скопировать полученные значения параметров, щелкнув по кнопке copy. Чтобы
использовать скопированные значения параметров в нашем эксперименте
Simulation, щелкните по кнопке Вставить из буфера на странице свойств этого
эксперимента (Рис. 40).
Рис. 40. Окно запуска эксперимента
Ссылка на первоисточник:
https://mocotms.info/