[toptop
][rays ray][IRs IR][heats heat][CO2s CO2][trees tree][factories
factory][clouds cloud]own [cloud-speed cloud-id]
Далее идут процедуры setup и setup-world. В этих процедурах устанавливается цвет ландшафта в зависимости от координаты на плоскости. Также здесь задаются изображения различных объектов модели, и указывается начальное значение температуры. Коды процедур setupи setup-worldпредставлены ниже.
setupalldefault-shape rays "ray"default-shape IRs "ray"default-shape clouds "cloud"default-shape heats "dot"default-shape CO2s "CO2-molecule"default-shape factories "factory"default-shape trees "tree"worldtemperature 12tickssetup-worldsky-top max-pycor - 5top 0[ ;; установление цветов для разных разделов мираpycor > sky-top [pcolor scale-color white pycor 22 15
]pycor <= sky-top and pycor > earth-top [ ;; небоpcolor scale-color blue pycor -20 20
]pycor < earth-top
[ set pcolor red + 3 ] ;; земляpycor = earth-top ;; поверхностьземли
[ update-albedo ]
]
Затем идет процедура go, в которой выполняется модель. В ней определяется, какой из элементов модели должен появиться в данный момент времени. Код процедуры go с пояснениями представлен ниже.
[ fdcloud-speed ] ; облакаперемещаютсявдольsunshine ;; луч выходит
;; если альбедо изменил цвет пятен земляной поверхностиpatches with [pycor = earth-top]
[ update-albedo ]heat ;; выделениетеплаIR ;; выделение инфракрасного
излученияCO2 ;; движение молекул СО2
Далее идет процедура add-cloud. В это процедуре описывается появление облаков в модели. Здесь определяется то, в какой точке пространства появится облако, его размер, скорость и цвет. Ниже представлен код процедуры add-cloud с пояснениями.
toadd-cloud ;; стирает облака, а затем создаются новыеsky-height sky-top - earth-top
;; находится случайная высота облака в области небаy earth-top + (random-float (sky-height - 4)) + 2
;; скорость облака не может быть нулемspeed (random-float 0.1) + 0.01x random-xcorid 0any? clouds
[ set id max [cloud-id] of clouds + 1 ]clouds 3 + random 20
[cloud-speed speedcloud-id id+ random 9 - 4
;; облака группируются вокруг центра+ 2.5 + random-float 2 - random-float 2
;; разный размер облаковsize 2 + random 2heading 90
]
Затем идут процедуры run-sunshine, create-sunshine, reflect-rays-from-clouds иencounter-earth. В этих процедурах создается луч солнца, описывается его поведение во время соприкосновения с препятствиями. Коды этих процедур с пояснениями представлены ниже.
sunshine[not can-move? 0.3 [ die ]0.3
]sunshine ;; созданиелучаrays-from-clouds ;; проверка соприкосновения с облакамиearth ;; проверка соприкосновения с землейsunshine
;; увеличение яркости увеличивает количество лучей10 * sun-brightness>random 50 [rays 1 [heading 160color yellow(random 10) + min-pxcor max-pycor
]
]reflect-rays-from-cloudsrays with [any? clouds-here] [ ;; еслилучкасаетсяоблакаheading 180 - heading ;; лучразворачивается
]encounter-earthrays with [ycor <= earth-top] [
;; в зависимости от альбедо земля поглощает или отражает тепло100 * albedo > random 100
[ set heading 180 - heading ] ;; отражение
[ rt random 45 - random 45 ;; поглощениеcolor red - 2 + random 4]
]
Следующей идет процедуры run-heat и run-IR, в которых идет расчет показателей температуры, описываются движения лучей и инфракрасного излучения. Коды этих процедур представлены ниже.
run-heat ;; advances the heat energy turtlestemperature 0.99 * temperature + 0.01 * (12 + 0.1 * count heats)heats
[dist 0.5 * random-float 1can-move? dist
[ fd dist ]
[ set heading 180 - heading ]ycor >= earth-top [ ;; отражениелучалучаtemperature > 20 + random 40xcor > 0 and xcor < max-pxcor - 8
[ set breed IRsheading 20color magenta ]
[ set heading 100 + random 160 ]
]
]run-IRIRs [not can-move? 0.3 [ die ]0.3ycor <= earth-top [breed heatsrandom 45random 45color red - 2 + random 4
]? CO2s-here ;; проверяется соприкосновение с СО2
[ set heading 180 - heading ]
]
Далее идут процедуры добавления и удаления молекул углекислого газа,
фабрик и деревьев.
.2 Процедуры и функции для «ElFarol»
Процедуры и функции, используемые в модели для лабораторной работы «ElFarol».
В начале кода при помощи оператора globalsопределяются глобальные переменные. Рассмотрим объявленные переменные и их значения.- текущее количество посетителей бара. History - история посетителей бара или список значений параметра attendance. Home-patches - это пятна, обозначающие дома посетителей бара. Bar-patches - это пятна, показывающие бар. Crowded-patch - пятна, где идет отображение того, что бар переполнен.
При помощи оператора turtles-own задаются атрибуты или переменные только для черепах. Рассмотрим эти переменные.- список стратегий. Beststrategy - индекс текущей стратегии. Attend - означает положительный или отрицательный ответ на решение пойти в бар. Переменная может принимать значение trueили false. Prediction - предсказание о текущем количестве человек в баре. Ниже представлен фрагмент кода с объявлением переменных.
[patchespatchespatchpredictionprediction
]own [strategy?attend?attend?counternumberattend?
]
Далее в модели идет процедур аsetup. Она вызывается кнопкой setup. Данная процедура отображает и выбирает пятна для бара(barpatches) и пятна для домов (home-patches) в зависимости от места, занимаемого пятном на координатной плоскости. Также здесь генерируется начальная история (переменная history) и происходит создание и размещение черепах. У каждой черепахи генерируется стратегия и выбирается текущая стратегия, как первый элемент массива стратегии. Ниже представлен код для процедуры setup с пояснениями.
alldefault-shape turtles "person"
;; создание «домов»home-patches patches with [(pycor < -8 or pxcor < -8) or (pycor > 11) or pxcor > 11]home-patches [ set pcolor green ]
;; создание «бара»bar-patches patches with [pxcor > -8 and pycor > -8 and pxcor < 11 and pycor < 11]bar-patches [ set pcolor magenta ]
;; инициализацияпредыдущейпосещаемостислучайнымспособомhistory n-values (memory-size * 2) [random 100]
;; помнить, что история в два раза больше памяти
;; Используется одна из меток, чтобы визуально указать, является ли панель «переполненной»patch (0.75 * max-pxcor) (0.5 * max-pycor) [crowded-patch selfplabel-color red
]
;; создание агентов и присваивание им случайных стратегийturtles 100 [color whiteto-empty-one-of home-patchesstrategies n-values number-strategies [random-strategy]best-strategy first strategiesquality-counter random 6police-number random 6strategies
]ticks
Далее идет процедура go. Она вызывается кнопкой go. В данной процедуре при помощи функции prediction-attendance получаем числа prediction, quality-counterиpolice-number. Значение prediction сравнивается со значением overcrowding-threshold, quality-counter сравнивается с quality, аpolice-number сравнивается с the-number-of-police-visits. Если значения меньше, то количеству посетителей прибавляется один. Ниже представлен код для процедуры go с пояснениями.
gocrowded-patch [ set plabel "" ]
;; каждый агент предсказывает посещаемость в баре и решает, идти или нетturtles [prediction predict-attendance best-strategy sublist history 0 memory-sizeattend? (prediction <= overcrowding-threshold) ;; true или falsequality-attend? (quality-counter <= quality)police-attend? (police-number >= the-number-of-police-visits)
]
;; в зависимости от их решения, агенты отправляются в бар или остаются домаquality-prediction 0police-prediction 0turtles [(attend? and quality-attend? and police-attend?)
[ move-to-empty-one-of bar-patchesattendance attendance + 1
]
[ move-to-empty-one-of home-patches ](attend?) [(quality-attend?) []
[ set quality-prediction quality-prediction + 1 ](police-attend?) []
[ set police-prediction police-prediction + 1 ]
] []
]
;; если бар переполнен, то это показываетсяattendance count turtles-on bar-patches
;; обновляется история посещаемости, удаляется старая посещаемость и приводится последняя посещаемостьhistory fput attendance but-last history
;; агент определяет лучшую стратегию для себяturtles [ update-strategies
]
Следующей идет процедура update-strategies. В данной процедуре определяется, какая стратегия предсказывает наилучшие результаты.
Лучшая стратегия - это та, у которой есть сумма наименьших различий между текущей посещаемостью и прогнозируемой посещаемостью для каждой из предыдущих недель. Это совсем не изменяет стратегии, но позволяет потенциально изменить стратегию, используемую в настоящее время, и обновить производительность всех стратегий. Ниже представлен код для процедуры update-strategies.update-strategiesbest-score memory-size * 100 + 1strategies [score 0week 1memory-size [prediction predict-attendance ? sublist history week (week + memory-size)score score + abs (item (week - 1) history - prediction)week week + 1
](score <= best-score) [best-score scorestrategy ?
]
]
Функция random-strategy сообщает о случайной стратегии. Стратегия - это всего лишь набор весов от -2,0 до 1,0, который определяет, сколько внимания уделяется каждому предыдущему периоду времени при прогнозировании посещаемости на следующий период времени. Ниже представлен код функции.
report random-strategyn-values (memory-size + 1) [1.0 - random-float 2.0]
Функция predict-attendance сообщает прогноз агента о текущей посещаемости, используя определенную стратегию и часть истории посещаемости.
Затем описывается формулой:
где P(t) - предсказание в момент времени t;(t) - посещаемость бара в момент времени t;(t) - вес для времени t;- константа;- внешний параметр.
Ниже представлен код функции.
report predict-attendance [strategy subhistory]100 * first strategy + sum
(map [?1 * ?2] butfirst strategy subhistory)
Функцияmove-to-empty-one-ofиспользуется для того, чтобы у нас была только одна черепаха на пятно. Ниже представлен код функции.
move-to-empty-one-of [locations] ;; turtle procedureto one-of locations[any? other turtles-here] [to one-of locations
]
5.3 Процедуры и функции для «Pagerank»
Процедуры и функции, используемые в модели для лабораторной работы «Pagerank».
В начале кода с помощью оператора breed задается два подмножества: breed [ pages page ] - множество страниц, breed [ surferssurfer ] - множество ищущих.
Далее идет процедура setup. В ней происходит определение того, какой тип структуры сети был выбран, установка ранга сайтам, и размещение сайтов на экране.
Код для выбора типа сети.
setupalldefault-shape pages "circle"network-choice = "Example 1"
[ create-network-example-1 ][network-choice = "Example 2"
[ create-network-example-2 ][network-choice = "Preferential Attachment"
[ create-network-preferential 100 2 ] [network-choice = "Network management"
[ pr-man count-pages count-links ];
Также в процедуру setupбыло внесено дополнение, а именно в управление страницами. Изменение представлено ниже.
pages
[ ifelse pr-control [ set rank pr-page] [set rank 1 / count pages] ]
Здесь определяется состояние переключателя. Если он включен, то выполняется первое условие, а именно ранг устанавливается в зависимости от значения рычажка pr-control, в противном случае ранг страниц определяется по стандартной формуле.
Далее идут функции create-network-example-1, create-network-example-2, create-network-preferential [ n k ] и pr-man [ n k ]. С помощью этих функций строится модель сети. Функции create-network-preferential [ nk ] иpr-man [ nk ] принимают два параметра. Первый отвечает за количество создаваемых страниц, а второй за количество ссылок на сайтах. Отличие этих двух функций в том, что параметры для create-network-preferential [ nk ] заданы в программе, а для pr-man [ nk ] эти параметры можно изменять в самой модели. Ниже представлен коды этих функций.
create-network-example-1pages 11page 0 [ set color blue create-link-from
page 3 ]page 1 [ set color red create-links-from (turtle-set page 2 page 3 page
4 page 5 page 6 page 7 page 8 ) ]page 2 [ set color orange create-link-from
page 1 ]page 3 [ set color green create-link-from page 4 ]page 4 [ set color
yellow create-links-from (turtle-set page 5 page 6 page 7 page 8 page 9 page
10) ]page 5 [ set color green create-link-from page 4 ]pages with [who > 5]
[ set color violet ]create-network-example-2pages 8page 0 [ die ]page 1 [ create-links-from
(turtle-set page 2 page 3 page 5 page 6) ]page 2 [ create-links-from
(turtle-set page 1 page 3 page 4) ]page 3 [ create-links-from (turtle-set page
1 page 4 page 5) ]page 4 [ create-links-from (turtle-set page 1 page 5) ]page 5
[ create-links-from (turtle-set page 1 page 4 page 6 page 7) ]page 6 [
create-links-from (turtle-set page 5) ]page 7 [ create-links-from (turtle-set
page 1) ]create-network-preferential [ n k ]pages n [ set color sky
]preferentially pages kpr-man [ n k ]pages n [ set color sky ]k >= n [
link-preferentially pages n - 1 ] [ link-preferentially pages k ]
Дальше идут процедуры, отвечающие за определение типа поиска, и в зависимости от выбранного типа происходит расчет рангов.
Код для диффузионного типа.
calculation-method = "diffusion"
[ifany? surfers [ asksurfers [ die ] ] ;; удаляетпользователей, есливыбранданныйметодlinks [ set color gray set thickness 0 ]pages [ set new-rank 0 ]pages
[any? out-link-neighbors
[rank-increment rank / count out-link-neighborsout-link-neighbors [new-rank new-rank + rank-increment
]
]
[rank-increment rank / count pagespages [new-rank new-rank + rank-increment
]
]
]pages
[rank (1 - damping-factor) / count pages + damping-factor * new-rank
;; устанавливает текущий ранг в новый ранг, используя данную формулу
]
Код для случайного типа.
[count surfers < number-of-surfers
[surfers number-of-surfers - count surfers
[current-page one-of pageswatch-surfers?
[ move-surfer ]
[ hide-turtle ]
]
]count surfers > number-of-surfers
[n-of (count surfers - number-of-surfers) surfers
[ die ]
]
;; возвращает связи в их начальное положениеlinks [ set color gray set thickness 0 ]surfers [old-page current-pagepage [ setvisitsvisits + 1 ] ;; увеличивает количество посещений на странице, на которой находимсяrandom-float 1.0 <= damping-factor and any? [my-out-links] ofcurrent-page;;с вероятностью, зависящей от коэффициента затухания, либо перейти на случайную страницу или случайную страницу, с которой эта страница связана
[ set current-page one-of [out-link-neighbors] of current-page ]
[ set current-page one-of pages ]
;; обновляемвизуализациюwatch-surfers?
[turtlesurfersurfer-color colorold-page [traveled-link out-link-to [current-page] of myselftraveled-link != nobody [traveled-link [ set color surfer-color set thickness 0.08 ]]]
]
[ hide-turtle ]
]
;; обновляемрангстраницtotal-visits sum [visits] of pagespages [rank visits / total-visits
]
]
.4 Процедуры и функции для «Turingmachine»
Рассмотрим процедуры и функции, используемые в модели для лабораторной работы «Turingmachine».
Сначала идет процедура setup. В этой процедуре определяется начальное состояние модели в соответствии с заданными параметрами. Код данной процедуры с пояснениями представлен ниже.
allturtles heads [50 ;; инициализация всех головок в состоянии 00;; выставление головок в вертикальное состояниеbg blackcolor-paths? ;; цветчерепах
[ set fg color ]
[ set fg white ]
]patches [ set on? false ] ;; очищениезначенияячейкиticks
Далее идет процедура go, в которой происходит запуск модели.
Затем идет процедура find-rule. В данной процедуре происходит нахождение правила использования для текущего состояния головки и ячейки. Ниже представлен код этой процедуры.
reportfind-rule? ;; проверка состояния пят на
[state = 0 [ report fput on-0-state list (direction-to-number on-0-turn) on-0-on? ]state = 1 [ report fput on-1-state list (direction-to-number on-1-turn) on-1-on? ]state = 2 [ report fput on-2-state list (direction-to-number on-2-turn) on-2-on? ]
]
[state = 0 [ report fput off-0-state list (direction-to-number off-0-turn) off-0-on? ]state = 1 [ report fput off-1-state list (direction-to-number off-1-turn) off-1-on? ]state = 2 [ report fput off-2-state list (direction-to-number off-2-turn) off-2-on? ]
]
В процедуре apply-rulesизменение текущей конфигурации по правилам, приведенным в списке.
В процедурах direction-to-numberиnumber-to-direction происходит изменение параметров модели в зависимости от выбранного пункта в списке turn. Ниже представлен код этих процедур.report direction-to-number [direction]direction = "--"
[ report 0 ]direction = "Right"
[ report 90 ]direction = "Backwards"
[ report 180 ]direction = "Left"
[ report 270 ]report number-to-direction [number]number = 0
[ report "--" ]number = 90
[ report "Right" ]number = 180
[ report "Backwards" ]number = 270
[ report "Left" ]
6. Экспериментальное тестирование и отладка программного комплекса
Под экспериментальным тестированием здесь понимается проверка того, как модификации могут влиять на поведение модели во время ее выполнения. Количество этих ошибок при разработке было небольшим. Ошибки допускались при создании интерфейса открытия лабораторных работ и практических примеров для трёх последних работ.
Для модификации данной модели, в нее были добавлены фабрики и деревья. Они могут влиять на количество углекислого газа, выделяемого в атмосферу. Проведем несколько тестов и посмотрим, как они будут влиять на поведение модели.
Для проведения первого теста запустим модель два раза. В первый раз не будем добавлять фабрики, а во второй раз запустим модель с теми же параметрами, но добавим пять фабрик. Результат тестирования представлен на рисунках 6.1 и 6.2.
Рисунок 6.1 Модель без фабрик
Рисунок 6.2 Модель с фабриками
Как видно из первого теста, температура без фабрик ниже примерно на 25 градусов, что свидетельствует о том, что всего пять фабрик выработали столько углекислого газа, что создался барьер, который задерживал инфракрасное излучение.
Для второго тестирования используем те же данные, что и при первом тестировании, но теперь добавим деревья и посмотрим на изменения. Результат тестирования представлен на рисунке 6.3.