

2.На вкладкеДополнительныеокнаСвойства,установитефлажокСтоп по времени.
Вполередактированиясправавведите8.Модельостановитсяпослетого,
какистекут8единицмодельноговремени.
1.7 Запуск модели
ПостройтеВашпроектспомощьюкнопкипанелиинструментовПостроить . Есливпроектеестькакие-нибудь ошибки,топостроениенебудетзавершено,и появитсяокноВыводсоспискомвсехошибок,обнаруженныхвпроекте.Двойны
м
щелчкоммышипоошибкевэтомспискеВыможетеперейтикпредполагаемому местуошибки,чтобыисправитьее.
Послетого,какВашпроектбудетудачнопостроен,Выможетезапуститьмодель , щелкнувмышьюпокнопкепанелиинструментовЗапустить
.ДоэтогомоментаВы работаливрежимередактированияпакетаAnyLogicTM.КогдаВызапустите модель,AnyLogicпереключитсяв режимпросмотра.В режимепросмотраВы
108
можетеуправлятьвыполнениеммодели,строитьграфики переменных,
динамическиизменятьзначенияпараметров,ит.д.
109
1.8
Изучениединамикипроцесс
а
С помощью диаграмм Вы можете понаблюдать за динамикоймоделируемого процесса.Сейчасмысоздадимдиаграмму,отображающуюдинамикуизменения
числапотребителей ипотенциальных потребителей продукта.
►Создайтедиаграмму
1.Подготовьтемоделькзапуску,щелкнувмышьюпокнопкепанели
инструментовВыполнитьшаг .
2.ЩелкнитемышьюпокнопкепанелиинструментовНоваядиаграмма .
Появитсяокноновойдиаграммы.
3.Выберитепеременные,которыедолжныбытьотображенынадиаграмме.
Щелкнитеправойкнопкоймышипоокнудиаграммы ивыберитеСодержимое диаграммы…изконтекстногоменю.ПоявитсядиалоговоеокноСодержимо
е диаграммы.
4.Добавьтепеременнуюpotential_adopters,сделавдвойнойщ елчок мышьюпозначкупеременнойroot.potential_adoptersв
списке Переменные,параметры,наборыданных.
110

5.Аналогичнымспособомдобавьтепеременнуюroot.adopters.
6.ЩелкнитемышьюпокнопкеOK.
►Изменитепараметрыдиаграммы
1.Подготовьтемоделькзапуску,щелкнувмышьюпокнопкепан ели инструментовВыполнитьшаг .
2.Щелкнитеправойкнопкоймышипоокнудиаграммы ивыберитеПараметрыдиаграммы…изконтекстногоменю.Впоявившем сядиалоговом окнезадайте временнойдиапазондиаграммы:
111

Теперьперезапуститемодель,поочереднощелкнувмышьюпокнопкампанели инструментов Перезапустить и Запустить
. Диаграмма показывает, как
изменяются переменные potential_adopters и |
adopters во |
время |
|
модели
ровани
я.
112
>Текущаяконтрольная модель:Examples\AgentBasedModelingTutorialModels
\ ProductLifeCycle1-Simplemodel.alp.
113

1.9 Учетвлиянияобщениялюдей
Втекущеймоделилюдиприобретаютпродукттолькоподвлияниемрекламы.На самом деле, рекламный эффект играетзначительнуюроль только в момент выпуска продукта на рынок. В дальнейшем все большую роль будет играть общениелюдейстемисвоимизнакомыми,которыеэтотпродуктужеприобрели. Восновномлюдиприобретаютновыепродуктыименноподвлияниемубеждени я своихзнакомых;этотпроцессчем-топохожнараспространениеэпидемии.
Чтобыучестьвлияниеобщения людей,мыдолжнывнестивнашумодель небольшиеизменения.
►Изменитестейтчарт
1.Откройтедиаграммустейтчартаadoption,сделавдвойнойщелч окмышью поэлементуadoptionв окнеПроект.
2.Добавьтев состояниеAdopterвнутреннийпереход.
ДляэтогощелкнитемышьюпокнопкепанелиинструментовПереход ,
114
затемпоочереднощелкнитеполюбымдвумсторонамсостоянияAdopter.
115

