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