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(); }
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(); }
static void Main(string[] args) { string line = ""; //State state = StateInit(); State state = new State(); StateInit(state); State maxValues = MaxValuesInit(); List <Test> tests = TestsInit(); int iterations = 100; int populationSize = 10; double crossoverProb = 0.1; double mutationProb = 0.1; double averageFitness = 0; CryptoRandom r = new CryptoRandom(); List <DecisionTree> population = new List <DecisionTree>(); DecisionTree enemy = new DecisionTree(new List <int> { 100, 100, 50, 0 }, state, maxValues, tests, r); //DecisionTree enemy = CreateEnemy(r, state, tests); //population init for (int i = 0; i < populationSize; i++) { population.Add(new DecisionTree(new List <int> { 100, 100, 50, 0 }, state, maxValues, tests, r)); //Console.WriteLine("Wielkosc drzewa: {0}", population[i].elementCount); //Console.WriteLine("Wielkosc drzewa': {0}", population[i].CountElements()); } while (iterations > 0) //glowna petla programu, ustalona ilosc iteracji, pozniej dodac zatrzymanie po stagnacji { for (int j = 0; j < populationSize; j++) { //petla walki int turn = 1; while (turn <= 99 && state["HP"] > 0 && state["enemyHP"] > 0) { //Console.WriteLine("Osobnik {0}, tura: {1}", j, turn); //EnemyMakeMove(enemy.decide(state), state); EnemyMoves(state); MakeMove(population[j].decide(state), state); turn++; } //Console.WriteLine("HP -> {0}", state["HP"]); //Console.WriteLine("enemyHP -> {0}", state["enemyHP"]); //Console.WriteLine("distance -> {0}", state["distance"]); //Console.WriteLine("isInDanger -> {0}", state["isInDanger"]); //Console.WriteLine("enemyIsInDanger -> {0}", state["enemyIsInDanger"]); //Console.WriteLine("isDefending -> {0}", state["isDefending"]); //Console.WriteLine("enemyIsDefending -> {0}", state["enemyIsDefending"]); //Console.ReadLine(); population[j].fitness = Evaluate(state, maxValues, turn, population[j].elementCount); //state = StateInit(); StateInit(state); } averageFitness = population.Sum(p => p.fitness) / populationSize; Console.WriteLine("srednia wartosc funkcji oceny: " + averageFitness); Console.WriteLine("najgorszy osobnik: " + population.Min(p => p.fitness)); Console.WriteLine("najlepszy osobnik: " + population.Max(p => p.fitness)); line = String.Concat(line, (averageFitness.ToString() + " " + population.Max(p => p.fitness) + " " + "\r\n")); //selekcja List <DecisionTree> SelectedIndividuals = EliteRankingSelection(population, populationSize, r); //wybranie najlepszego z poprzedniej populacji i ustawienie na enemy //enemy = population.OrderByDescending(p => p.fitness).First().Clone(); population.Clear(); // usuniecie starej populacji //wybranie osobnikow do krzyzowania, przepisanie reszty do nowej populacji List <DecisionTree> IndividualsToCross = new List <DecisionTree>(); for (int i = 0; i < populationSize; i++) { if (r.NextDouble() <= crossoverProb) { IndividualsToCross.Add(SelectedIndividuals[i]); } else { population.Add(SelectedIndividuals[i]); } } //zapewnienie parzystej ilosci osobnikow do krzyzowania if (IndividualsToCross.Count % 2 != 0) { population.Add(IndividualsToCross.Last()); IndividualsToCross.RemoveAt(IndividualsToCross.Count - 1); } Console.WriteLine("Skrzyzowane osobniki: " + IndividualsToCross.Count); //krzyzowanie while (IndividualsToCross.Count > 0) { DecisionTree Individual1 = IndividualsToCross[r.Next(0, IndividualsToCross.Count)]; IndividualsToCross.Remove(Individual1); DecisionTree Individual2 = IndividualsToCross[r.Next(0, IndividualsToCross.Count)]; IndividualsToCross.Remove(Individual2); Crossover(Individual1, Individual2, r); population.Add(Individual1); population.Add(Individual2); } int mutationCount = 0; //mutacja for (int i = 0; i < populationSize; i++) { if (r.NextDouble() <= mutationProb) { Mutation(population[i], r, state, maxValues, tests); mutationCount++; } } Console.WriteLine("Zmutowane osobniki: " + mutationCount); iterations--; Console.ReadLine(); } System.IO.StreamWriter file = new System.IO.StreamWriter("d:\\test.txt"); file.WriteLine(line); file.Close(); Console.ReadLine(); }