3.Задайтетаймаут,покоторомупроисходитпереход:
Этотпереходбудетмоделироватьпокупкупродуктазнакомымэтого человека.То,насколькобыстроэтотвладелецпродуктасумеетубедить своегознакомогов необходимостипокупки,будетзависетьотсилы
убежденияэтогочеловекаиоттого,сколькознакомыхонвстречаетзагод.
4.ЗадайтеДействиеперехода:
Этотпереходгенерируетсигналдлястейтчартакакого-тознакомогоэтого человека.Вследствиеэтогосрабатываетпереходстейтчарта,моделирующи
й
покупкупродуктаэтимзнакомым.
СигналгенерируетсяпутемвызоваметодастейтчартаfireEvent(
),
описаниеэтогометодаклассаStatechartBaseВыможетенайтив
Справочникеклассов).
116

5.ДобавьтеещеодинпереходизсостоянияPotentialAdopterв состояние
Adopter:
Этотпереходбудетсрабатыватьпосигналу,которыйбудетгенерироваться
внутреннимпереходомсостоянияAdopter.
6.На страницесвойствперехода,в полеПроисходитвыберитеПо сигналу,и задайтевидСигнала:
117

ЗапуститемодельщелчкоммышипокнопкепанелиинструментовЗапустить . Диаграммабудетиметьтакойвид:
ГрафикипеременныхпредставляютсобойклассическиеS-образныекривые.
>Текущаяконтрольная модель:Examples\AgentBasedModelingTutorialModels
\ ProductLifeCycle2-Word of
mouth.alp.
1.10 Моделированиеповторныхпокупок
Созданнаямодельнеучитывает того,чтосовременемпродуктможетбыть израсходован или прийти в негодность, что вызовет необходимость его повторногоприобретения.Мыпромоделируемповторныепокупки,полагая,что потребителипродуктасновастановятсяпотенциальнымипотребителями,когда продукт,которыйониприобрели,становитсянепригоден.
Вначалемызададимсрокслужбыпроду кта.
►Задайтесреднийсрокслужбыпродукта
118
1.ОткройтеструктурнуюдиаграммуклассаMain,сделавдвойнойщелчок мышьюпоэлементуМainв окнеПроект.
119

2.СоздайтепараметрDiscard_Time.Пустьсреднийсрокслужбынашего продуктаравенодномугоду.Сделайтепараметрглобальным.
►Изменитестейтчарт
1.Откройтедиаграммустейтчартадвойнымщелчкоммышипоэлементу adoptionв окнеПроект.
2.ДобавьтепереходизсостоянияAdopterв состояниеPotentialAdopter.
120

121

3.Задайтеследующиесвойстваперехода:
Мы закончилимоделированиеповторныхпокупокпродукта.Запуститемодель щелчком мышипо кнопке панелиинструментовЗапустить и с помощью
диаграммыпроследитединамикуизменениячислапотребителейпродукта.
Мы видим,что насыщение рынка в модели с повторными покупками не достигается.
>Текущаяконтрольная модель:Examples\AgentBasedModelingTutorialModels \ ProductLifeCycle3-Replacementpurchases.alp.
122

1.11 Созданиепространственноймодели
Теперь мы хотим сделать модель пространственной, |
чтобы задать места проживаниялюд |
►Задайтекоординатылюдейв пространстве
1.ОткройтеструктурнуюдиаграммуклассаPerson,сделавдвойнойщ елчок мышьюпоэлементуPersonв окнеПроект.
2.Создайтепеременныеxиyтипаreal.Дляобеихпеременныхзадайте
Начальноезначение:
С помощьюфункцииравномерногораспределенияuniform() мы помещаемчеловекав точкусослучайновыбраннымикоординатамиот0до 300.
►Создайтефункцию,вычисляющуюрасстояниемеждулюдьми
1.ВокнеПроект,щелкнитеправойкнопкоймышипоэлементуP
ersonи
выберитеНоваяматематическаяфункция…изконтекстногоме ню.В
появившемсядиалоговомокнезадайтеимяфункции:distan
ce.
2.ВокнеСвойства,оставьтевыбранныйпоумолчаниютипвозвращае мого значенияфункции.
123

