А.Е.Осоргин_-_AnyLogic_6_Лабораторный_практикум. Министерство образования и науки российской федерации федеральное государственное образовательное учреждение среднего профессионального образования Поволжский государственный колледж
Скачать 3.11 Mb.
|
12.2. МОДЕЛЬ Создайте новую модель Сегрегация на основе шаблона Агентное моделирование. Начальное количество агентов установите 9000 . Выберите тип пространства Дискретное , остальные параметры оставьте без изменения. 12.2.1. КЛАСС АКТИВНОГО ОБЪЕКТА – PERSON Откройте диаграмму класса Person , вы увидите небольшой квадратик в начале координат. Увеличьте масштаб для упрощения работы и выделите мышью этот квадрат. Во вкладке Дополнительные панели свойств укажите расположение по осям X и Y: 0 и 0, а ширину и высоту: 3 и 3, соответственно. Перейдите на вкладку Динамические и в поле Цвет заливки напишите: color Теперь, нужно объявить этот параметр color типа Color со значением по умолчанию: randomTrue( 0.5 ) ? Color.blue : Color.green Как Вы помните, это условное выражение присвоит начальное значение параметру color, с вероятностью 50%, либо синий, либо зеленый цвет. Из постановки проблемы видно, что каждый агент может быть «счастлив» и оставаться на месте, или «несчастлив» и стремиться переехать в другое место. Поэтому, в классе Person нужно объявить простую переменную счастье типа boolean . На этом с агентом пока закончим и перейдем к конструированию класса Main 12.2.2. КЛАСС АКТИВНОГО ОБЪЕКТА – MAIN Откройте диаграмму класса Main , вы увидите вложенный реплицированный объект people, объект environment и вложенную презентацию (небольшой квадрат), рис. 12.1. В свойствах вложенного объекта people мы увидим, что он связан со средой environment и, что в его основе лежит класс Person. Количество агентов можно изменить в поле Количество. В свойствах вложенного объекта environment, на вкладке Основные, следует поставить галочку в поле Выполнять шаги. На вкладке Дополнительные мы увидим, что наше пространство Дискретное2D, ширина, высота, число строк и столбцов – в соответствии с выбранными параметрами шаблона. Тип соседства – Мурово , то есть соседями считаются 87 агенты, располагающиеся в 8 соседних ячейках, в отличие от соседства Евклидово , где соседями считаются агенты, располагающиеся в 4 соседних ячейках. Объявим параметр порог , который будет управлять допустимым процентом соседей, принадлежащих к той же социальной группе, со значением по умолчанию 0,7 Для наглядного представления процесса сегрегации создайте презентацию модели, как показано на рис. 12.2. Размер прямоугольника презентации 500 на 650, цвет – зеленый. Размер прямоугольника рабочего поля 402 на 402, расположение 48 по осям X и Y, цвет – blanchedAlmond Для того, чтобы расположение агентов совпало с рабочим полем, переместите презентацию агента (небольшой квадрат) в позицию 50 по осям X и Y. Рис. 12.1 Для управления параметром порог создайте слайдер в нижней части презентации, установите пределы регулировки от 0 до 1. Для дополнительного удобства добавим кнопки, передвигающие бегунок слайдера на 1% вверх или вниз. В поле Действие: кнопки «–» впишите следующий код: порог = limitMin( 0, порог - 0.01 ); setControlValueToDefault( slider ); для кнопки «+» первая строка должна выглядеть иначе: порог = limitMax( порог + 0.01, 1 ); Здесь метод limitMin возвращает порог - 0.01 , если он больше или равен 0, соответственно limitMax возвращает порог + 0.01 , если он меньше или равен 1. Метод setControlValueToDefault устанавливает бегунок слайдера в соответствии с измененным параметром порог. 88 В нижней части презентации напишите текст: Предпочтение иметь соседей того же самого цвета: , а немного правее введите текст, показывающий значение параметра порог. Для этого во вкладке Динамические в поле Текст: введите: format(порог * 100) + "%" - это позволит избавиться от десятичных значений и добавит знак процентов к числу. Для того чтобы презентация открывалась в окне, совпадающем по размерам с нашей презентацией, откройте свойства эксперимента Simulation и на вкладке Окно измените ширину и высоту на значения 500 и 650 , соответственно. На вкладке Презентация выберите режим Виртуальное время – модель будет выполняться с максимальной скоростью. 12.2.3. ФУНКЦИОНИРОВАНИЕ МОДЕЛИ Для того чтобы наша модель работала, нужно написать, что делать агентам на каждом шаге. Откройте свойства класса активного объекта Person и перейдите на вкладку Агент. В поле Действие перед выполнением шага напишите следующий код на языке Ява: int рядом = 0; Agent[] соседи = getNeighbors(); // строим массив агентов - соседей if ( соседи == null ) { счастье = true ; // нет соседей - это тоже хорошо return ;} // выход for ( Agent a : соседи ) // перебираем весь массив соседей if (((Person)a).color == color) //сравниваем цвет соседа со своим рядом++; // если цвет совпал - суммируем //счастлив, если процент того же цвета больше/равен заданному порогу: счастье = (рядом >= get_Main().порог * соседи.length); В поле Действие на шаге напишите следующий код на языке Ява: if (!счастье && randomTrue(0.3)) //если не счастлив, то с вероятн. 0,3 jumpToRandomEmptyCell(); // переход на другую свободную клетку Комментарии можно не вводить. 12.2.4. СБОР СТАТИСТИКИ Реплицированные объекты поддерживают удобный способ сбора статистики. Поддерживаются следующие типы функций сбора статистики: • количество, • сумма, • среднее, • минимальное, • максимальное. 89 Откройте свойства реплицированного объекта people и перейдите на вкладку Статистика. Нажмите на кнопку Добавить ф-ю сбора статистики. В появившиеся поля введите: • Имя: people_Сч • Тип: кол-во • Условие: item.счастье Текущий элемент реплицированного объекта (т.е. тот, по которому в текущий момент проходит итерационный цикл функции сбора статистики) доступен в этих полях как item В приведенном примере мы будем подсчитывать число «счастливых» людей, т.е. агентов у которых переменная счастье имеет значение true Заданную функцию сбора статистики можно будет вызывать, как и любую другую функцию: написав ее имя, после которого должны следовать круглые скобки. То есть, чтобы произвести сбор статистики с помощью заданной выше функции, нужно будет написать people_Сч(). Аналогичным образом добавьте функцию сбора статистики people_Не для «несчастных» людей. Рис. 12.2 Для отображения статистических данных можно использовать элементы из палитры Статистика. Перенесите на презентацию элемент Круговая диаграмма. В свойствах на вкладке Основные нажмите на кнопку Добавить элемент данных и в появившиеся поля введите: 90 • Заголовок: Несчастливы • Значение: people.people_Не() • Цвет на Ваше усмотрение Добавьте аналогичным образом еще один элемент данных для «счастливых» людей и перейдите на вкладку Внешний вид. Здесь выберите Расположение легенды справа от диаграммы, а Цвет текста: желтый, рис. 12.2. Запустите модель, изучите ее поведение и выполните необходимые доработки в соответствии с заданием. 12.3. КОНТРОЛЬНЫЕ ЗАДАНИЯ Для выполнения задания необходимо использовать справочную систему AnyLogic, в частности статьи: Агенты, Дискретное пространство, Среда и д.р. 1. Доработайте модель таким образом, чтобы переезд на другое место для 1-го типа происходил, если соседи справа-сверху и справа-снизу – другие, а для 2-го типа, если соседи слева-сверху и слева-снизу – другие. (5) 2. Доработайте модель таким образом, чтобы порог, сдерживающий людей от переезда на другое место, понижался в зависимости от времени проживания. После переезда порог – высокий, потом постепенно снижается и вынуждает к новому переезду. (5) 3. Доработайте модель таким образом, чтобы производился подсчет, и показывалось число неудовлетворенных агентов без использования функции сбора статистики. (5) 4. Добавьте в модель текстовое поле для выбора агента и флажок. При установленном флажке выбранный агент циклически перемещается на свободную ячейку. (5) 5. С помощью функции сбора статистики постройте временной график среднего времени «проживания» людей на одном месте. (5 ) 6. С помощью функции сбора статистики постройте столбиковую диаграмму, показывающую в каждом столбце число агентов с определенным количеством соседей (от 0 до 8). (5 ) 7. С помощью функции сбора статистики постройте столбиковую диаграмму, показывающую в каждом столбце число агентов с определенным количеством соседей того же типа (от 0 до 8). (5 ) 8. С помощью функции сбора статистики постройте столбиковую диаграмму, показывающую в каждом столбце число агентов с определенным количеством соседей противоположного типа (от 0 до 8). (5 ) 9. Доработайте модель таким образом, чтобы в моделировании участвовало 3 типа агентов, и на диаграмме показывалось сколько агентов имеют соседей только своего типа, сколько – одного другого, сколько двух других и сколько всех трех типов. (5) 10. Доработайте модель таким образом, чтобы переезд на другое место происходил, если сосед сверху – другой. (4) 11. Доработайте модель таким образом, чтобы переезд на другое место происходил, если сосед справа-сверху – другой. (4) 12. Добавьте в модель кнопку, при нажатии которой, случайно выбранный агент переедет на другое место. (4) 13. Доработайте модель таким образом, чтобы переезд на другое место происходил, если соседи справа-сверху и слева-сверху – другие. (4) 14. Доработайте модель таким образом, чтобы переезд на другое место происходил, если сосед справа – другой. (4) 91 15. Как установить синхронизацию действий агентов? (3) 16. С помощью функции сбора статистики постройте график зависимости количества «счастливых» и «несчастных» людей от времени. (3 ) 17. Какие преимущества и недостатки дает объявление реплицированных объектов агентами? (3) 92 ЗАДАНИЯ 13-14 ENTERPRISE LIBRARY: МОДЕЛИРОВАНИЕ ТРАНСПОРТНЫХ СИСТЕМ ЦЕЛИ ЗАНЯТИЯ • освоение методов дискретно-событийного моделирования; • знакомство с библиотекой Enterprise Library; • построение модели транспортной системы. ФОРМА ОРГАНИЗАЦИИ ЗАНЯТИЯ Фронтальная. СТУДЕНТ ДОЛЖЕН ЗНАТЬ понятия: дискретно-событийная система, параметры объекта; интерфейс программы AnyLogic. СТУДЕНТ ДОЛЖЕН УМЕТЬ создавать модели в программе AnyLogic, ОБЕСПЕЧЕННОСТЬ компьютер с установленной программой AnyLogic версии 6, настоящий курс лабораторно-практических работ. ПРАКТИЧЕСКОЕ ЗАДАНИЕ О БИБЛИОТЕКЕ ANYLOGIC ENTERPRISE LIBRARY Библиотека Enterprise Library подерживает дискретно-событийный подход моделирования. С помощью объектов библиотеки можно моделировать системы реального мира, динамика которых представляется последовательностью операций (прибытие, задержка, разделение и т.п.) над некими сущностями, представляющими клиентов, документы, звонки, пакеты данных, транспортные средства и т.п. Процессы задаются в форме потоковых диаграмм (блок-схем) в графическом представлении. Объекты библиотеки Enterprise Library являются «кирпичиками» для построения блок- схемы, моделирующей процессы, происходящие с заявками. 13.1. ПОСТАНОВКА ЗАДАЧИ Рассмотрим простую систему, предоставляющую собой транспортную развязку, например, перекресток. Через перекресток движутся потоки автомобилей. Для упорядочивания движения служит автоматический светофор или регулировщик. Наиболее типичной целью 93 исследования в подобных задачах является оценка эффективности системы, т.е. нахождение числовых значений характеристик, описывающих качество управления системой. Такими характеристиками могут быть, например, время, требуемое для проезда перекрестка, длина очереди перед светофором и др. Требуется построить имитационную модель транспортной развязки по индивидуальному заданию и отобразить гистограмму времени её проезда. 13.2. МОДЕЛЬ Создайте новую модель Дорога на основе шаблона Дискретно-событийное моделирование. Поставьте галочки напротив выборов: Добавить гистограмму распределения времени пребывания в системе, Добавить график, а в Анимации укажите 3D . Пункт – Использовать ресурсы выбирать не нужно. AnyLogic создаст модель, как показано на рис. 13.1. В верхнем левом углу расположена потоковая диаграмма, состоящая из 4-х элементов: source, queue, delay и sink Рассмотрим их подробнее. Рис. 13.1 Source – создает заявки, в настраиваемые моменты времени. Объект Source не разрешает заявкам храниться в буфере выходного порта, если они не могут покинуть объект. Поэтому в случае, когда за объектом source расположен объект, который по той или иной причине не может принять новую заявку, нужно между ними поставить специальный объект буферизации, например, queue 94 Queue – хранит заявки в определенном порядке. Моделирует очередь заявок, ожидающих приема объектами, следующими за ним в потоковой диаграмме. Delay – задерживает заявки на заданный период времени. Время задержки вычисляется динамически, может быть случайным или зависеть от каких-то других условий. Это время может вычисляться как длина фигуры анимации этого объекта, поделенной на "скорость" заявки. Sink – уничтожает поступившие заявки. Обычно используется в качестве конечной точки потока заявок. Запустите модель и посмотрите, как она работает. 13.3. ПЕРЕКРЕСТОК Автомобили подъезжают к перекрестку в произвольные моменты времени, поэтому объект source также должен создавать заявки в случайные моменты времени. Выделите объект source , и в строке свойств Заявки прибывают согласно выберите Времени между прибытиями . В появившемся поле ввода времени между прибытиями запишите exponential(0.1) . Функция exponential генерирует реализацию случайной величины с экспоненциальным законом распределения. Остальные параметры этого объекта пока оставим без изменения. В свойствах объекта queue следует удалить связь с анимацией: в поле Фигура анимации панели свойств, удалите ссылку на polyline. Заявки, находящиеся в очереди, анимироваться не будут. Этот объект будет выполнять буферную функцию для предотвращения ошибки в момент, когда source создал заявку, а delay еще не готов ее принять. В свойствах объекта delay следует сделать следующие изменения: • Задержка задается – укажите: Как длина пути/скорость , • Время задержки – исправьте на triangular(5., 10., 15.), • Вместимость – исправьте на 10, • Фигура анимации – исправьте на polyline, • Тип анимации – исправьте на Путь Изменим фигуру анимации, вместо человечка пусть будет автомобиль. Откройте палитру 3D Объекты и перенесите мышью объект Автомобиль на диаграмму класса Main . Этот элемент получит имя по умолчанию car . В свойствах объекта source измените поле Фигура анимации заявки на car и поставьте галочку в поле Разрешить вращение. При запуске, модель должна выглядеть, как показано на рис. 13.2. Подъехав к перекрестку, автомобили должны перестроиться в 3 потока для проезда прямо, и поворотов направо и налево. Смоделируем это действие. Для разделения потока заявок служат объекты selectOutput и selectOutput5 Перенесите из палитры Enterprise Library на диаграмму класса Main объект 95 selectOutput5 и поместите его между delay и sink , предварительно удалив связь между ними. SelectOutput5 направляет входящие заявки в один из пяти выходных портов в зависимости от выполнения заданных условий. В свойствах этого объекта укажите Вероятность 0, Вероятность 1 и Вероятность 2 – равными 1/3. , а Вероятность 4 и 5 сделайте равной 0. Рис. 13.2 Двигаясь в 3 потока, автомобили должны останавливаться перед стоп-линией на красный сигнал светофора. Для моделирования движения с остановкой подходит объект Conveyor , который моделирует конвейер, который перемещает заявки по пути заданной длины с заданной скоростью (одинаковой для всех заявок), сохраняя их порядок и оставляя заданные промежутки между ними. Когда заявка достигает конца конвейера, но не может его покинуть, то она там и останется. Если конвейер – накапливающий, то он продолжит двигать заявки, которые имеют достаточно свободного места перед собой. Перенесите из палитры Enterprise Library на диаграмму класса Main три объекта conveyor и поместите их между selectOutput5 и sink . Так как в объекте selectOutput5 заявки не могут оставаться, а конвейер может оказаться не готовым их принять, нужно между ними добавить буферный объект queue . Соедините объекты, как показано на рис. 13.3. Для анимации движения заявок (автомобилей) по конвейеру (зоне остановки перед 96 светофором) нужно нарисовать три ломаных линии и связать их с соответствующим объектом conveyor. Рис. 13.3 Чтобы не запутаться при построении модели, необходимо в названиях объектов, относящихся к одному потоку придерживаться следующих правил: объекты потока № 1 до разделения по направлениям нумеровать соответствующей цифрой, например: polyline1 , delay1 и т.д.; объекты этого же потока после разделения по направлениям следует называть так: polyline11 – для потока, движущегося через перекресток прямо, polyline1R1 и polyline1L1 – для потоков, движущихся через перекресток соответственно направо и налево. Рис. 13.4 Нарисуйте ломаные и переименуйте все объекты в соответствии с рис. 13.4. В свойствах объектов conveyor следует сделать следующие изменения: • Длина задается – укажите: Согласно пути , • |