Описание модели
На 2D поле имеются агенты, по своей привычке, я буду называть их энималами, и пища.Энималы способны перемещатся вперед\назад, относительно текущего угла поворота, и изменять этот угол, т.е. вектор их действия аналогичен вектору в полярной системе координат.
Так же на окружности энимала содержатся сенсоры, таким образом, что в "голове" (90 градусов в направлении угла поворота энимала) содержится половина сенсоров, остальная половина равномерно распределена по оставшейся части окружности.
Сенсор способен воспринять запах исходящий от пищи. Чем дальше пища - тем слабее будет запах. Зависимость от растояния линейное.
У каждого энимала имеется простая нейронная сеть с количеством нейронов входного слоя равным количеству сенсоров, т.е. семь. В скрытом слое 2 нейрона. В выходном слое тоже два: первый выход - величина передвижения вперед\назад, второй - величина изменения угла поворота.
Количество нейронов в скрытом слое было выведено экспериментально.
Не мало ли? При такой структуре скрытый слой имеет 2*7 связей со входным, а выходной 2*2 со скрытым, итого мы имеем 16 весов, как показала практика, этого достаточно чтобы сформировать нужное поведение.
Энимал обладает энергией. Она пополняется, если агент находится около пищи, при этом пища уменьшается, пропорционально съеденому. А расходуется энергия на: существование, передвижение, почкование. Если она достигает нуля - особь умирает. Если её уровень выше 70% появляется шанс отпочковать потомство.
При успешном почковании создается 2-5 новых особей, с такой же нейронной сетью как у родителя, но с некоторой случайной мутацией её весов.
Формирование пищи
Сперва я превращал умерших энималов в пищу, а если её становилось на поле слишком мало, до добавлял еще. Но это не давало нужного результата. Зачастую либо все особи умирали, либо происходил "взрыв численности" и формирование поведения стремящегося к еде не происходило, потому что в нем не было особой пользы. Для того, чтобы произошёл эволюционный отбор нужно минимальное количество особей, для этого нужны благоприятные условия для их появления. Но, одновременно с этим, для того, чтобы эволюция отсеяла неприспособленных, нужны достаточно неблагоприятные условия. На решение этих противоречивых условий натолкнуло цикличность большинста процессов: цикл года, цикличность истории, цикл while, даже в моей древней программе прослеживалась цикличность появления потомства. В ней сперва происходил "взрыв численности населения", затем он достигал максимума и все одновременно начинали вымирать, выжившие, воспользовавшись освободившимся местом устраивали очередной "взрыв численности населения".Таким образом, я оставил лишь равномерное добавление пищи на поле, не зависимо от смертей энималов и текущего количества пищи на поле. Конкретнее, каждые 180 циклов добавляю 3 еденицы пищи случайного размера. В итоге мы имеем, что при малом количестве энималов пищи скапливается большое количество и условия становятся благоприятными для размножения, но при возростании потребителей еды, её уже не хватает, условия становятся неблагоприятными, и эволюция, зловеще потирая руки, берется за свой отбор наиболее приспособленных.
Выводы
В итоге, таки формируется поведение стремления к пище. Причем с поразительно устойчивой воспроизводимостью и жизнеспособностью особей со сформированым поведением. Позалипать к чему же привело это безобразие можно в этом видео.Ну и конечно ссылочка на репозиторий с быдлокодом. Именно с таким кодом, ибо когда прет мысль формировать красивый код сложно.
https://github.com/zshimanchik/unconditioned-reflexes


No comments:
Post a Comment