Pull to refresh
17
0
Send message
Конечно, было бы довольно любопытно разработать такую fitness function, более того, это даже можно сделать, например, рассмотрев наилучшие изображения и попытавшись выделить среди них какие-то подмножества (сомневаюсь, что существуют некий единый образ идеального изображения). Но это будет уже совсем другой проект. Поэтому данная работа имеет право на существования не в виде промежуточного звена, а в качестве самостоятельного исследования.
Я не люблю философствовать, так что вот код:

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;
}

Information

Rating
Does not participate
Registered
Activity