Генератор визуальных интерфейсов с генетическим алгоритмом в помощь дизайнерам

в 18:24, , рубрики: javascript, Алгоритмы, генетические алгоритмы, Дизайн в IT, метки:

Генератор визуальных интерфейсов с генетическим алгоритмом в помощь дизайнерам
Результат генерации первого поколения

Я не дизайнер. Но иногда приходится для каких-то своих проектов придумывать какой-то дизайн, чего я очень не люблю делать. Колдуя несколько часов в фотошопе в голову ничего интересного так и не приходит. Вроде сделаю какой-никакой макет, но чего-то не хватает. Что-то не то. Нужно вдохновение. Именно так и родилась идея сделать генератор визуальных интерфейсов, который служил бы источником вдохновения, подсказывал какие-нибудь формы и их положение. А потом в мою неспокойную голову пришла идея сделать генетический алгоритм, где в роли фитнесс-функции буду выступать я со своей субъективной оценкой. Забегая вперед скажу, что ничего особенного из этой идеи не вышло.

Идея была такова: создается «слой», где есть некоторое случайное количество объектов со случайным положением, размером, радиусом углов и поворотом. Таких слоев создается 6 штук. Вы, как горе-дизайнер из шести сгенерированных объектов выбираете наиболее интересный и удачный с вашей точки зрения. Так выбрав 10 слоев образуется первое поколение, из особей которого и генерируются новые слои, случайным образом скрещивая понравившиеся вам слои. И так снова 10 слоев, и снова новое поколение…

Главная проблема всей идеи в том, что подобрать функцию скрещивания оказалось весьма и весьма проблематично. Совершенно неизвестно что нужно скрещивать. Я пробовал 3 различных варианта:

  • Брать элементы с разных слоев «как есть» и добавлять на новый
  • Брать некоторые свойства элементов с одного и другого слоя и скрещивать их
  • Комбинировать первое и второе

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

Вот пример того, что получается на 10-м поколении:
image

Проект где-то пол года провалялся ни туда, ни сюда. И вот сегодня наткнувшись на него решил выложить его на github.

Демо доступно здесь

P.S. Я не гуру javascript, и работаю с ним по мере необходимости. Это не основной язык. Поэтому просьба оставлять замечания по коду при себе.

Автор: XAKEPEHOK

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js