- PVSM.RU - https://www.pvsm.ru -
Я, как и многие люди технического склада ума, испытываю трудности с рисованием и графическими решениями вообще. Я, конечно, могу отличить красивое решение от плохого, но оказываюсь в тупике, когда нужно нарисовать что-то с нуля, будь то пользовательский интерфейс приложения, презентация или открытка.
В своей прошлой статье я продемонстрировал, как можно использовать генетический алгоритм чтобы аппроксимировать изображение по заданному образцу. В этой статье, я покажу, как применить генетический алгоритм для генерации изображений «из головы».
В прошлой статье [1], посвященной аппроксимации изображения набором полигонов, в качестве фитнес-функции мы использовали похожесть подбираемого изображения на оригинал. Какую же фитнес-функцию использовать если оригинал отсутствует, а нам нужно породить что-то совершенно новое? Ответ напрашивается сам собой — уровень положительных эмоций, вызываемый изображением-кандидатом.
Однако, это ставит новый вопрос — как его надежно измерить. Наиболее простым подходом было бы попросить пользователя поставить оценку изображению, однако на мой взгляд это слишком напрягло бы логическую часть
Так как фитнес-функция используется для ранжирования решений, сортировки их в порядке возрастания достоинства, предлагается опустить фазу подсчета фитнес-функции и перейти сразу к сортировке, используя человеческий
Исходный код Java приложения, реализующего данную идею может быть найден здесь [3], исполняемый код можно скачать здесь [4], для запуска требуется JRE или JDK [5].
Приложение функционирует следующим образом:
Алгоритм QuickSort был немного модифицирован, чтобы сократить количество кликов мыши, необходимых для одного цикла сортировки:
сортировка прекращается, как только однозначно определяется 6 лучших решений, которые будут использованы для порождения нового поколения
результаты сравнения с предыдущих циклов кэшируются, и если однажды пользователь уже сравнивал какую-то пару картинок, на следующей итерации результаты будут взяты из кэша
Для начала попытаемся нарисовать абстрактное изображение которое будет радовать наш глаз. Будем строить изображение, как наложение пяти случайных радиальных градиентов с прозрачностью 50%. Каждый градиент характеризуется центральной точкой, точкой фокуса, радиусом и набором из десяти цветов, плавно переходящих друг в друга.
Все эти параметры инициируются случайными значениями и подвергаются эволюции под действием вкусовых предпочтений пользователя.
Изображения из первых поколений обычно выглядят примерно так:
Однако уже через несколько поколений привлекательность изображения многократно улучшается:
Рассмотрим более практический пример, создадим дизайн виртуальных часов, которые можно использовать как виджет.
Разделим часы на следующие составляющие и определим параметры, которые подвергнем отбору.
Элемент виджета | Параметры |
Корпус |
|
Циферблат |
|
Большие отметки (12, 3, 6, 9 часов) |
|
Малые отметки (все остальные) | Тот же набор что и у больших отметок |
Как и в случае с радиальными градиентами, первые поколения часов выглядят как произведения авангардного искусства:
Со временем же, под действием искусственного во всех смыслах отбора начинают появляться вполне достойные варианты:
Таким образом продемонстрирована практическая применимость генетического алгоритма в дизайне. Случайный характер алгоритма позволяет сгенерировать идеи, которые не пришли бы в голову сами, а скрещивание нескольких хороших решений со временем собирает воедино их наилучшие элементы.
Описанный подход можно использовать для широкого набора дизайнерских задач, например для:
Единственное неудобство с моей точки зрения — это необходимость сортировать картинки попарным сравнением, что при размере популяций в 14 штук приводит к необходимости совершить 15-40 кликов за цикл.
Естественной оптимизацией было бы использование нейрокомпьютерного интерфейса наподобие Emotive EPOC [6]. Это позволило бы демонстрировать каждую картинку один раз с измерением уровня положительных эмоций вызываемых изображением, что в свою очередь повысило бы скорость эволюции, позволило бы увеличить размер популяции для более широкого охвата пространства решений.
Автор: tsvetkovpa
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/14579
Ссылки в тексте:
[1] статье: http://habrahabr.ru/post/149161/
[2] мозга: http://www.braintools.ru
[3] здесь: http://evoj.sourceforge.net/static/demos/mindpicture-src.zip
[4] здесь: http://evoj.sourceforge.net/static/demos/mindpicture-executable.zip
[5] JRE или JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html
[6] Emotive EPOC: http://en.wikipedia.org/wiki/Emotiv_Systems#Emotiv_EPOC
Нажмите здесь для печати.