Про Watchmaker слышать не приходилось, сравню с jGap.
Собственно после знакомства с jGap я и задумал написать свой фреймворк.
Мне в jGap не понравилось то, что хромосому нужно формировать руками описывая странными дескрипторами переменные и выстраивая их в линейную структуру, запоминая при этом на каком месте в хромосоме какая переменная находится. Это очень неудобно, особенно когда ты занимаешься рефакторингом — добавляешь/удаляешь переменные, от этого смещаются все остальные и нужно бегать по коду и править индексы.
В EvoJ решение описывается естественным Java-интерфейсом с небольшой помощью аннотаций. В случае рефакторинга обо всем позаботится фреймворк и IDE.
Плюс к этому мутацией можно управлять декларативно — можно на уровне аннотаций указать области допустимых значений переменных, радиус и вероятность мутации.
Кроме того, так как переменные отображаются на байтовый массив можно написать универсальные стратегии скрещивания, без оглядки на реальный состав решения. Собственно говоря и стратегии мутации у меня тоже первое время работали с битами, но с усложнением функционала фреймворка пришлось их перевести в deprecated.
Интересный вариант! Если покрыть картинку треугольниками Делоне, то мутировать можно будет только опорные точки, а цвета подбирать как среднее из точек оригинального изображения попавших в конкретный треугольник. Едиственное что на каждой итерации придется перетриангулировать, что тоже требует затрат времени… Что увеличит вычислительные затраты на одну итерацию, однако само число необходимых итераций должно будет, на мой взглдя уменьшиться, так что суммарный эффект будет положительным.
Да, это Neues Rathaus в Ганновере. Очень красивое здание, как внутри так и снаружи. Взял фотку из своего последнего отпуска.
Что-то подобное можете сделать самостоятельно при помощи исходников, что приложены к статье. Там нужно только путь к исходной картинке попраивить и запустить. Лучше всего получаются пейзажи, или картины с крупными деталями.
Интересно, а высшее образование любое, или профильное? А то я по образованию вообще строитель, а работаю как Lead Software Engineer. Зная немцев с их придирчивостью…
Чистые накладные расходы не замерял.
Сравнивал реализацию на java.lang.Proxy c реализацией при помощи cgLib.
Результаты сильно зависят от сложности фитнесс-функции.
Пример с поиском минимума функции на cgLib работает в полтора-два раза быстрее. Но, пример с аппроксимацией изображения работает столько же — отрисовка изображений и попиксельное сравнение операция дорогая, на фоне которой вызов нескольких методов через прокси занимает пренебрежимо мало. Та же самая ситуация наблюдалась в случае с обучением нейросети.
Поэтому я решил сделать все на стандартных Proxy. Тем не менее, я оставил штатный способ подменить фабрику прокси на cgLib (ну или любую другую) в рантайме.
Собственно после знакомства с jGap я и задумал написать свой фреймворк.
Мне в jGap не понравилось то, что хромосому нужно формировать руками описывая странными дескрипторами переменные и выстраивая их в линейную структуру, запоминая при этом на каком месте в хромосоме какая переменная находится. Это очень неудобно, особенно когда ты занимаешься рефакторингом — добавляешь/удаляешь переменные, от этого смещаются все остальные и нужно бегать по коду и править индексы.
В EvoJ решение описывается естественным Java-интерфейсом с небольшой помощью аннотаций. В случае рефакторинга обо всем позаботится фреймворк и IDE.
Плюс к этому мутацией можно управлять декларативно — можно на уровне аннотаций указать области допустимых значений переменных, радиус и вероятность мутации.
Кроме того, так как переменные отображаются на байтовый массив можно написать универсальные стратегии скрещивания, без оглядки на реальный состав решения. Собственно говоря и стратегии мутации у меня тоже первое время работали с битами, но с усложнением функционала фреймворка пришлось их перевести в deprecated.
Что-то подобное можете сделать самостоятельно при помощи исходников, что приложены к статье. Там нужно только путь к исходной картинке попраивить и запустить. Лучше всего получаются пейзажи, или картины с крупными деталями.
Я видел jgap когда начинал работать с генетическими алгоритмами. Мне не понравился их подход к созданию хромосом. Тогда я задумал написать EvoJ
Сравнивал реализацию на java.lang.Proxy c реализацией при помощи cgLib.
Результаты сильно зависят от сложности фитнесс-функции.
Пример с поиском минимума функции на cgLib работает в полтора-два раза быстрее. Но, пример с аппроксимацией изображения работает столько же — отрисовка изображений и попиксельное сравнение операция дорогая, на фоне которой вызов нескольких методов через прокси занимает пренебрежимо мало. Та же самая ситуация наблюдалась в случае с обучением нейросети.
Поэтому я решил сделать все на стандартных Proxy. Тем не менее, я оставил штатный способ подменить фабрику прокси на cgLib (ну или любую другую) в рантайме.