Нейроэволюция киберкальмаров. Перезагрузка
С интересом слежу за темой симуляции живого посредством компьютерных программ. Нейросети демонстрируют огромный прогресс переваривая гигабайты информации.
Обучение нейронных сетей, в части требуемых ресурсов, далеко ушло от среднего по мощности настольного компьютера. Поэтому всегда интересны «игрушечные» проекты с быстрой обратной связью в части обучения нейросетей. А лучше всего, чтобы нейросеть сама и обучалась без заметных усилий со стороны разработчика. Этой весной был приятно удивлен обнаружив статью Job Talle о нейроэволюции кальмаров.
Относительно небольшая статья содержала как описание физических принципов движения кальмаров, так и описание невиданной мной в работе спайковой нейронной сети, приводящей щупальца кальмаров в движение и поверх этого генетический алгоритм для естественного отбора наиболее приспособленных особей. О чем статья, скорее о том как подковал блоху.
Начнем с источников:
Оригинальная статья взятая за основу при программировании кальмаров (осьминогов)
Перевод вышеуказанной статью на Хабре.
Если читатель пройдет по ссылкам, то обнаружит подробный рассказ (и его перевод) о реализации нейроэволюции на примере кальмаров. Результат статьи будет выглядеть так:
или так:
В статье приводятся исходный код и ссылка на симуляция выполняемую в браузере.
Когда все уже готово, рассказано и показано, остается вопрос, а как эта программа работает на самом деле.
Поэтому решил переписать код изначально созданный под JavaScript на более близкий мне с++. Как всегда бывает с чужим кодом, сначала многое было непонятно. Чего стоит такой вот пассаж:
простыми словами автор программы включил в индекс нейрона и его тип, зачем этот прием из 80-х годов непонятно. Вроде сейчас памяти хватает в компьютерах.
Но в целом прототип заработал и стал выглядеть примерно так:
Щупальца удлинил относительно оригинальных вариантов, показалось более гармонично.
Но картинка выглядела слишком схематично.
Решил добавить для гладкости сплайны по точкам щупалец и сдвиг точек сплайна от центральной линии щупальца в зависимости от расстояния от тела кальмара.
выглядит неплохо, но переход щупальца к телу хотелось увидеть более естественным, добавил более сильный отступ от центра щупальца:
в итоге остановился на таком варианте:
Но кальмары скорее всего не прозрачные, поэтому картинка больше про медуз:
Решено было закрасить щупальца, что требовало разбить их на отдельные треугольники и красить уже набор треугольников. В центре разместил активность нейронов.
или в движении:
и более мультипликационно:
Дело сделано в 2D, но 3D все еще мейнстрим, поэтому переходим к следующему этапу. Сначала понять как буду крепить щупальца:
Решил сначала физику переписать с нуля:
Видно, что опирается на щупальца, добавил коллизии щупалец и прочее из набора физического движка. Потянуло на проверенный временем Bullet Physics Library:
Но вскоре решил не трогать то, что работало изначально и просто добавил еще одно измерение в первоначальную физику:
получилось похоже на оригинал, но в 3D. На видео видно баг, когда одна из щупалец ломается. Дело в том, что в 3D поиск нормали к вектору не совсем тривиальная задача. Местами симуляция движения щупальца ошибалась в выборе нормали. Поправил.
Конечный результат, что-то из фильма «Матрица»: