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