Comments 18
C проектом похожим на этот почти полностью (я не обвиняю никого, бывает что одни и те же идеи приходят разным людям в разное время) уже выступал один ученый в 1979 году, зовут его Karl Sims. Вот ссылка на его сайт: www.karlsims.com/. Он придумал даже специальный язык для генетического программирования и написал нужный софт. За это он был награжден кучей премий и получил ряд патентов.
А вот тут jhlabs.com/java/art.html есть демо, где вы сами можете обучить систему.
А вот тут jhlabs.com/java/art.html есть демо, где вы сами можете обучить систему.
+14
<offtop>Что-то народ из песочницы активизировался) Либо отошли от нового года и увидели инвайты))</offtop>
0
Теперь осталось поменять прямую генерацию растра по формуле на фрактал — и будет счастье :)
+2
А можете рассказать (идейно), как скрещиваются функции?
0
Я не люблю философствовать, так что вот код:
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;
}
0
Вот теперь у меня есть у «умное название» для ошибок в процессе программирования графики…
Оказывается, что я «генерирую абстрактных изображений с помощью генетических алгоритмов».
Оказывается, что я «генерирую абстрактных изображений с помощью генетических алгоритмов».
+4
Напомнило — в мульте «Магазинчик БО» заяц Бо писал программу, которая выдаст идеальное изображение.
Программа выдала, и всю серию герои потом залипали на эту картинку.
Программа выдала, и всю серию герои потом залипали на эту картинку.
+2
Очень странно, что Ваш преподаватель не знал, например, про эту работу Кенета Стенли по CPPN en.m.wikipedia.org/wiki/Compositional_pattern-producing_network.
+2
Для тех кто еще не видел концептуальный скринсейвер — electric sheep. Очень красиво и как раз генерируются картинки (вернее анимация) с помощью генетических алгоритмов, а отбором выступают пользователи, голосуя за понравившиеся варианты.
+1
Прелесть генетических алгоритмов в том, что можно использовать fitness function, а вы самостоятельно оцениваете красивость картинок. Скажите, 100 поколений по 100 «осыбей» вы тоже оценивать вручную будете?
0
Конечно, было бы довольно любопытно разработать такую fitness function, более того, это даже можно сделать, например, рассмотрев наилучшие изображения и попытавшись выделить среди них какие-то подмножества (сомневаюсь, что существуют некий единый образ идеального изображения). Но это будет уже совсем другой проект. Поэтому данная работа имеет право на существования не в виде промежуточного звена, а в качестве самостоятельного исследования.
-1
x*y рулит.
-1
Генофонд вымирает, картинки стремятся стать одинаковыми.
+2
Sign up to leave a comment.
Генерация абстрактных изображений с помощью генетических алгоритмов