124

3.Задайтеаргументы,передающиефункциикоординатыдругого человека:
4.Задайтевыражениефункции:
Функцияsqrt()являетсяпредопределеннойфункциейAnyLogicTM. Выможетепросмотретьсписок всехпредопределенныхфункций (sin(),cos(),exp()и т.д.)спомощьюМастераФункций.Дляэтого щелкнитемышьювполевводавыражения,азатемщелкнитемышью покнопкеМастер.ПоявитсяокноМастераФункцийсоспискомвсех функцийи переменныхмодели. Чтобыдобавитьфункциюили переменнуюввыражение,прокрутитесписоккее имениисделайтепо немудвойнойщелчокмы
шью.
Детальноеописаниефункций иихпараметровВы
можететакженайти в Руководстве пользователя илиСправочнике
классов (нужно смотреть
методыклассаFunc).
125

►Изменитестейтчарт
1.Откройтедиаграммустейтчартаadoption,сделавдвойнойщелчокмы шью поэлементуadoptionв окнеПроект.
126

2.ВыделитещелчкоммышивнутреннийпереходсостоянияAdopterи
изменитеДействиеперехода:
Людибудутобщатьсянеслюбымисвоимизнакомыми,внезависимостиот местаихпроживания, а толькостеми,ктоживетпоблизости.
ЗапуститемодельщелчкоммышипокнопкепанелиинструментовЗапустить и изучитеееповедение.
>Текущаяконтрольная модель:Examples\AgentBasedModelingTutorialModels
\ ProductLifeCycle4-Spatial model.alp.
Созданиеанимации
Теперь мы хотим создать наглядную визуализациюисследуемого процесса. AnyLogicTMпозволяетсоздаватьинтерактивнуюанимацию свозможностью измененияпараметровсистемыпоходумоделированияпроцесса.
Вначалемысоздадимпеременную,котораяпонадобитсянамдляанимацииаген та.
►Создайтеновуюпеременную
1.ОткройтеструктурнуюдиаграммуклассаPerson,сделавдвойнойщ елчок мышьюпоэлементуPersonв окнеПроект.
1.СоздайтепеременнуюcolorтипаColor.Color–
этоклассJavaTM,
позволяющийиспользоватьчастоиспользуемыецвета(черный,с иний, красный,голубой,желтыйит.д.),а такжесоздаватьлюбыедругие.1Эта
127

1ЧтобыпросмотретьсписокцветовклассаColorиметодовкласса,позволяющихсоздават ьдругие цвета,зайдитепо адресуhttp://java.sun.com/j2se/1.4.2/docs/api/java/awt/Color.html.
128

переменнаябудетопределятьцвет,которымагентбудетотображатьсян а анимации.
АнимациявAnyLogicTMрисуетсянаанимационнойдиаграмме.
►Создайтеанимационнуюдиаграмму
1.ЩелкнитеправойкнопкоймышипоэлементуMainв деревемодели и выберитеНоваяанимация…изконтекстногоменю.Впоявившемся
диалоговомокнезадайтеимяанимацииВашеймодели:animation.
Автоматическипоявитсяокноредактораанимации.
Пунктирная рамка на анимационной |
диаграмме задает |
область анимации |
|
области. |
|
|
|
|
|
|
►Изменитеразмеранимации
1.Передвиньтерамкуанимационнойобласти,чтобыонаимелакоординаты (-20,-20),и измените ееразмерна(520,340).
МожетесделатьэтоизменениемсвойствX,Y,Ширина,Высотаили
перетаскиваниемграницрамкимышью(координатыкурсорамыши показываютсявстрокесостояния).Аналогичнымспособом Выможете
передвигать иизменятьразмерывсеханимационныхфигур.
Теперьмынарисуеманимациюнаподобиепоказаннойнарисункениже.
129

