Почувствуй силу эволюции!

vott.ru — Компьютерный алгоритм рисует портрет Моны Лизы, случайно раскидывая пятнышки по экрану. А дальше размножение, случайные мутации и супер-хищник Criticus Vulgaris запускают процесс эволюции. #эволюция #неразумный_замысел
Видео, Компьютеры | максимум 20 символов 11:42 02.02.2017
16 комментариев | 133 за, 0 против |
#1 | 11:43 02.02.2017 | Кому: Всем
[censored]

Посмотрел[censored] и решил воспроизвести один из упомянутых там самоэволюционирующих алгоритмов.
Программа случайным образом рисует на экране 1000 пятнышек и записывает их параметры в "геном". Получается организм-картинка с кодовым именем Puziricus. Дальше таких случайных организмов создаётся 100 штук, и они начинают конкурировать. Некоторые сами дохнут от случайных причин, остальных жрёт суперхищник местной эволюционной системы Criticus Vulgaris, которому нравится портрет Моны Лизы и он охотится на тех, кто меньше всего на этот портрет похож.

Выжившая половина популяции размножается делением (половое размножение у меня пока не получилось реализовать), при этом все параметры пятнышек (координаты, размеры и цвет) немного мутируют с небольшим шансом. И снова приходит Criticus Vulgaris и жрёт самых непохожих. Так происходит 10 тысяч раз, но уже на середине из случайных пятен проявляется что-то отдалённо похожее на портрет.
#2 | 12:05 02.02.2017 | Кому: Пальтоконь
А есть кого обижать? :)
#3 | 12:16 02.02.2017 | Кому: rahs
> Очень здорово. А если увеличить количество итераций?

Для начала нужно увеличить количество пятнышек, но у меня комп не тянет, а программировать графику на низком уровне я не умею. Для 1000 штук это практически предел точности воспроизведения. В картинке 135000 пикселей, так что нужно сравнимый порядок элементов, чтобы сгенерировать пузырикуса более близкого к оригиналу.

Эти 10К поколений рисовались около суток.
#4 | 12:28 02.02.2017 | Кому: Regal
>Войну и Мир написали 100 тыс. обезьян

Написание "Войны и Мира" запрограммировать проще и быстрее. Там графику рисовать не надо, а это самое узкое место программы.
#5 | 13:17 02.02.2017 | Кому: Paynd
> Дай репозиторий заценить! :)

Я в гитхаб не умею заливать. А ещё там страшный индусский код, вызванный тем, что я последний раз программировал более 20 лет назад на паскале. И комментировать код мне, как обычно, лень.

[censored]

Написано всё это безобразие на кастрированной Яве по имени[censored] Запускается файлом isomorph.pde
#6 | 13:51 02.02.2017 | Кому: Всем
Прошлую ссылку указал неправильно. Вот рабочий вариант:[censored]

Для ускорения процесса можно поставит размер картинки и генома поменьше, а шанс мутации побольше. Тогда видимый эффект наступит быстрее, но конечная точность окажется низкой. Для высокой точности воспроизведения нужен низкий шанс мутации ниже 0,1 процента.
#7 | 14:14 02.02.2017 | Кому: SHOEI
Комп делает всё:

1) рисует 100 картинок из случайных кружочков (этот момент в видео не показан, так как как занимает очень много времени)
2) запоминает параметры (координаты, размер, цвет) этих кружочков для каждой картинки в геном.
3) сравнивает каждую картинку попиксельно (считает дисперсию по цвету) с референсным изображением (в данном случае портрет Моны Лизы, но можно взять любое другое) и присваивает им рейтинг.
4) картинки с самым плохим рейтингом и их геномы уничтожаются
5) оставшиеся геномы дублируются, но при копировании в них вносятся случайные изменения
6) на основе получившихся геномов рисуются новые 100 картинок (уже не случайно)
7) пункты 3-6 повторяются 10000 раз, пока набор случайных пятнышек не превратится в портрет Моны Лизы.

В видео показан лучший вариант картинки для каждого поколения.
#8 | 14:20 02.02.2017 | Кому: Paynd
> Комп решительно ебашит по кружочкам

Не совсем так. Комп не знает какой именно конкретный кружочек делает картинку более похожей, а какой нет. Он уничтожает уже готовые экземпляры картинок вместе со всем кружочками и хорошими и плохими. Но это не мешает естественному отбору делать так, что в следующих поколениях хороших кружочков становится больше, а плохих меньше. Так как, если происходит наоборот, то такой экземпляр картинки уничтожается и дальше свои гены не передаёт.
#9 | 14:56 02.02.2017 | Кому: SHOEI
> а зачем это надо?

По приколу.
#10 | 17:58 02.02.2017 | Кому: Всем
Мона Лиза вышла с особой улыбкой :)

[censored]
#11 | 17:59 02.02.2017 | Кому: robot-demagog
> Набрал себе плюсиков на пикабу

а зачем это надо? (с)
#12 | 12:01 06.02.2017 | Кому: rahs
Ну, как я и говорил, дальше почти не меняется. Появление глаз штука случайная. Они иногда и на 1000-м поколении проявляются и закрепляются отбором, а иногда лицо остаётся гладким очень долго. Для прорисовки мелких деталей нужно вводить специальные правила, чтобы мелкие кружки рисовались поверх крупных. Но 400к поколений - внушает.
#13 | 13:03 06.02.2017 | Кому: rahs
> Жаль, что оно не параллелится никак.

Я сварщик ненастоящий. Мне нужно было простое средство для вывода на экран и сравнения двух картинок. Процессинг давал лёгкий и быстрый доступ к массиву пикселей. Формально можно было бы переписать программу так, чтобы на экран ничего лишнего не выводилось, а сразу происходило сравнение двух массивов на уровне чистой математики. Тогда будет работать быстрее. Я уже начал писать под это специальный класс организмов Pixy, но затем стало лениво.

>Кстати, на пейзаж внимание обратил?


Нормальный пейзаж. Река проявилась, горы, даже зачатки дороги.

Ещё для оптимизации имеет смысл сначала рисовать малым числом крупных кругов, а потом потихоньку добавлять новые более мелкие для прорисовки деталей. В принципе, в живой природе так и происходит. Новая информация получается из дублирования старой. Многие наши гены - это мутировавшие копии некого одного общего предка.
#14 | 15:59 06.02.2017 | Кому: rahs
Да я хотел заставить ребёнка в качестве школьного проекта такую штуку написать. Но так как проект только в следующем году, то решил пока проверить, как оно работает и работает ли вообще, но что-то увлёкся :)
#15 | 15:56 10.02.2017 | Кому: rahs
Ну визуально изменений почти нет, хотя цифры и улучшились. Не верю, что различие за обозримое время совсем до нуля упадёт.

Лучше поэкспериментировать с большим количеством элементов. К тому же я слегка допилил новую версию, теперь маленькие круги всегда рисуются выше больших. На этом есть вероятность получить более качественное изображение. Плюс отладил один из вариантов полового размножения (точнее вернулся к первоначальной задумке). Визуально оно очень сильно отличается от простого деления, но радикального прироста в скорости эволюции не даёт.

[censored]
#16 | 16:19 10.02.2017 | Кому: rahs
Забыл убрать после отладки, там в новой версии нужно ещё строчку noLoop(); закомментить, а то будет отрисовываться только первое поколение.
Войдите или зарегистрируйтесь чтобы писать комментарии.