(Надпись) 1.9. Наша вторая модель NetLogo Давайте построим вторую модель, которая основана на первой. Первое, что мы сделаем, это копирование. Нажимаем на правую кнопку мыши на ярлыке NetLogo, и выбираю "скопировать" ("copy") в меню. Затем я выбираю команду Б ("B") или как в вашей операционной системе копируются файлы. Переименую файл в Net2Logo. Затем я кликну на скопированный ярлык два раза, открою программу и переименую нажатием на данное имя (Ant 1). Выбираем "Edit" (редактировать) и назовём "Ant 2". И теперь у нас есть муравьишка, который может двигаться. Давайте дадим ему что-нибудь поесть. Идём в код и напишем код еды, чтобы её можно было съесть нашему муравью. Задаём операцию. Пишем "grow-food" (взрастить еду). Теперь нам надо объяснить системе, как взрастить еду. Мы пишем новую операцию "to-grow-food". И то, что мы собираемся делать, это запросить кусочки ("ask patches"), затем "pcolor" зелёный ("green"), конец ("end"). Объясняю, что касается кусочков. Идём назад в интерфейс и видим, что в мире, который является данной чёрной площадью, ...мы кликаем правой кнопкой мыши и выбираем "Edit" (редактировать). И мы видим, что это показывает нам систему координат мира. Возможно, это сложно увидеть на вашем экране. Но вы можете сделать это в NetLogo и всё увидеть, где параметр 0, 0 находится в середине... ...а угловые измерения от -16 внизу до 16 по вертикали... ...и -16 до -16 по горизонтали. Итого, всё поле - это решётка 33 на 33 ячеек, которые называются кусочками. Далее мы видим количество пикселей в кусочке, как, например, 13, и так далее. При этом каждый кусочек имеет свои качества. Например, цвет. Если пойти назад в код, у меня есть запрос кусочков о заданном цвете. "Pcolor" это цвет кусочка. Например, зелёный. Давайте посмотрим, что будет, когда я выбираю "Setup". Конечно же, кусочки становятся зелёными. Мы можем считать это моделью для красного муравья, живущего в мире зелени. А теперь идём в код, чтобы задать код, где муравей ест зелень. Чтобы это сделать, пишем следующее. Если "pcolor" равен "green" (зелёный)... ...добавим комментарий также "if" (если) муравей (назван как "turtle") расположен на зелёном кусочке ("is located on a green patch")... Эта команда запрашивает агентов смотреть на своей кусочек, ведь каждый агент расположен на конкретном кусочке... ...и если кусочек зелёный, то тогда агент должен скушать этот зелёный кусочек... Получается, что задаётся "pcolor" обратно в чёрный цвет. Так что "pcolor" будет "black" (чёрный). Затем сделаем так, что агент будет вести счёт, как много кусочков он съел. Установим "food-eaten" (съеденная еда) как "food-eaten" + 1. Сделаем, что на тельце агента должна быть метка, как много еды он съел. Пишем "set-label" (установить метку) "food-eaten" (съеденная еда). Это то, что мы попросим агентов сделать. ...увидела, что должна была поставить скобку. Внизу. Здесь. Ставим "Tabs", где надо. У нас две скобки - эта и та - вокруг комментариев, которые мы будем запрашивать у агентов. Повернуться направо или налево, налево, идти прямо, посмотреть на кусочек, не зелёный ли он. Изменить цвет на чёрный, увеличить количество еды на 1 и отметить, как много еды было съедено. Последняя вещь, которую надо сделать, это та самая команда "food-eaten", которую надо задать. Агенты должны иметь некую переменную, как "food-eaten", которая будет обозначать их желудок, которая отслеживает съеденную еду. В этой модели агенты ничего не переваривают. Пишем "turtles-own" (сами агенты) и "food-eaten" (съеденная еда). Это и есть переменная под названием "food-eaten" (съеденная еда). Но каждый агент имеет свою переменную, поскольку ест разное количество еды. В разделе "set" пишем "food-eaten" к 0. Это означает, что съеденная еда будет прибавлятся с ноля. Проверим. Выглядит нормально. Идём в интерфейс. Замедляем процесс, чтобы посмотреть, как еда будет съедена. Итак, муравей ползает в своём мире, и каждый раз оказываясь на зелёном кусочке, он его ест. Движение происходит от 0 до 3 шагов, и только тогда он ест еду. Можем ускорить процесс немного. Можем наблюдать муравья, поедающего еду. Возможно, вы не видите это на своём экране, но метка, сколько еды он съел, присутствует. Слишком много для одного маленького. Следующая вещь, это дать нашему муравью колонию. Давайте добавим больше муравьёв. Чтобы это сделать, надо добавить популяцию. Давайте позволим модели добавить размер популяции. Идём в меню интерфейса и выбираем "Slider" (движок, прямоугольник). Глобальная популяция. Минимум популяции будет 1, максимум, например, 200. Мы может позволить задавать комментарии каждому с ценностью в 15. Применим. Подвинем. Теперь надо сказать в коде, что делаеть с переменной популяции. Идём в код, и вместо "create-turtles" 1 пишем "create-turtles" "population" (популяция). Пользователь может задать количество популяции, и код создаст столько же агентов. Посмотрим, что будет, когда нажмём на "Setup". Теперь у нас все наши муравьи, здесь в середине их 15. Нажимаем "Go". Теперь можно видеть, как они двигаются. Замедлим. Они делают одно и то же. Но поскольку каждый делает выбор наугад, мы видим беспорядочность. И если мы увеличим скорость, то они выглядят почти как настоящие муравьи, бегающие и кушающие еду. Давайте увеличим популяцию, 130 выглядит приемлемо. Теперь тут "многолюдно". Их настолько много, что будет правильным пойти в код и сделать их поменьше. Установим их размер, как 1, и посмотрим, что будет. Теперь они значительно меньше. Сложно их рассмотреть, но теперь больше свободного места. Сложно разглядеть всё на вашем экране, но зато есть метки, как много еды каждым съедено. Теперь хотелось бы выяснить, как много еды съела вся колония. Я собираюсь добавить "Plot" (сюжет) о том, как много еды съедено за это время. Идём в интерфейс и выбираем "Plot". Разместим его внизу. "Plot" запрашивает, как назваться. Пишем "Total Food Eaten" (вся съеденная еда). Здесь тоже есть минимум и максимум, которые можно задать. Зададим параметр доступа X как "Total Food Eaten" (вся съеденная еда), а параметры доступа Y как "Time" (время). Зададим название сюжету ("Plot"), как "Total Food Eaten" (вся съеденная еда) напротив чёрного поля. А комманду сюжету зададим, как "sum" (сумма), затем в квадратных скобках "food-eaten" (съеденная еда) "of turtles" (агентами). Команда рассматривает, сколько еды съедено каждым агентом. Применим. Ой, перепутала малость... Параметр доступа X должен быть, как "Time" (время), ...а параметр доступа Y как "Total Food Eaten" (вся съеденная еда). Хорошо, теперь всё нормально. Давайте выберем это, подвинем, сделаем немного выше... Нажмём на "Setup" и "Go". Вы видите, что сюжет постраивается под то, что мы видим, номера меняются. Это нам показывает, как быстро еда съедается. Вы можете даже поиграть с количеством популяции, чтобы посмотреть, как это влияет на скорость потребления еды. Чтобы закончить нашу модель, давайте сделаем так, чтобы пользователь смог установить другие параметры. Установим "Slider" (движок, прямоугольник), где задаются максимальное количество шагов и максимум поворотов. Выбираем "Plot" и сместим его вниз, чтобы освободить место для новых "Sliders". Выбираем новый "Slider" и задаем параметр, например, "max-step-size" (максимальное количество шагов).... ...с минимумом, к примеру, 1, а максимумом 10... А первоначальная ценность пусть будет 4. Хорошо... Теперь добавим новый "Slider" под названием "max-turn-angle" (максимальный угол поворота)... Минимум будет, например, 1 градус, а максимум 180 градусов. Ценность пусть будет 60. Хорошо. Выбираем... Двигаем. Теперь надо вставить эти переменные в код. Здесь, вместо 60 пишем "max-turn-angle", и тут рядом тоже... Теперь у нас "right" (право) "random" (нерегулярно) max-turn-angle" (максимальный угол поворота). ...и "left" (лево) "random" (нерегулярно) max-turn-angle" (максимальный угол поворота). Если вы обратили внимание, что "random" обозначает интервал между 0 и -1. Получается, что максимальный угол поворота немного не тот, потому что максимум должен быть -1. Но я бы не стала волноваться на этот счёт. А тут я сделаю то же самое: вместо 4, я пишу "max-step-size" (максимальное количество шагов)... Я понимаю, что этот код, возможно, сложно разглядеть на вашем экране. Я размещу это видео на странице нашего курса, и вы сможете его скачать, чтобы посмотреть. Вы будете использовать этот код в подготовке домашнего задания. Посмотрим теперь, как всё работает. Вроде нормально. Ещё одну полезную вещь, которую я должна рассказать о NetLogo... ...это что NetLogo порой может зависнуть, даже если вы жмёте кнопку "Go", потому что выполняет много команд. В разделе опций есть команда "Halt" (остановить), которой можно воспользоваться, чтобы остановить программу. Это так, на всякий случай, если программа вдруг встала. Сделаем эксперимент - увеличим количество шагов до 10 и посмотрим, что получится. Видим, что многие агенты застряли по углам. Вы можете поиграть со всеми этими тремя переменными, чтобы посмотреть, как долго займёт, чтобы вся еда оказалась съеденной. Можно всё остановить, когда еда будет полностью съеденной, чтобы узнать, как много меток съеденной еды получилось. Сделаю команду для этого, иду в код, операцию "go", чтобы задать, когда программа должна остановиться. Пишем "if" (если) "not any patches with" (не осталось кусочков с) "pcolor" равный "green" (зелёный), то тогда чёрный, и "stop" (остановиться). Это синтаксис, который используется в NetLogo. Вы можете составлять запрещающие или другие команды. А теперь посмотрим... Установим популяцию на 200, шаги на 4, а угол на 60, и посмотрим, как быстро муравьи съедят всю еду. Метка составляет всего 105. Сохраним нашу модель. Идём в меню файла и нажимаем "save" (сохранить). Это всё о нашей второй модели!