Pull to refresh

Comments 18

C проектом похожим на этот почти полностью (я не обвиняю никого, бывает что одни и те же идеи приходят разным людям в разное время) уже выступал один ученый в 1979 году, зовут его Karl Sims. Вот ссылка на его сайт: www.karlsims.com/. Он придумал даже специальный язык для генетического программирования и написал нужный софт. За это он был награжден кучей премий и получил ряд патентов.

А вот тут 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;
}

Не надо так больше делать, используйте спойлер, пожалуйста.
Спасибо, идея понятна. Но лучше было бы это спрятать под спойлер.
Вот теперь у меня есть у «умное название» для ошибок в процессе программирования графики…
Оказывается, что я «генерирую абстрактных изображений с помощью генетических алгоритмов».
Напомнило — в мульте «Магазинчик БО» заяц Бо писал программу, которая выдаст идеальное изображение.
Программа выдала, и всю серию герои потом залипали на эту картинку.
Для тех кто еще не видел концептуальный скринсейвер — electric sheep. Очень красиво и как раз генерируются картинки (вернее анимация) с помощью генетических алгоритмов, а отбором выступают пользователи, голосуя за понравившиеся варианты.
Прелесть генетических алгоритмов в том, что можно использовать fitness function, а вы самостоятельно оцениваете красивость картинок. Скажите, 100 поколений по 100 «осыбей» вы тоже оценивать вручную будете?
Конечно, было бы довольно любопытно разработать такую fitness function, более того, это даже можно сделать, например, рассмотрев наилучшие изображения и попытавшись выделить среди них какие-то подмножества (сомневаюсь, что существуют некий единый образ идеального изображения). Но это будет уже совсем другой проект. Поэтому данная работа имеет право на существования не в виде промежуточного звена, а в качестве самостоятельного исследования.
Генофонд вымирает, картинки стремятся стать одинаковыми.
Sign up to leave a comment.

Articles