Мыхотимпоказатьнаанимациилюдей,проживающихвисследуемойобласти. Мы будем отображать их точками разных цветов, в зависимостиот того, приобрелилионипродукт,илиещенет.
►Нарисуйтеграницуисследуемойобласти
1.ЩелкнитемышьюпокнопкепанелиинструментовПрямоугольник .
2.Щелкнителевойкнопкоймыширядомсточкой(-10,-
10)и,неотпуская кнопку,переместитемышьв точку(310,310).
►Нарисуйтена анимацииагентовспомощьюмаленькихпрямоугольников
1. ЩелкнитемышьюпокнопкепанелиинструментовПрямоугольник |
. |
2.ВокнеСвойства,задайтеИмяпрямоугольника:
130
3.Задайтеразмерпрямоугольника:
131

4.ЗадайтеКоличествоанимационныхобъектов:
Мыдолжнынарисоватьстолькожеточек,сколькоагентоввнашей модели.Дляэтогомыпользуемсяфункцией size(),которая возвращаетчислоэлементовреплицированногообъектаpeople– то естьчислоагентовв модели.
5.Задайтеместоположениефигурагентовнаанимации:
Координаты фигурызадаютсяотдельнодлякаждогоагентав соответствиисо значениямиего переменных xи y. Поочередный доступковсемагентамосуществляется спомощьюфункции agentObject.item(index),гдеagentObject–
имяобъектамодели, которыймоделируетаг ентов.
6.Задайтецветфигурыспомощьюследующеговыражения:
Этовыражение проверяет,являетсяличеловеквладельцемпродукта (анализируетсязначениебулевскойпеременнойisAdopter).Еслида,то этотчеловекбудетотображатьсянаанимациисинейточкой,еслинет–то серой.
Теперь мы добавим на анимациюиндикаторы,с помощью которых будем отслеживать,скольколюдейприобрелопродукт,а сколько– нет.
►Добавьтеиндикаторчислапотенциальныхпотребителейпродукта
132
1.ЩелкнитемышьюпокнопкепанелиинструментовСтолбцовыйиндикатор .
133

2.Поместитеиндикаторнаанимацию,щелкнувмышьюсправа от прямоугольникаисследуемойобласти.
3.На вкладкеОбщиеокнаСвойства,изменитеразмериндикатора:
4.На вкладкеСтолбцовыйиндикаторокнаСвойства,выберитепеременную,
которуюбудетотображатьэтотиндикатор:
5.ЗадайтемаксимальноеотображаемоезначениевполеМаксимум,измените
цветиндикации исбросьтефлажокОтображатьшкалу.
►Добавьтеиндикаторчислапотребителей
1.Щелкнитеправойкнопкоймышипосозданномунакопителю ивыберите
Копироватьизконтекстногоменю.
2.Щелкнитеправойкнопкоймышиподиаграмме ивыберитеВставитьиз контекстногоменю.Новыйиндикаторпоявитсянадиаграмме.Расположи те егоправееиндикаторачисленностипотенциальныхпотребителейпродукт а.
3.Выберитеadoptersв
134
качествепеременной,которуюОтображаетиндикатор иизменитецветиндикации.
135

►Добавьтеподписик индикаторам
1.ЩелкнитемышьюпокнопкепанелиинструментовТекст .
2.Поместитетекстовуюметкунадиаграмму,щелкнувмышьюподлевым индикатором.
3.Задайтетекст,которыйбудетотображатьсяв
текстовомполе.Вполе редактированияТекст,расположенномнавкладкеТекстокнаСвойс
тва, введитеPotentialAdopters.
4.Изменитешрифттекста.ЩелкнитемышьюпокнопкеВыбрать,ив
появившемсядиалоговомокнеустановитешрифтTimesNewRomanра змером8.
5.АналогичнопоместитеметкуAdoptersподправыминдикатором.
Теперьмысделаемнашуанимациюинтерактивной,добавивэлементуправления,с
помощьюкоторогобудемизменятьсрокслужбыпродукта.
►Добавьтеэлементуправления
1.ЩелкнитемышьюпокнопкепанелиинструментовБегунок .
2.Поместитебегунокнадиаграмму,щелкнувмышьюнадиндикаторами.
3.На вкладкеОбщиеокнаСвойства,изменитеразмерэлементауправления:
4.На вкладкеБегунококнаСвойства,выберитепеременную,значениекоторой
мы будемизменятьспомощьюэтогоэлементауправления:
5.Задайтеминимальныеимаксимальные значениябегунка:
136

