Моделирование передвижения людей



В модели на данный момент люди неподвижно находятся в определенных местах. Чтобы сделать модель более реалистичной, смоделируем передвижение людей по рассматриваемой области.

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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!