здравствуйте. с Вами Джон Боуард. это курс по сложности (complexity)
мы пройдёмся по набору финальных заданий
в серии по динамике, продвинутый уровень
это будет очень весело. мы создадим модель в NetLogo с нуля...
... и Вы сможете увидить как я подхожу к построению моделей.
Конечно же существует огромное количество способов это делать...
и самое важное, когда начинаешь программировать, это просто "играться"...
и не бояться ошибаться, т.к. единственный способ научится чему-либо
это наделав кучу ошибок
Я уже встречался с этими моделями
я создал сотни моделей, но уверен что допущу ошибки
создавая эту.
но это часть процесса программирования
продвинутый уровень: мы создадим
модель
использующую модель роста основанную на агентах
мы основываем её не на уравнениях, а создадим на самом деле маленькие объекты
которые размножаются, и посмотрим
сможем ли мы воспроизвести поведение
которое должно быть воспроизведено логистической моделью.
Т.е. мы задаём поведение
но мы выводим его из поведения агентов
Т.е. это интересно с философской точки зрения
что эти модели намного более низкоуровнивые
и что коллективное поведение складывется
из свойств и взаимодействия агентов.
Поехали. Итак, вот Netlogo, экран с которого вы начинаете
простой интерфейс.
Когда я начинаю создавать новую модель
я всегда добавляю кнопку "Setup" (установка)
кнопку "Step" (шаг)
(в такую модель)
и кнопку "Go" (начало)
Они все, конечно же, ссылаются на ещё пока ненаписанные процедуры
Также я всегда стараюсь чтобы всё...
было выровнено и чтобы был одинаковый отступ между кнопками.
Это моя больная мозоль, но я делаю именно так.
Я также помечаю свои модели
чтобы позже вспомнить.
Итак...
Это осносновы того что я делаю когда я создаю модель.
Итак поехали. Посмотрим, что мы хотим сделать: мы хотим
создать несколько возпроизводящих себя агентов
и мы будем чертить граф
чтобы увидеть, похож ли он на сигмойду, которыю мы тоже начертим.
Итак мы разобрались с основами
и мы назовём этот граф
"population" (популяция)
Мы знаем...
что это будет популяция относительно времени.
всегда хорошо пометить оси, чтобы не забыть
(печатает)
ОК, мы разобрались с подготовительной работой.
Далее мы создадим модуль установки,
который создаст несколько агентов, так что давайте сразу окунёмся с код
и скажем "установить"
и я всегда пишу...
сперва начало и конец т.к. я знаю, что нам придётся это сделать
Мы знаем, что мы хотим создать сразу определённое количество.
Возможно у нас будет слайдер
для этого, но мы можем просто...
давайте сразу сделаем слайдер, чтобы он больше не мешался.
Итак вернёмся к интерфейсу
Создадим слайдер и назовём его
"исходная популяция"
и обычно я копирую это
и мы создадим
большую популяцию, и тогда у нас есть возможность
дать этим
вновь созданным обьектам свойства. например, я задам зелёный цвет
задам форму...
например, круг
и установлю размер
ну... оставим как есть. изначально их размер будет равен единице
Теперь
мы сразу заметим проблему и я просто хочу показать
вам это, потому что
установка теперь работает и мы создадим по умолчанию 50 единиц.
Итак, что я сделаю?.. я запущу Установку
и вы заметите, что
похоже был создан всего один агент, хотя на самом деле их двадцать семь
и они все
были созданы один поверх другого
чтобы заставить их двигаться
нам пришлось бы продвинуться вперёд
мы сказали каждому из них продвинуться вперёд на 10 шагов
Когда мы запустили Установку, мы увидели бы,
что они все, так как у нас случайное направление, вышли бы за пределы
Это всё ещё не совсем то, что мы хотели, не так ли?
выглядит слишком организованно и слишком искусственно,
также мы ещё не избавились от первоначальной (популяции).
Это напоминает мне, что всегда когда делаем Установку
мы почти всегда начинаем с "clear-all" (очистить всё)
или коротко "ca"
но "clear-all" сотрёт всё.
вместо того, чтобы использовать эту команду для создания,
что является самы простым способом
создать популяцию агентов,
мы используем кое-что другое, а именно
мы попросим ячейки...
я попрошу определённое количество ячеек, попрошу "n-of"
исходную популяцию
я запрашиваю это количество ячеек
"прорости"
и конечно же, как только я решил с кем я разговариваю, я говорю с ячейками
и то, что я прошу их сделать,
это "прорастание" говоря:
"эй вы, 12 ячеек...
я хочу, чтобы каждая из вас пустила один побег и...
сказала этому побегу установить свой цвет в зелёный, и форму в круг"
и продвинуться на 10 шагов, нам больше не нужно это "forward 10"
Давайте посмотрим, работает ли это?
конечно
оно просит случайный ячейки, каждый раз когда вы нажимаете
просит случайный набор ячеек
в данном случае 27, или 80
Итак у нас есть исходная популяция
ячеек, которыми мы можем управлять той единственной строчкой кода.
ОК, следующий шаг
это продумать, что мы от них хотим? мы попросим
этих агентов
эти маленькие зелёные точки
мы хотим, чтобы они воспроизводились.
Они должны будут уметь умереть
т.к. мы хотим иметь непересекающиеся поколения
иметь родительское поколение, которое порождает другое поколение
и родительское поколение умирает. Т.е. мы должны будем отслеживать поколения
мы также должны будем
рассредотачивать их, чтобы они
не оказывались друг на дружке
так будет проще отслеживать их визуально
если каждая будет в своей ячейке
ОК. у нас нет спаривания. мы могли бы его добавить
но это бы всё усложнило. Итак давайте посмотрим как это сделать
Я скажу, что
на каждом шаге они будут размножаться.
итак я скажу "Шаг". Они будут делать всё, что они должны
это только что-то типа псевдокода.
я скажу, что они должны
воспроизводиться
родители должны умереть
и оставшиеся должны распределиться
Вот оно.
Это будут названия для процедур, которые мы ещё не написали
но эта процедура "шаг" будет просто вызывать эти процедуры, так что
давайте подумаем на тем, как будет работать воспроизведение