Моделирование передвижения людей
В модели на данный момент люди неподвижно находятся в определенных местах. Чтобы сделать модель более реалистичной, смоделируем передвижение людей по рассматриваемой области.
1) Откройте структурную диаграмму класса Person.
2) Создайте вспомогательные переменные oldx и oldy типа double. Для обеих переменных задайте Начальное значение uniform(300). Создайте переменную tmoved типа double. Задайте Начальное значение -10.
3) Создайте новое Событие. Назовите его moveTimer. Событие должно быть циклическим. Задайте Таймаут uniform(5,10). Задайте Действие при срабатывании таймера:
oldx=person.x;
oldy=person.y;
tmoved=time();
person.x=triangular(0,150,300);
person.y=triangular(0,150,300);
При срабатывании таймера текущее модельное время, возвращаемое функцией time (), запоминается переменной tmoved. Переменные oldx и oldy запоминают текущие координаты агента x и y. Новые координаты генерируются по треугольному закону распределения с минимальным значением, равным 0, средним – 150 и максимальным – 300.
4) Создайте две алгоритмические функции, которые помогут более плавно рисовать движение людей на анимации.
Для этого перетащите соответствующий элемент с палитры Основные на структурную диаграмму. Назовите функцию animationX. Задайте Тело функции:
if (time() > tmoved+0.5)
return person.x;
return oldx + (person.x-oldx)*(time()-tmoved)/0.5;
Аналогично создайте алгоритмическую функцию animationY:
if (time() > tmoved+0.5)
return person.y;
return oldy + (person.y-oldy)*(time()-tmoved)/0.5;
5) Откройте свойство Person (рис. 27) и на вкладке Агент укажите:
|
|
animationX();
animationY();
Рисунок 27
6) Запустите модель и проследите за перемещением людей с помощью анимации.
В созданной модели число людей, проживающих в изучаемой нами области, является постоянным. На самом деле всегда происходит миграция людей – они переезжают из одной области в другую, и это тоже необходимо учесть в модели. Смоделируем миграцию людей с помощью таймеров.
7) Откройте структурную диаграмму класса Main и создайте новое Событие. Назовите его inMigration. Событие должно быть циклическим.
Задайте Таймаут exponential(20). В среднем в нашу область будут приезжать 20 человек в год (в качестве аргумента функции exponential() задается частота происхождения события). Задайте Действие add_people();.
8) Для моделирования того, как люди уезжают из области, создайте еще одно событие.
Откройте структурную диаграмму класса Person и создайте новое Событие. Назовите его outMigration. Событие должно срабатывать только один раз, поэтому установите флажок Срабатывает один раз. Задайте Таймаут exponential(0.02). Задайте Действие:
get_Main().remove_people( this );
if (isAdopter)
get_Main().adopters--;
else
get_Main().potadopters--;
9) Добавьте на анимацию метку, отображающую число жителей области.
Для этого в области просмотра анимации добавьте текстовую метку, отображающую следующий текст:
|
|
people.size()+” people”.
10) Запустите модель и изучите ее поведение. Окно просмотра анимации показано на рис. 28.
Рисунок 28
Контрольные вопросы
1. Каким образом описываются агенты в среде AnyLogic?
2. Как происходит взаимодействие агентов со средой в системе AnyLogic?
3. Как происходит взаимодействие агентов с другими агентами в системе AnyLogic?
4. В каких случаях нужно строить агентные модели?
5. Какими средствами строится интерфейс агентов в системе AnyLogic?
Практическая работа №8
Тема: Разработка многоагентной модели в AnyLogic
Цель: - изучить методологию агентного моделирования. Приобрести практические навыки работы c системой AnyLogic при построении агентных моделей.
Вид работы: фронтальный
Время выполнения: 2 часа
Ход работы
Дата добавления: 2020-04-25; просмотров: 177; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!