Недавно прочитал статью про генерацию абстрактных изображений и вспомнил об одной идее, которую забросил пару лет назад из-за отсутствия практической ценности, и уже совершенно про неё забыл. Спешу поделиться, так как думаю что она вполне сгодится в качестве ещё одного примера работы генетического алгоритма.
Вряд ли идея нова, да и слишком она проста, чтобы не приходить никому в голову ранее. Состоит она в том, чтобы к изображению последовательно применять некоторые эффекты, настройки для которых отбираются генетическим алгоритмом.
В моём примере сами эффекты выбираются вручную — это колонка справа от изображения: размытие, цвет, контраст, резкость и т.п. А вот настройки для каждого из эффектов выбираются случайно. Но случайно до тех пор, пока вы не запустите процесс эволюции и отбора.
Осуществляется этот процесс так:
- Нажимаем «Старт». Тем самым запускаем ротацию, в ходе которой с каждой итерацией к оригиналу изображения применяются выбранные эффекты со случайными значениями. Эдакая демонстрация случайных индивидов.
- Нажимая «Clone» мы добавляем текущего индивида в популяцию. Это отнюдь не означает что мы его отобрали и будем скрещивать. На данной стадии мы их просто добавляем на всякий случай для дальнейшего рассмотрения. Можем удалить все сразу нажав «Remove».
- У каждой картинки или индивида есть ссылки «Like»/«Don't like». Нажимая «Like» у тех что понравились мы тем самым отбираем эти картинки для скрещивания, или другими словами подкрепляем их признаки. Причём, чем больше накликали, тем сильнее подкрепили эти признаки.
Несколько слов о наложении эффектов
- Порядок наложения эффектов имеет значение и меняется перетаскиванием пункта эффекта вверх или вниз
- У некоторых эффектов значения численные, такие как резкость, контраст и т.п. Но у таких как сепия — значения булевы, либо применяется, либо нет. Рядом с эффектами эти значения демонстрируются.
- Рядом с эффектами есть ещё селекторы которыми предполагалось тормозить эволюцию по конкретному эффекту, но применять его с заданной вручную настройкой. И кликнув затем на свойство можно выбрать значение. Но интерфейс у этого функционала не ахти.
Несколько слов об алгоритме
При классическом, самом простом описании генетического алгоритма, обычно говорят о популяции состоящей из индивидов, отбора из них лучших, скрещивании и мутации. Затем схема повторяется с популяцией уже новых получившихся индивидов. Эта схема проста для понимания, так как легко провести аналогию с живыми существами, и я стараюсь использовать те же термины.
Но фактически, когда я писал свой ужасный код, вся эта схема превратилась в одно единственное дерево признаков, где каждый признак имеет некоторую вероятность проявления. Мне кажется, что такое представление ещё проще, особенно когда нужно писать код. Смотрите что получается. На начальной стадии вероятности всех признаков одинаковы и дерево генерирует случайных индивидов, а затем мы эти вероятности просто меняем в соответствии с отбором лучших и коэффициентом мутации, вот и всё! Ведь по сути при выборе сильнейших выживают не индивиды, а признаки, которые они в себе несут, именно признаки сильнейшего подкрепляются. Значит при отборе лучшего индивида нам просто надо найти его признаки в дереве всех признаков и увеличить их вероятность. Ну что бы в будущем они чаще проявлялись. А мутация — не что иное как изменение вероятностей всех признаков дерева в сторону их равновероятного проявления. Мутация в 100% означает что все признаки стали вновь равновероятными, независимо от истории их эволюции, 0% мутации — вероятность признаков будет снова строго задана и определяться историей изменения вероятностей.
О проекте
Не думаю что эта идея и проект может быть широко востребованы на практике, даже если привести в порядок интерфейс. По крайней мере не с такой фитнесс-функцией. Дело в том, что для реального редактирования фото гораздо проще, быстрее и эффективнее использовать
Всех с наступившим Новым Годом!
Автор: DeveloperAlexander