Введение в комплексность, домашняя работа номер 1, для продолжающих.
Это обучающее видео, которое вводит нас в раздел для продолжающих.
Откройте модель NetLogo, "Multiple ants" (разнообразные муравьи), расположенную в материалах курса на странице в интернете.
Когда программа открыта, она должна выглядеть так.
Мы уже сделали несколько моделей в первых двух разделах домашнего задания. И не удалили их.
Первое, что надо сделать, это окрасить муравьёв, так что они просто останутся красными.
Поэтому я просто сейчас просто удалю эту часть кода, чтобы не путаться.
Идём назад в интерфейс. Домашнее задание - создать следы феромона, которые муравьи оставляют...
...а другие муравьи следуют за ним после того, как нашли еду. И проверить, будет ли это быстрее, чем предыдущим методом.
Идём в раздел кода. Создадим переменную кусочков (patches), которую назовём "феромон".
Сделаем это здесь...
Следующий шаг, опустимся к операции "setup", и зададим кусочки, которые относятся не только к гнезду муравьёв...
...но и к феромону.
Изменим "set-up-nest" на "set-up-patches". Запросим кусочки начать феромон с 0.
...пишем "set pheromone 0"...
Следующим шагом зададим муравьям оставлять след после того, как они нашли еду, и возвращаться назад в гнездо.
...и чтобы другие муравьи следовали этому следу из феромона.
Чтобы это сделать, спускаемся ниже к операции "return-to-nest" ранее, и добавим строку "set pheromone" для феромона с "pheromone +1".
Чтобы визуализировать, сколько феромона в каждом кусочке, я собираюсь задать метку для кусочка.
Получается "set", "plabel" как просто нумерическое значение "pheromone".
Можете использовать другой цвет для этого, если хотите, но я думаю, интереснее будет использовать метку.
Проверим, как работает...
Выглядит, как вполне правильное.
Видно, что муравьи собирают еду и возвращаются назад в гнездо, оставляя за собой след феромона, который увеличивается нумерически.
А теперь сделаем так, чтобы феромон испарялся со временем. Идём назад в код...
Создадим новую строку в операции "go" и назовём её "evaporate-pheromone" (испаряться-феромон).
Теперь напишем эту операцию: "to evaporate" (испариться) "pheromone".
Хотелось бы задать переменную вероятности испарения, что означает число между 0 и 1.
Создадим временную переменную под названием x, которой сопутствует "random-float" и 1.
Запросим кусочки "ask patches with" и "pheromone" больше, чем 0.
Затем "if" переменная x меньше, чем... Вероятность, которую мы определили...
...которая "sliter" в интерфейсе, названная "вероятность испарения"... Пишем "probability-to-evaporate"...
Тогда зададим феромон ценностью -1, то есть он будет постепенно испаряться.
Нам бы хотелось это увидеть, так что мы пишем "plabel" другим числом.
Нам надо также добавить тот "slider", который я упомянул.
Чтобы это сделать, идём в интерфейс, жмём на эту кнопку, выбираем "slider"...
Назовём его "вероятность испарения" (probability-to-evaporate).
Это будет число между 0 и 1.
Установим начальную ценность, как .1
Нажимаем "Ok"... Мне бы хотелось сдвинуть этот "slider" под другой "slider".
Теперь он пониже и на уровне окна, в котором у нас мир. Выглядит хорошо.
А этот "slider" разместим сверху того. Сделаем его таким, как другие.
Возможно, всё нормально. Идём назад в интерфейс и проверяем.
Уровень феромона должен понижаться, и выглядит, как и должно быть. Хорошо.
Последняя проблема в том, чтобы заставить других муравьев следовать следу феромона. Сделаем это.
Между прочим, чтобы выделить окна, это кликнуть на свободное место и тянуть курсор над окнами.
Можно кликнуть на кнопку и выбрать из меню "Edit" (редактировать).
Идём в код и изменим способ движения муравьёв в их мире.
Идём в операцию "look-for-food" и добавим код сюда.
Добавим новые переменные в неё, например, "let" затем "pheromone-ahead?" и "sent-at-angle" 0. Объясню через секунду.
Далее "let" и "pheromone-right?", затем "scent-at-angle" 45.
А также "let" и "pheromone-left?", затем "scent-at-angle" -45.
Этот код похож на тот, который есть в библиотеке NetLogo.
Мы, в общем, запрашиваем каждого муравья смотреть вперёд, немного направо, немного налево, чтобы определить, есть ли рядом феромон.
И если он есть, следовать феромону. Но если нет, то беспорядочно ходить...
...что не влияет на этот код, что внизу.
Затем напишем серию утверждений "ifelse"... "Ifelse", скобки открываем, "pheromone-right?" больше, чем "pheromone-ahead?"...
...или "pheromone-left?" больше, чем "pheromone-ahead?", закрываем скобки...
"Ifelse" и "pheromone-right?" больше, чем "pheromone-left?", идём направо 45, а если нет, то налево 45.
А если ничего из этого правда, то тогда феромон впереди или его вовсе нет.
Тогда "if" и "pheromone-ahead?" равен 0, то идём далее, ставим скобку, закрываем.
Сказано, что у нас ничего, чтобы отвечало "scent-at-angle", и это действительно так. Мы ещё не задали "scent-at-angle"...
Идём вниз в код, чтобы задать отчёт. Пишем "to-report" и "scent-at-angle" и введём "angle"...
Пусть "p" будет "patch-right-and-ahead". Эту команду вы можете проверить на значение в самой NetLogo.
Выделяете, нажимаете "quick help" (быстрая помощь), что открывает перед вами небольшую инструкцию о том, что это.
Добавляем "angle", который у нас уже есть, и дистанцию впереди, которая 1.
Пишем "if" "p" равна "nobody" (никому), что означает отсутствие феромона, тогда "report" 0.
Иначе "report" "pheromone" и "end". Закончим.
Проверим код.
Забыли закрывающую скобку для этой открывающей. Пустое пространство.
Также я заметил, что пара скобок отсутствует для этих строк. Добавляю. Прошу прощения...
Проверим. Всё в порядке.
Идём назад в интерфейс. Поведение выглядит вполне хорошо.
Модель можно проанализировать и сделать выводы, как ещё лучше она могла бы работать, но я оставлю это вам.
У меня нет ответа, почему муравьи собираются в углах своего мира.
Мы можем решить это. Идём в настройки.
Нажимаем на опции мира по вертикали и горизонтали.
Они быстро едят всю еду. Метка состоит из 73.
На старой модели до добавления феромона у нас была метка 128.
Это всё о домашней работе номер 1. Надеюсь, вам понравилось это видео. До встречи.