Нейроэволюция киберкальмаров. Перезагрузка

vsxdbiltvzbbepuizhy49jufyva.gif

С интересом слежу за темой симуляции живого посредством компьютерных программ. Нейросети демонстрируют огромный прогресс переваривая гигабайты информации.
Обучение нейронных сетей, в части требуемых ресурсов, далеко ушло от среднего по мощности настольного компьютера. Поэтому всегда интересны «игрушечные» проекты с быстрой обратной связью в части обучения нейросетей. А лучше всего, чтобы нейросеть сама и обучалась без заметных усилий со стороны разработчика. Этой весной был приятно удивлен обнаружив статью Job Talle о нейроэволюции кальмаров.

Относительно небольшая статья содержала как описание физических принципов движения кальмаров, так и описание невиданной мной в работе спайковой нейронной сети, приводящей щупальца кальмаров в движение и поверх этого генетический алгоритм для естественного отбора наиболее приспособленных особей. О чем статья, скорее о том как подковал блоху.

Начнем с источников:
shbrg8mxite6aeh5ow0cchqojgy.png
Оригинальная статья взятая за основу при программировании кальмаров (осьминогов)

y-0zgtqspp7jcs1ejrfsmy8jxve.png

Перевод вышеуказанной статью на Хабре.

Если читатель пройдет по ссылкам, то обнаружит подробный рассказ (и его перевод) о реализации нейроэволюции на примере кальмаров. Результат статьи будет выглядеть так:
sdhzvfa9dos0clqbr1xwsaqggam.gif
или так:
fvqaym4xoxtcfhampqqux63qeqs.gif

В статье приводятся исходный код и ссылка на симуляция выполняемую в браузере.

Когда все уже готово, рассказано и показано, остается вопрос, а как эта программа работает на самом деле.
Поэтому решил переписать код изначально созданный под JavaScript на более близкий мне с++. Как всегда бывает с чужим кодом, сначала многое было непонятно. Чего стоит такой вот пассаж:

ovgfs_ntkgduez7p3co1hfmdvyq.png
1p8mwycxozghage-474efxmx44c.png

простыми словами автор программы включил в индекс нейрона и его тип, зачем этот прием из 80-х годов непонятно. Вроде сейчас памяти хватает в компьютерах.
Но в целом прототип заработал и стал выглядеть примерно так:

Щупальца удлинил относительно оригинальных вариантов, показалось более гармонично.
Но картинка выглядела слишком схематично.
Решил добавить для гладкости сплайны по точкам щупалец и сдвиг точек сплайна от центральной линии щупальца в зависимости от расстояния от тела кальмара.

jidkp4kg2bprv-jltvdwtfozf-4.gif

выглядит неплохо, но переход щупальца к телу хотелось увидеть более естественным, добавил более сильный отступ от центра щупальца:

wkm6gh2nktnjtms1fxnkbbla6ag.gif
в итоге остановился на таком варианте:

Но кальмары скорее всего не прозрачные, поэтому картинка больше про медуз:
oawocfgfiq33qbuoja0ifubzfku.jpeg

Решено было закрасить щупальца, что требовало разбить их на отдельные треугольники и красить уже набор треугольников. В центре разместил активность нейронов.

py1wdgt2vfx2kh13xnuumsxncis.jpeg

или в движении:

trdmfws5axzkz_jhcqfxl3t3te4.gif

и более мультипликационно:

a__mqzxi_ymnte3oplds3-bytn4.gif

Дело сделано в 2D, но 3D все еще мейнстрим, поэтому переходим к следующему этапу. Сначала понять как буду крепить щупальца:

pkr2434sydwdnfi11sga3j4nk_4.jpeg

Решил сначала физику переписать с нуля:

7wahsdkwgnsnyz4lh3kybrsnayk.jpeg
ers6aole7akawhyhb4kyvyyxwy0.jpeg

Видно, что опирается на щупальца, добавил коллизии щупалец и прочее из набора физического движка. Потянуло на проверенный временем Bullet Physics Library:

yuzyu2hq524aoohlanyx2radyjk.png

Но вскоре решил не трогать то, что работало изначально и просто добавил еще одно измерение в первоначальную физику:
n8adwfuultdlen3vwl3vvrybfju.gif

получилось похоже на оригинал, но в 3D. На видео видно баг, когда одна из щупалец ломается. Дело в том, что в 3D поиск нормали к вектору не совсем тривиальная задача. Местами симуляция движения щупальца ошибалась в выборе нормали. Поправил.

Конечный результат, что-то из фильма «Матрица»:

dzm7tbnksxp0jmloww313syzipe.gif

© Habrahabr.ru