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