6.Поместитенаанимациютриметки:DiscardTime–
подбегунком,0.5у левогокраябегункаи2.5– управого.
Теперьмыхотимисследоватьмоделируемыйпроцессвтечениеболеедлительног о времени,поэтомусделаемтак,чтобынашамодельработалабесконечно.
►Удалитеусловиеостановкимодели
1.ВокнеПроект,щелкнитемышьюпоэлементуSimulation.
2.На вкладкеДополнительныеокнаСвойства,сбросьтефлажокСтоп по времени.
Мызакончилисоздание анимации.Запуститемодельщелчкоммышипокнопке
Запустить .Выувидитеанимациюнаподобиепоказаннойнарисункениже:
Чтобы анимацияотображалась быстрее, закройте остальные окна: диаграмму переменныхиокнакорневогообъектамоделиroot.
137

Если Вы хотите, чтобы анимациявыглядела лучше, то можете включить режим сглаживания, отключенный по умолчанию для
повышенияскоростивыполнениямодели.
►Включитережимсглаживания
1. ЩелкнитемышьюпокнопкепанелиинструментовНастройкианимации…
.Впоявившемсядиалоговомокне,установитефлажокСглаживание.
Выможетеизменятьскоростьвыполнениямоделиспомощьюкнопокпанели
инструментовУменьшитьскорость иУвеличитьскорость
.
>Текущаяконтрольная модель:Examples\AgentBasedModelingTutorialModels
\ ProductLifeCycle5-Animation.alp.
138
2. Улучшенная модель жизненного циклапродукта
Вэтойглавемыизменимнашумодель,добавив некоторыеранеенеучтенные
деталиипоказавновыевозможностиAnyLogicTM.
2.1 Моделированиерекламныхкампаний
Сейчасмыпромоделируемрекламныекампаниипродукта,врезультатепроведе ния которыхлюдибудутпокупатьнашпродукт.
►Создайтеновыепеременные
1.ОткройтедиаграммуклассаMainдвойнымщелчкоммышипоэлементуMain
вокнеПроект.
2.СоздайтепеременнуюadXтипаreal.
3.СоздайтепеременнуюadYтипаreal.
4.СоздайтепеременнуюadTimeтипаreal.ЗадайтеНачальноезначение:-1.
5.СоздайтепеременнуюadRangeтипаreal.ЗадайтеНачальноезначение:50.
Мыбудеммоделироватьпроведениерекламныхкампанийспомощьютаймера. ТаймерыиспользуютсявAnyLogicTMдляпланированиясобытий.
►Создайтетаймер
1.ОткройтедиаграммуклассаMainдвойнымщелчкоммышипоэлементуMain
вокнеПроект.
2.ЩелкнитепокнопкепанелиинструментовТаймер ,а затемподиаграмме класса.НазовитетаймерadTimer.
3.Намнужно,чтобытаймерсрабатывалнесколькораз,поэтомупроверьте,
чтобыбылустановленфлажокЦиклический.
139

