Пример #1
0
        public static List <jedinec> turnaj(List <jedinec> jedinci, int kolkoVytvor)
        {
            var  terazVytvoreni = new List <jedinec>();
            var  rodic1         = new jedinec();
            var  rodic2         = new jedinec();
            bool prep           = false;
            var  pocetJedincov  = jedinci.Count;
            var  random         = new Random();
            var  pocetK         = random.Next((pocetJedincov / 20), (pocetJedincov / 10));

            terazVytvoreni.Clear();


            //  tu si zachovam pät najlepsich jedincov z povodnych
            var zachovaj = 5;

            jedinci = jedinci.OrderByDescending(x => x.fitness).ToList();
            for (int i = 0; i < zachovaj; i++)
            {
                terazVytvoreni.Add(jedinci[i]);
            }

            var pomocnyZoznam = new List <jedinec>();

            var pocet = 0;

            while (pocet < kolkoVytvor)
            {
                for (int j = 0; j < 2; j++)
                {
                    pomocnyZoznam.Clear();
                    var pridaj = new jedinec();
                    for (int i = 0; i < pocetK; i++)
                    {
                        pridaj = jedinci[random.Next(0, pocetJedincov)];
                        pomocnyZoznam.Add(pridaj);
                        jedinci.Remove(pridaj);
                        pocetJedincov--;
                    }

                    pomocnyZoznam = pomocnyZoznam.OrderByDescending(x => x.fitness).ToList();
                    if (!prep)
                    {
                        rodic1 = pomocnyZoznam.First();
                        prep   = true;
                    }
                    else
                    {
                        rodic2 = pomocnyZoznam.First();
                        prep   = false;
                    }

                    // vratim zoznam do povodneho stavu
                    jedinci.AddRange(pomocnyZoznam);
                    pocetJedincov = +pocetK;
                }

                var novy = new jedinec();

                novy = novy.krizenie(rodic1, rodic2);
                terazVytvoreni.Add(novy);

                novy = novy.invertujNahodnyBit(rodic1);
                terazVytvoreni.Add(novy);

                novy = novy.invertujPoslednyBit(rodic2);
                terazVytvoreni.Add(novy);

                pocet += 3;
            }

            return(terazVytvoreni);
        }
Пример #2
0
        public static List <jedinec> ruleta(double suma, List <jedinec> jedinci, int kolkoVytvor)
        {
            var  terazVytvoreni = new List <jedinec>();
            var  rodic1         = new jedinec();
            var  rodic2         = new jedinec();
            bool prep           = false;

            terazVytvoreni.Clear();

            // tu si zachovam pät najlepsich jedincov z povodnych
            var zachovaj = 5;

            jedinci = jedinci.OrderByDescending(x => x.fitness).ToList();
            for (int i = 0; i < zachovaj; i++)
            {
                terazVytvoreni.Add(jedinci[i]);
            }


            var pocet = 0;

            while (pocet < kolkoVytvor)
            {
                for (int i = 0; i < 2; i++)
                {
                    var random = new Random();
                    var cislo  = random.NextDouble();

                    double sumaPravdepodobnosti = 0;
                    foreach (var j in jedinci)      // stanovenie velkosti usekov pre kazdeho jedinca
                    {
                        j.pravdepodobnost    = sumaPravdepodobnosti + (j.fitness / suma);
                        sumaPravdepodobnosti = j.pravdepodobnost;
                    }

                    double current = 0;
                    double next    = jedinci[0].pravdepodobnost;
                    for (int k = 0; k < jedinci.Count; k++)
                    {
                        if (cislo > current && cislo < next)
                        {
                            if (!prep)
                            {
                                rodic1 = jedinci[k];
                                jedinci.Remove(rodic1);
                                prep = true;
                            }
                            else
                            {
                                rodic2 = jedinci[k];
                                prep   = false;
                            }
                            break;
                        }
                        if ((k + 1) < jedinci.Count)
                        {
                            current = jedinci[k].pravdepodobnost;
                            next    = jedinci[k + 1].pravdepodobnost;
                        }
                        else
                        {
                            current = jedinci[k].pravdepodobnost;
                            next    = 1;
                        }
                    }
                }

                var novy = new jedinec();

                novy = novy.krizenie(rodic1, rodic2);
                terazVytvoreni.Add(novy);

                novy = novy.invertujNahodnyBit(rodic1);
                terazVytvoreni.Add(novy);

                novy = novy.invertujPoslednyBit(rodic2);
                terazVytvoreni.Add(novy);

                novy = novy.invertujVsetkyBity(rodic1);
                terazVytvoreni.Add(novy);

                jedinci.Add(rodic1);

                pocet += 4;
            }

            return(terazVytvoreni);
        }