Комментарии 18
C проектом похожим на этот почти полностью (я не обвиняю никого, бывает что одни и те же идеи приходят разным людям в разное время) уже выступал один ученый в 1979 году, зовут его Karl Sims. Вот ссылка на его сайт: www.karlsims.com/. Он придумал даже специальный язык для генетического программирования и написал нужный софт. За это он был награжден кучей премий и получил ряд патентов.
А вот тут jhlabs.com/java/art.html есть демо, где вы сами можете обучить систему.
А вот тут jhlabs.com/java/art.html есть демо, где вы сами можете обучить систему.
<offtop>Что-то народ из песочницы активизировался) Либо отошли от нового года и увидели инвайты))</offtop>
Теперь осталось поменять прямую генерацию растра по формуле на фрактал — и будет счастье :)
А можете рассказать (идейно), как скрещиваются функции?
Я не люблю философствовать, так что вот код:
function cross(headNode1, headNode2, prob) { // Пусть r1, r2 - оценки изображений, тогда prob = r1 / (r1+r2)
var newHeadNode = new Node();
var children = [];
// Скрещивание производится отдельно для каждой пары узлов
var mainNode, addNode; // В паре выделяем главный и побочный узел
var newProb = 0;
var types = "";
if ( probability(prob) ) { // С вероятностью prob
mainNode = headNode1;
addNode = headNode2;
newProb = prob;
} else {
mainNode = headNode2;
addNode = headNode1;
newProb = 1 - prob;
}
newHeadNode.setValue( mainNode.getValue() );
newHeadNode.type = mainNode.type;
types = mainNode.type + "; " + addNode.type;
switch (types) {
case "const; const":
case "const; coord":
case "coord; const":
case "coord; coord":
case "const; func1":
case "coord; func1":
case "func1; const":
case "func1; coord":
case "const; func2":
case "coord; func2":
case "func2; const":
case "func2; coord":
for (var i = 0; i < mainNode.getNumOfChildren(); i++) {
children[i] = mainNode.getChildByNumber(i);
}
break;
case "func1; func1":
children = [
cross(
mainNode.getChildByNumber(0),
addNode.getChildByNumber(0),
newProb
)
];
break;
case "func1; func2":
children = [
cross(
mainNode.getChildByNumber(0),
addNode.getChildByNumber( randInt(0, 1) ),
newProb
)
];
break;
case "func2; func1":
children = [
cross(
mainNode.getChildByNumber(0),
addNode.getChildByNumber(0),
newProb
),
cross(
mainNode.getChildByNumber(1),
addNode.getChildByNumber(0),
newProb
)
];
break;
case "func2; func2":
children = [
cross(
mainNode.getChildByNumber(0),
addNode.getChildByNumber(0),
newProb
),
cross(
mainNode.getChildByNumber(1),
addNode.getChildByNumber(1),
newProb
)
];
break;
default:
children = [];
break;
}
for (var i = 0; i < children.length; i++) {
newHeadNode.addNode(children[i]);
}
return newHeadNode;
}
Вот теперь у меня есть у «умное название» для ошибок в процессе программирования графики…
Оказывается, что я «генерирую абстрактных изображений с помощью генетических алгоритмов».
Оказывается, что я «генерирую абстрактных изображений с помощью генетических алгоритмов».
Напомнило — в мульте «Магазинчик БО» заяц Бо писал программу, которая выдаст идеальное изображение.
Программа выдала, и всю серию герои потом залипали на эту картинку.
Программа выдала, и всю серию герои потом залипали на эту картинку.
Очень странно, что Ваш преподаватель не знал, например, про эту работу Кенета Стенли по CPPN en.m.wikipedia.org/wiki/Compositional_pattern-producing_network.
Для тех кто еще не видел концептуальный скринсейвер — electric sheep. Очень красиво и как раз генерируются картинки (вернее анимация) с помощью генетических алгоритмов, а отбором выступают пользователи, голосуя за понравившиеся варианты.
Прелесть генетических алгоритмов в том, что можно использовать fitness function, а вы самостоятельно оцениваете красивость картинок. Скажите, 100 поколений по 100 «осыбей» вы тоже оценивать вручную будете?
Конечно, было бы довольно любопытно разработать такую fitness function, более того, это даже можно сделать, например, рассмотрев наилучшие изображения и попытавшись выделить среди них какие-то подмножества (сомневаюсь, что существуют некий единый образ идеального изображения). Но это будет уже совсем другой проект. Поэтому данная работа имеет право на существования не в виде промежуточного звена, а в качестве самостоятельного исследования.
x*y рулит.
Генофонд вымирает, картинки стремятся стать одинаковыми.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Генерация абстрактных изображений с помощью генетических алгоритмов