4.ЗадайтеТаймаут:
5.ЗадайтеДействиепри срабатывании:
Этоткодпроизводитциклическийпереборвсехагентовмодели.Уагентов, попавшихв областьпроведениякампании(в кругсрадиусомadRange), генерируетсясобытиестейтчарта,в результатечегосрабатываетпереход стейтчарта,моделирующийпокупкупродукта.
Посколькутеперь покупкимоделируютсяс помощьютаймера,нужно удалить переходстейтчарта,которыймоделируетпокупкупродуктаподвлияниемрекламы.
►Изменитестейтчарт
1.Откройтедиаграммустейтчартадвойнымщелчкоммышипоэлементу adoptionвокнеПроект.
2.УдалитепереходизсостоянияPotentialAdopterвсостояниеAdopt er
140
(переходстаймаутомexponential(adEffect)),выделивегощелч ком мышиинажавDelete.
141

Теперь внесем небольшие измененияв анимацию.Мы будем подсвечивать
областипроведениярекламныхкампанийнаанимациисиреневымикругами.
►Нарисуйтекруг
1.Откройтеанимационнуюдиаграммудвойнымщелчкоммышипоэлементу animationдеревамодели.
2.ЩелкнитемышьюпокнопкепанелиинструментовОвал ,затем
щелкнитепоанимационнойдиаграмме.Задайтеследующиесвойс тва фигуры:
МестоположениекруганадиаграммеопределяетсяпеременнымиadXиa
dY,
хранящимикоординатыцентраобластипроведениятекущейкампании.Кр уг будетвиденвтечение 0.2единицмодельноговременипослемомента
проведениякампании.
3.ЩелкнитепозакладкеОвалокнаСвойстваизадайтерадиусыова
142
лас помощьюсозданнойранеепеременнойadRange:
143

ЗапуститемодельщелчкоммышипокнопкепанелиинструментовЗапустить .
>Текущаяконтрольная модель:Examples\AgentBasedModelingTutorialModels
\ ProductLifeCycle6-
Advertisingcampaigns.alp.
2.2
Изучениераспространениянесколькихп
родуктов
Созданнаямодель изучаетдинамикураспространениятолько одного продукта. Сейчасмыулучшимнашумодель,чтобыиметьвозможность изучать
распространениесразунесколькихразличныхпродуктов.
Вначалемысоздадимпеременную,котораябудетопределятьтипрекламируемого
продукта.
►Создайтевспомогательнуюпеременную
1.ОткройтеструктурнуюдиаграммуклассаMainдвойнымщелчкоммышипо элементуMainвокнеПроект.
2.СоздайтепеременнуюadColorклассаColor.
Теперьмыдолжнывнестинебольшиеизмененияванимациюмодели.Мыхотим
различатьпродуктыпоцвету:владельцеводногопродуктамыбудем |
отображатьна |
|
анимациисинимиточками,авладельцевдругого–красными.Областипроведения |
||
рекламных кампанийтакже будут отображаться |
различнымицветамив |
144
зависимостиотрекламируемогопродукта.
145

►Изменитеанимацию
1.Откройтеанимационнуюдиаграмму,сделавдвойнойщелчокмышьюп о элементуanimationвокнеПроект.
2.Щелкнитемышьюполиловомукругунаанимационной диаграмме и выберитепеременнуюadColorвкачестве
Цветазаливкифигуры.
3.ЩелкнитемышьюнаанимационнойдиаграммепофигуреagentS
hape.В полеЦветзаливки,введитеpeople.item(index).color.
Теперьцветфигурыбудетзадаватьсязначениемпеременнойагента adColor.Потенциальныепокупателипродуктабудутотображатьсяс
ерым цветом,владельцы–краснымилисинимвзависимости
оттого,какой продуктониприобрели.
146

Теперь мы изменимкод, который выполняется при срабатываниитаймера,
моделирующегопроведениерекламныхкампаний.
►Изменитедействие таймера
1.ОткройтеструктурнуюдиаграммуклассаMainдвойнымщелчкоммышипо элементуMainвокнеПроект.
2.ЩелкнитемышьюпозначкутаймераadTimerнаструктурнойдиаграмме.
3.ИзменитеДействиепри
срабатываниитаймера.Добавьтевыделенныестроки:
adX = uniform( adRange, 300 -
adRange ); adY = uniform(
adRange, 300 - adRange ); adTime
= getTime();
adColor = uniform() > 0.5 ? Color.blue : Color.red;
for (int i=0;
i<people.size(); i++) {
Person p = people.item(i);
if( p.distance(adX,adY) < adRange )
147
p.adoption.fireEvent(a
dColor);
}
Теперьсравнойвероятностьюбудутрекламироватьсяразныепродукты.
148

