Esempio n. 1
0
        public static void Mutation(DecisionTree individual, CryptoRandom r, State state, State maxValues, List <Test> tests)
        {
            int  node         = r.Next(1, individual.elementCount + 1);
            Node nodeToMutate = individual.Find(node, individual.root);

            if (nodeToMutate is DecisionNode)
            {
                DecisionNode newNode = individual.generateDecisionNode(state, maxValues, tests);
                ((DecisionNode)nodeToMutate).Decision = newNode.Decision;
            }
            else if (nodeToMutate is ResultNode)
            {
                ResultNode newNode = individual.GenerateResultNode();
                ((ResultNode)nodeToMutate).Move = newNode.Move;
            }
        }
Esempio n. 2
0
        public static void CrossoverWithParent(DecisionTree individual1, DecisionTree individual2, CryptoRandom r)
        {
            int  locus1;
            int  locus2;
            Node node1;
            Node node2;
            Node parent1;
            Node parent2;

            locus1  = r.Next(2, individual1.elementCount + 1);
            node1   = individual1.Find(locus1, individual1.root);
            parent1 = individual1.FindParentOfNode(locus1, individual1.root);

            locus2  = r.Next(2, individual2.elementCount + 1);
            node2   = individual2.Find(locus2, individual2.root);
            parent2 = individual2.FindParentOfNode(locus2, individual2.root);

            if (parent1.leftChild.Equals(node1))
            {
                parent1.leftChild = node2;
            }
            else
            {
                parent1.rightChild = node2;
            }

            if (parent2.leftChild.Equals(node2))
            {
                parent2.leftChild = node1;
            }
            else
            {
                parent2.rightChild = node1;
            }

            individual1.RecalculateKeys();
            individual2.RecalculateKeys();
        }
Esempio n. 3
0
        public static void Crossover(DecisionTree individual1, DecisionTree individual2, CryptoRandom r)
        {
            //wybranie punktu przeciecia z zakresu elementCount
            //dla obu osobnikow
            //zamiana miejscami tylko poddrzew wybranych elementow

            int  locus1;
            int  locus2;
            Node node1;
            Node node2;

            do
            {
                locus1 = r.Next(1, individual1.elementCount + 1);
                node1  = individual1.Find(locus1, individual1.root);
            } while (node1 is ResultNode);

            do
            {
                locus2 = r.Next(1, individual2.elementCount + 1);
                node2  = individual2.Find(locus2, individual2.root);
            } while (node2 is ResultNode);

            Node tempNode = null;

            tempNode        = node1.leftChild;
            node1.leftChild = node2.leftChild;
            node2.leftChild = tempNode;

            tempNode = null;

            tempNode         = node1.rightChild;
            node1.rightChild = node2.rightChild;
            node2.rightChild = tempNode;

            individual1.RecalculateKeys();
            individual2.RecalculateKeys();
        }