public static List <Tierchen> commaSelection(List <Tierchen> Kinder, Wahlverfahren wahl) { var newEltern = new List <Tierchen>(); int anzahlKinder = Kinder.Count; // wähle nächste Eltern var tmpKinder = Kinder; if (wahl == Wahlverfahren.determenistic || //) wahl == Wahlverfahren.roulette) { //tmpKinder = tmpKinder.OrderBy(tier => tier.Wert).ToList(); //foreach (var tier in tmpKinder) //{ // newEltern.Add(tier); // if (anzahlKinder / 7 <= newEltern.Count && newEltern.Count <= anzahlKinder / 5) // break; //} } //else //{ while (true) { addChild(newEltern, tmpKinder, wahl); if (anzahlKinder / 7 <= newEltern.Count && newEltern.Count <= anzahlKinder / 5) { break; } } //} return(newEltern); }
private static void addChild(List <Tierchen> newEltern, List <Tierchen> tmpKinder, Wahlverfahren wahl) { switch (wahl) { case Wahlverfahren.determenistic: newEltern.Add(tmpKinder[newEltern.Count]); break; case Wahlverfahren.roulette: newEltern.Add(chooseChildRoulette(tmpKinder)); break; } }
private static void addChild(Random randomizer, List <Tierchen> newEltern, List <Tierchen> tmpKinder, Wahlverfahren wahl) { switch (wahl) { case Wahlverfahren.zufall: newEltern.Add(chooseChildRandom(randomizer, tmpKinder)); break; case Wahlverfahren.determenistic: newEltern.Add(tmpKinder[newEltern.Count]); break; case Wahlverfahren.roulette: newEltern.Add(chooseChildRoulette(randomizer, tmpKinder)); break; case Wahlverfahren.q_fachesTurnier: newEltern.Add(chooseChildq_fachesTurnier(randomizer, tmpKinder)); break; default: newEltern.Add(chooseChildRandom(randomizer, tmpKinder)); break; } }
public void generateNewGenerations(BackgroundWorker bgworker, MutationType mutationType, int mutationRateStart, int mutationRateEnd, int historySize, int countOfGenerations, int countOfChilds, int pointOfRecombination, SelectionsStrategie selectionsStrategie, Wahlverfahren wahlverfahren) { bool repeat = true; /* * foreach (var tier in Elterngeneration) * { * * Console.WriteLine("Tier: {0} | Wert:\t{1}", tier.ToString(), tier.Wert.ToString("####0.#####")); * } */ /* * Ab hier beginnen die Methoden * Zunächst wird Selektiert */ Random randomizer = new Random(); int counter = 0; while (repeat) { BesteFitness.Add(Elterngeneration.OrderBy(tier => tier.Wert).Select(tier => tier.Wert).FirstOrDefault()); DurchschnittsFitness.Add(Elterngeneration.Sum(tier => tier.Wert) / Elterngeneration.Count()); repeat = false; // Sichere die aktuelle Elterngeneration in die History TierchenHistory.AddRange(Elterngeneration); //Eliminiere die Doppelten TierchenHistory = TierchenHistory.Distinct(new TierchenComparer()).OrderBy(tier => tier.Wert).Take(historySize).ToList(); BesterDerHistoryFitness.Add(TierchenHistory.Select(tier => tier.Wert).FirstOrDefault()); Kindgeneration = new List <Tierchen>(); int countOfMutations = EvolutionAlgorithms.CalculateMutations(mutationType, mutationRateStart, mutationRateEnd, countOfChilds, countOfGenerations, counter); int countOfRecombinations = countOfChilds - countOfMutations; //Rufe Ein-Punkt-Rekombination auf Kindgeneration = EvolutionAlgorithms.NPunktRekombination(randomizer, countOfRecombinations, pointOfRecombination, Kindgeneration, Elterngeneration); Kindgeneration = EvolutionAlgorithms.mutiereKinder(randomizer, Kindgeneration, Elterngeneration, countOfChilds); /* * Der folgende Bereich sollte nicht direkt beschritten werden * Die Methoden sollten aufrufbar / wählbar sein */ // ### [NEW] ist ein wenig Kritisch, da diese Frage vor jedem Erteugen einer neuen Generation gestellt wird // ### das heißt wenn man auf einen Schlag 100 Generationen erzeugen will wird diese Schleife immer durch diese Frage unterbrochen // ### Frage Stellen, bevor ein neuen Durchlauf beginnt (siehe Frage nach Wiederholung) //repeat2 = true; //while (repeat2) //{ //Console.WriteLine("Welche Selektion soll ausgeführt werden?\r\n[n]: keine (Kinder als Elten übernehmen)\r\n[k]: Komma\r\n[p]: Plus\r\n[...]"); //var input = Console.ReadLine(); switch (selectionsStrategie) { case SelectionsStrategie.keine: //repeat2 = false; //Lösche alle Eltern Elterngeneration.Clear(); //Kindgeneration ist neue Elterngeneration Elterngeneration.AddRange(Kindgeneration); //Jetzt kann die Kindgeneration gelöscht werden Kindgeneration.Clear(); break; case SelectionsStrategie.comma: //repeat2 = false; var tmpList1 = EvolutionAlgorithms.commaSelection(randomizer, Kindgeneration, Wahlverfahren.determenistic); Elterngeneration.Clear(); //Kindgeneration ist neue Elterngeneration Elterngeneration.AddRange(tmpList1); //Jetzt kann die Kindgeneration gelöscht werden Kindgeneration.Clear(); //KommaSelektion(randomizer); break; case SelectionsStrategie.plus: //repeat2 = false; var tmpList2 = EvolutionAlgorithms.plusSelection(randomizer, Elterngeneration, Kindgeneration, Wahlverfahren.determenistic); //Lösche alle Eltern Elterngeneration.Clear(); //Kindgeneration ist neue Elterngeneration Elterngeneration.AddRange(tmpList2); //Jetzt kann die Kindgeneration gelöscht werden Kindgeneration.Clear(); //KommaSelektion(randomizer); break; } //} /* * foreach (var tier in Elterngeneration) * { * Console.WriteLine("Tier: {0} | Wert:\t{1}", tier.ToString(), tier.Wert.ToString("####0.#####")); * } */ counter++; bgworker.ReportProgress((counter * 100 / countOfGenerations), counter); if (counter >= countOfGenerations) { BesteFitness.Add(Elterngeneration.OrderBy(tier => tier.Wert).Select(tier => tier.Wert).FirstOrDefault()); DurchschnittsFitness.Add(Elterngeneration.Sum(tier => tier.Wert) / Elterngeneration.Count()); // letzte Sicherung der Elterngeneration in die History TierchenHistory.AddRange(Elterngeneration); //Eliminiere die Doppelten TierchenHistory = TierchenHistory.Distinct(new TierchenComparer()).OrderBy(tier => tier.Wert).Take(historySize).ToList(); counter = 0; return; } else { repeat = true; } } }
public static List <Tierchen> plusSelection(Random randomizer, List <Tierchen> Eltern, List <Tierchen> Kinder, Wahlverfahren wahl) { var newEltern = new List <Tierchen>(); int anzahlKinder = Kinder.Count; int anzahlEltern = Eltern.Count; // wähle nächste Eltern var tmpKinder = Kinder.Union(Eltern).ToList(); if (wahl == Wahlverfahren.determenistic || //) wahl == Wahlverfahren.roulette) { tmpKinder = tmpKinder.OrderBy(tier => tier.Wert).ToList(); // foreach (var tier in tmpKinder) // { // newEltern.Add(tier); // if (newEltern.Count >= anzahlEltern) // break; // } } //else //{ while (anzahlEltern > newEltern.Count) { addChild(randomizer, newEltern, tmpKinder, wahl); } //} return(newEltern); }