►Изменитестейтчарт
1.Откройтедиаграммустейтчартадвойнымщелчкоммышипоэлементу
adoptionвокнеПроект.Нарисуйтеследующийстейтчарт:
2.Добавьтесложноесостояние,включающеевсебяоба состояниястейтчарта.
3.Сделайтеэтосостояниеначальным.Дляэтогодобавьтеуказательначаль ного
состояния,направленныйвэтосостояние.Щелкнитемышьюпокнопке
панелиинструментовУказательначальногосостояния
,потомщелкнитепо диаграммевначалечутьвышесостояния,а
затемпоегогранице.
4.УдалитепереходизсостоянияPotentialAdopterвсостояниеAdopter.
5.ИзменитеДействиевнутреннегопереходасостоянияAdopter.З
149
амените строкуp.adoption.fireEvent( "buy" );
настрокуp.adoption.fireEvent(color);
150

6.ДобавьтепереходизсложногосостояниявсостояниеAdopter.
ВокнеСвойства,задайтесвойстваперехода:переходдолженсрабатывать
По сигналуColorивыполнять Действиеcolor=(Color)getEvent();
7.ВыделитещелчкоммышисостояниеPotentialAdopter.
ДобавьтевДействияпривходестрокуcolor = Color.lightGray;
ЗапуститемодельщелчкоммышипокнопкепанелиинструментовЗапустить . Теперьмодельбудетизучатьраспространениесразудвухпродуктов.
>Текущаяконтрольная модель:Examples\AgentBasedModelingTutorialModels
\ ProductLifeCycle7-
Multipleproducts.alp.
2.3 Моделированиепередвижениялюдей
Наданныймоментлюдивмоделинеподвижнонаходятсявопределенныхместах. Мыжехотимсделатьмодельболеереалистичной,сделавтак,чтобылюдимогли перемещатьсяпорассматриваемойвмодели области.
151

►Создайтевспомогательныепеременные
1.ОткройтеструктурнуюдиаграммуклассаPersonдвойнымщелчко ммыши поэлементуPersonвокнеПроект.
2.Создайтепеременныеoldxиoldyтипаreal. ДляобеихпеременныхзадайтеНачальноезначение:
3.Создайтепеременнуюtmovedтипаreal. ЗадайтеНачальноезначение:
Мы промоделируемдвижениелюдейспомощьютаймера.
►Создайтетаймер
1.ОткройтеструктурнуюдиаграммуклассаPersonдвойнымщелчко ммыши поэлементуPersonвокнеПроект.
2.ЩелкнитепокнопкепанелиинструментовТаймер ,а
потомподиаграмме класса.НазовитетаймерmoveTimer.
3.Намнужно,чтобытаймерсрабатывалнесколькораз,поэтомупроверьте,
чтобыбылустановленфлажокЦиклический.
4.ЗадайтеТаймаут:
152

5.ЗадайтеДействиепри срабатываниитаймера:
При срабатывании таймера текущее модельное время,возвращаемое функциейgetTime(), запоминаетсяпеременной tmoved. Переменные oldxи oldyзапоминаюттекущие координаты агента xи y. Новые координатыгенерируютсяпотреугольномузаконураспределения с
минимальнымзначениемравным0,средним– 150имаксимальным – 300. Теперьмысоздадимдвевспомогательныефункции,которыепомогутнамболее
плавноотрисовыватьдвижениелюдейнаанимации.
►Создайтеалгоритмическиеф ункции
1.ЩелкнитеправойкнопкоймышипоэлементуPersonвокнеПроекти
выберитеНоваяалгоритмическаяфункция…изконтекстногоменю.Назов
ите функциюanimationX.
2.ЗадайтеТело
функции:
3.АналогичносоздайтеалгоритмическуюфункциюanimationY:
153
Теперьнужновнестинебольшиеизмененияванимацию.
154

