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