Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные AnyLogic.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.45 Mб
Скачать
  1. Моделирование передвижения людей

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

    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.

    1. Создайте две алгоритмические функции, которые помогут более плав- но рисовать движение людей на анимации.

Для этого перетащите соответствующий элемент с палитры Основные на структурную диаграмму. Назовите функцию 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;

    1. Откройте свойство Person (рис. 66) и на вкладке Агент укажите:

animationX(); animationY();

Рис. 66

    1. Запустите модель и проследите за перемещением людей с помощью анимации.

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

    1. Откройте структурную диаграмму класса Main и создайте новое Со- бытие. Назовите его inMigration. Событие должно быть циклическим.

Задайте Таймаут exponential(20). В среднем в нашу область будут приезжать 20 человек в год (в качестве аргумента функции exponential() задает- ся частота происхождения события). Задайте Действие add_people();.

    1. Для моделирования того, как люди уезжают из области, создайте еще одно событие.

Откройте структурную диаграмму класса Person и создайте новое Собы- тие. Назовите его outMigration. Событие должно срабатывать только один раз, поэтому установите флажок Срабатывает один раз. Задайте Таймаут exponential(0.02). Задайте Действие:

get_Main().remove_people( this );

if (isAdopter)

get_Main().adopters--;

else

get_Main().potadopters--;

    1. Добавьте на анимацию метку, отображающую число жителей области.

Для этого в области просмотра анимации добавьте текстовую метку, отобра- жающую следующий текст:

people.size()+” people”.

    1. Запустите модель и изучите ее поведение. Окно просмотра анимации показано на рис. 67.

Рис. 67