Pull to refresh
29
0
Pavel Tsvetkov @tsvetkovpa

Technical Project Manager

Send message
Удачное изображение — много относительно крупных деталей. Хорошо получилось. Этак скоро можно будет устраивать выставку эволюционного искусства. :-)
Про Watchmaker слышать не приходилось, сравню с jGap.
Собственно после знакомства с jGap я и задумал написать свой фреймворк.
Мне в jGap не понравилось то, что хромосому нужно формировать руками описывая странными дескрипторами переменные и выстраивая их в линейную структуру, запоминая при этом на каком месте в хромосоме какая переменная находится. Это очень неудобно, особенно когда ты занимаешься рефакторингом — добавляешь/удаляешь переменные, от этого смещаются все остальные и нужно бегать по коду и править индексы.

В EvoJ решение описывается естественным Java-интерфейсом с небольшой помощью аннотаций. В случае рефакторинга обо всем позаботится фреймворк и IDE.

Плюс к этому мутацией можно управлять декларативно — можно на уровне аннотаций указать области допустимых значений переменных, радиус и вероятность мутации.

Кроме того, так как переменные отображаются на байтовый массив можно написать универсальные стратегии скрещивания, без оглядки на реальный состав решения. Собственно говоря и стратегии мутации у меня тоже первое время работали с битами, но с усложнением функционала фреймворка пришлось их перевести в deprecated.
Попробую вариант с триангуляцией, как только свободное время появится. Ну или Вы попробуйте и дайте знать.
Интересный вариант! Если покрыть картинку треугольниками Делоне, то мутировать можно будет только опорные точки, а цвета подбирать как среднее из точек оригинального изображения попавших в конкретный треугольник. Едиственное что на каждой итерации придется перетриангулировать, что тоже требует затрат времени… Что увеличит вычислительные затраты на одну итерацию, однако само число необходимых итераций должно будет, на мой взглдя уменьшиться, так что суммарный эффект будет положительным.
Вы правы, я как то пробовал подобранные полигоны конвертировать в SVG, получалось здорово.
Это будет небыстро, если я правильно представляю себе задачу. Хотя если перевести алгоритм на CUDA…
Ответил Вам чуть ниже — промахнулся с кнопкой
Да, это Neues Rathaus в Ганновере. Очень красивое здание, как внутри так и снаружи. Взял фотку из своего последнего отпуска.

Что-то подобное можете сделать самостоятельно при помощи исходников, что приложены к статье. Там нужно только путь к исходной картинке попраивить и запустить. Лучше всего получаются пейзажи, или картины с крупными деталями.
Ссылка на исходники есть в статье. На всякий случай продублировал в апдейте.
Интересно, а высшее образование любое, или профильное? А то я по образованию вообще строитель, а работаю как Lead Software Engineer. Зная немцев с их придирчивостью…
Будет не объективно, если я сам буду сравнивать свой собственный фреймворк с другим. :-)

Я видел jgap когда начинал работать с генетическими алгоритмами. Мне не понравился их подход к созданию хромосом. Тогда я задумал написать EvoJ
double преобразуется в Double, который является Comparable.
Чистые накладные расходы не замерял.
Сравнивал реализацию на java.lang.Proxy c реализацией при помощи cgLib.

Результаты сильно зависят от сложности фитнесс-функции.
Пример с поиском минимума функции на cgLib работает в полтора-два раза быстрее. Но, пример с аппроксимацией изображения работает столько же — отрисовка изображений и попиксельное сравнение операция дорогая, на фоне которой вызов нескольких методов через прокси занимает пренебрежимо мало. Та же самая ситуация наблюдалась в случае с обучением нейросети.

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

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity