Введение в комплексность, домашняя работа номер 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. Надеюсь, вам понравилось это видео. До встречи.