►Изменитеанимациюагента
1.Откройтеанимационнуюдиаграммудвойнымщелчкоммышипоэлементу animationвдереве проекта.
2.На анимационнойдиаграммещелкнитемышьюпопрямоугольнику
agentShapeизадайтеследующиесвойства:
Мы закончилимоделирование движениялюдей. Теперь Вы можете запустить модельщелчкоммышипокнопкепанелиинструментовЗапустить ипроследить за перемещениемлюдейспомощьюанимации.
>Текущаяконтрольная модель:Examples\AgentBasedModelingTutorialModels \ ProductLifeCycle8-
Peoplemovement.alp.
2.4 Моделированиемиграциилюдей
Всозданноймодели числолюдей,проживающихв изучаемойнамиобласти, являетсяпостоянным.Насамомделе,всегдапроисходитмиграциялюдей–люди переезжаютизоднойобластивдругую,иэтотоженеобходимоучестьвмодели.
Мы будеммоделироватьмиграциюспомощьютаймеров.
►Промоделируйтемиграциюлюдейв рассматриваемуюобласть
1.ОткройтеструктурнуюдиаграммуклассаMainдвойнымщелчкоммыш ипо элементуMainвокнеПроект.
2.ЩелкнитепокнопкепанелиинструментовТаймер ,а затемподиаграмме класса.НазовитетаймерinMigration.
155

3.Намнужно,чтобытаймерсрабатывалнесколькораз,поэтомупроверьте,
чтобыбылустановленфлажокЦиклический.
4.ЗадайтеТаймаут:
Всреднемвнашуобластьбудутприезжать20человек вгод(вкачестве аргументафункцииexponential()задаетсячастотапроисхождения события).
5.ЗадайтеДействиепри срабатывании:
Добавлениенового агента в модель производится путем вызова функции корневогообъектамоделиsetup_agentObject(), где agentObject–имяобъекта,моделирующегоагентов.Первыйаргумент функцииуказывает, что создается объект класса, который задает агентов в нашей модели – Person. Второй аргумент указывает позициюобъектаpeople,кудабудетдобавленэтотобъект
.
Теперьмыпромоделируемто,каклюдиуезжаютизнашейобласти.
►Промоделируйтемиграциюлюдейиз области
1.ОткройтеструктурнуюдиаграммуклассаPersonдвойнымщелчкомм ыши поэлементуPersonвокнеПроект.
2.ЩелкнитепокнопкепанелиинструментовТаймер ,а затемподиаграмме
156
класса.НазовитетаймерoutMigration.
157

3.Таймердолженсработатьтолькоодинраз,поэтомуустановитефлажок
Срабатываетодин раз.
4.ЗадайтеТаймаут:
5.ЗадайтеДействиепри срабатывании:
Удалениеагента |
из |
модели |
производится |
путем |
вызовафункции |
|
|
|
|
корневогообъектамоделиdispose_agentObject(),гдеagentObj
ect–
имяобъекта,моделирующегоагентов.Аргументфункцииопредел яет, какой именно агент должен быть удален. Выражение
AgentClass.this,гдеAgentClass–
имяклассаактивногообъекта, моделирующегоагентов,указывает,что будет удален
именноэтот
а
г
е
н
т
.
Чтобы знать, сколько людей проживаетв нашей области, мы добавимна анимациюметку,отображающуючисложителейобласти.
158
►Покажитечисложителейобласти
1.Откройтеанимационнуюдиаграммудвойнымщелчкоммышипоэлементу animationвдереве проекта.
2.Добавьтенаанимациютекстовуюметку,отображающуюследующийтекст:
159

Мы закончилисозданиемодели.Запуститемодельщелчкоммышипо кнопке
панелиинструментовЗапустить .
>Текущаяконтрольная модель:Examples\AgentBasedModelingTutorialModels \ ProductLifeCycle9-Peoplemigration.alp
160