Найти тему
ZDG

Исходный код генетического алгоритма и новости канала

Оглавление

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

Предыдущие части: Овердрайв, Новая надежда, Заключение, Генетическая Мона Лиза

Успел немного довести до ума код генетического алгоритма, в котором отсутствовала возможность записи и загрузки текущей конфигурации.

Код выложил сюда: https://github.com/nandakoryaaa/genetic_poly_grad

Описание работы и инструкции см. в конце статьи.

Программа реализована на C + SDL2. Вы можете собрать программу из исходников, или воспользоваться готовой версией (под Windows), которая лежит в /bin вместе с необходимыми библиотеками.

Поясню, что происходило всё это время

В качестве основы был взят код "Генетической Моны Лизы": https://rogerjohansson.blog/2008/12/11/genetic-programming-mona-lisa-source-code-and-binaries/

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

Такое изменение позволило предположить, что будут достигнуты визуально более качественные результаты.

Дело в том, что множественные пересечения полигонов создают "грязную" структуру картинки:

В то же время градиентные заливки треугольников выглядят более натурально и сочно:

-2

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

В результате на Моне Лизе получается очень неплохо:

-3

Однако другая, специально подобранная, картинка оказалась более проблемной:

-4

Запускать на ней режим овердрайва категорически нельзя, так как он в первую очередь займётся белыми полосками и потратит все полигоны на них. Без овердрайва также получается что-то невнятное.

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

-5

Но и это не сильно помогает. Получаем что-то такое:

-6

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

В то же время лицо так и осталось плохо проработанным (не хватило полигонов).

Лучший результат дала модификация картинки с полным удалением полосок:

-7

В общем, предлагаю вам самим попробовать разные варианты.

Инструкция к программе

Запуск:

poly_grad.exe image.bmp

Программа работает только с изображениями BMP размером не больше чем 1024 * 1024 (чтобы не ждать результата сутками, рекомендуется 256...512).

Дополнительные ключи запуска:

  • -minpolys N
    первичное количество полигонов в хромосоме (по умолчанию 1)
  • -load filename
    загрузить сохранённую хромосому из файла filename
  • -seed N
    задать старт для генератора случайных чисел. Указывая один и тот же старт, вы будете получать одну и ту же эволюцию.
  • -flatcolor
    все вершины треугольника имеют один цвет
  • -flatalpha
    все вершины треугольника имеют одну прозрачность
  • -maxalpha N
    максимальная прозрачность (0 - полностью прозрачно, 255 - непрозрачно, по умолчанию 255). Параметры flatcolor, flatalpha и maxalpha 60..120 позволяют получать результат, похожий на оригинальную программу.
  • -greedy
    использовать дополнительные циклы, чтобы гарантированно мутировать каждый полигон
  • -initgray
    при инициализации нового полигона давать ему серый цвет
  • -overdrive N
    включать режим овердрайва, когда накопится N полигонов (возможные значения 2..255)

После завершения программы строка её запуска со всеми ключами печатается в консоли, и её можно скопировать и повторить.

Например, попробуйте такую строку:

poly_grad.exe images/mona-256.bmp -initgray -greedy -overdrive 2 -seed 1623610575

Режим маски

После старта программы она находится в режиме рисования маски. Вы можете с помощью мыши поставить или убрать маску на ненужных областях картинки.

Нажав "пробел", вы запустите программу с текущей маской. Нажимая "пробел" повторно, вы можете снова переходить в режим маски и редактировать её.

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

Режим эволюции

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

Нажимая клавишу "d", вы можете циклически переключаться между режимами показа: текущих изменённых полигонов, "грязного прямоугольника", полигонов + прямоугольника, ничего.

Клавиша "w" ("who"): показ статистики в консоли.

Клавиша "s": сохранить текущую хромосому в файл.

Клавиша "i": сохранить текущее изображение в BMP.

Клавиша "r": перерасчёт рейтинга. Использовалась для дебага, сейчас интереса не представляет (в консоли должен напечататься старый и новый рейтинг, и они должны быть равны)

Клавиша "o": режим показа оригинальных полигонов. В этом режиме будет показано место рождения каждого полигона. Для контроля, чтобы видеть, где и как они добавлялись. Возврат обратно тоже с помощью "o".

Клавиша "p": печать текущей хромосомы.

Клавиша "b": печать блоков рейтинга.