static void Main(string[] args) { List <tOsobnik> listaWyników = new List <tOsobnik>(); List <tOsobnik> najlepsiPopulacji = new List <tOsobnik>(); for (int index = 0; index < liczbaUruchomien; index++) { tOsobnik[] populacja = new tOsobnik[20]; // 20 = zalozony staly rozmiar populacji for (int i = 0; i < populacja.Length; ++i) { do { populacja[i].m_genotyp = (uint)los.Next(int.MinValue, int.MaxValue); } while (CzyWZakresie(populacja[i])); } tOsobnik maxUruchomienia = populacja[0]; int nr_pokolenia = 0; tOsobnik maxPopulacji; while (nr_pokolenia++ < 1000) // 1000 - zalozona liczba pokolen { tOsobnik[] nowa_populacja = new tOsobnik[populacja.Length]; maxPopulacji = nowa_populacja[0]; for (int i = 0; i < nowa_populacja.Length; i++) // nowe pokolenie { tOsobnik dziecko, mama, tata; do { mama = Selekcja(populacja); tata = Selekcja(populacja); dziecko = Rekombinacja(mama, tata); nowa_populacja[i] = dziecko; } while (CzyWZakresie(nowa_populacja[i])); } najlepsiPopulacji.Add(MaxPopulacji(populacja)); populacja = nowa_populacja; } for (int i = 0; i < populacja.Length; i++) { Console.WriteLine("{0} dla {1}", FunkcjaDopasowania(Fenotyp(populacja[i])), Fenotyp(populacja[i])); } listaWyników.Add(MaxPopulacji(najlepsiPopulacji.ToArray())); } Console.WriteLine("Średnia z wszystkich uruchomień: {0}", Średnia(listaWyników.ToArray())); Console.ReadKey(); }
static tOsobnik MaxPopulacji(tOsobnik[] populacja) { tOsobnik maxPopulacji = populacja[0]; foreach (var item in populacja) { if (FunkcjaDopasowania(item.m_fenotyp) > FunkcjaDopasowania(maxPopulacji.m_fenotyp)) { maxPopulacji = item; } } return(maxPopulacji); }
static tOsobnik Selekcja(tOsobnik[] populacji) { tOsobnik k1 = populacji[los.Next(populacji.Length)]; tOsobnik k2 = populacji[los.Next(populacji.Length)]; if (FunkcjaDopasowania(Fenotyp(k1)) > FunkcjaDopasowania(Fenotyp(k2))) { return(k1); } else { return(k2); } }
static tOsobnik Rekombinacja(tOsobnik mama, tOsobnik tata) { uint maska = ~0u << los.Next(1, 32); tOsobnik dziecko; dziecko.m_genotyp = maska & mama.m_genotyp | ~maska & tata.m_genotyp; if (los.NextDouble() < 0.1) // 0.1 - 10% pr. mutacji - zalozenie { maska = 1u << los.Next(32); dziecko.m_genotyp ^= maska; } return(dziecko); }
static double Fenotyp(tOsobnik osobnik) { return(-2 + osobnik.m_genotyp * 1.0 / 1000000000); }
static bool CzyWZakresie(tOsobnik osobnik) { return(osobnik.m_fenotyp > 2.0 || osobnik.m_fenotyp < -2.0); }