static void Main(string[] args) { List <Osobnik> listaWyników = new List <Osobnik>(); List <Osobnik> najlepsiPopulacji = new List <Osobnik>(); for (int index = 0; index < liczbaUruchomien; index++) { Osobnik[] populacja = new Osobnik[20]; // 20 = zalozony staly rozmiar populacji for (int i = 0; i < populacja.Length; ++i) { do { populacja[i] = new Osobnik(); populacja[i].m_genotyp = (uint)los.Next(int.MinValue, int.MaxValue); } while (CzyWZakresie(populacja[i])); } Osobnik maxUruchomienia = populacja[0]; int nr_pokolenia = 0; Osobnik maxPopulacji; while (nr_pokolenia++ < 1000) // 1000 - zalozona liczba pokolen { Osobnik[] nowa_populacja = new Osobnik[populacja.Length]; maxPopulacji = nowa_populacja[0]; for (int i = 0; i < nowa_populacja.Length; i++) // nowe pokolenie { Osobnik 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}", Osobnik.FunkcjaDopasowania(Osobnik.Fenotyp(populacja[i])), Osobnik.Fenotyp(populacja[i])); } listaWyników.Add(MaxPopulacji(najlepsiPopulacji.ToArray())); } Console.WriteLine("Średnia z wszystkich uruchomień: {0}", Średnia(listaWyników.ToArray())); Console.ReadKey(); }
static double Średnia(Osobnik[] wartosci) { double suma = 0.0; foreach (var item in wartosci) { suma += Osobnik.FunkcjaDopasowania(item.m_fenotyp); } return(suma / wartosci.Length); }
static Osobnik MaxPopulacji(Osobnik[] populacja) { Osobnik maxPopulacji = populacja[0]; foreach (var item in populacja) { if (Osobnik.FunkcjaDopasowania(item.m_fenotyp) > Osobnik.FunkcjaDopasowania(maxPopulacji.m_fenotyp)) { maxPopulacji = item; } } return(maxPopulacji); }
// tworzenie nowego osobnika poprzez krzyżowanie dwóch innych (punkt krzyżowania ten sam co w +) tylko odwrotnie niż w + public static Osobnik operator -(Osobnik o1, Osobnik o2) { Osobnik pom = new Osobnik(); for (int i = 0; i < podz; i++) { pom.Chromosom[i] = o2.Chromosom[i]; } for (int i = podz; i < 10; i++) { pom.Chromosom[i] = o1.Chromosom[i]; } return(pom); }
static Osobnik Rekombinacja(Osobnik mama, Osobnik tata) { uint maska = ~0u << los.Next(1, 32); Osobnik dziecko = new Osobnik(); 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 Osobnik Selekcja(Osobnik[] populacji) { Osobnik k1 = populacji[los.Next(populacji.Length)]; Osobnik k2 = populacji[los.Next(populacji.Length)]; if (Osobnik.FunkcjaDopasowania(Osobnik.Fenotyp(k1)) > Osobnik.FunkcjaDopasowania(Osobnik.Fenotyp(k2))) { return(k1); } else { return(k2); } }
static void Main(string[] args) { // pierwszy osobnik Console.WriteLine("______________*______________*______________*______________*______________*______________*______________"); Console.WriteLine(); Osobnik Jeden = new Osobnik(-1, 1, 3); Jeden.Policz(); Console.WriteLine("Dlugosc lancucha binarnego Pierwszego osobnika to: {0} ", Jeden.dlugosclancucha); Console.WriteLine("Podaj ilosc lancuchow binarnych Pierwszego osobnika: "); Jeden.ilosclancuchow = int.Parse(Console.ReadLine()); Console.WriteLine(); Console.WriteLine(); List <double> WieleLancuchowJeden = new List <double>(); for (int i = 1; i <= Jeden.ilosclancuchow; i++) { Jeden.generujLancuchBinarny(Jeden.dlugosclancucha); Console.WriteLine("Lancuch binarny nr {0} dla Pierwszego osobnika to: {1}", i, Jeden.lancuchBinarny); Jeden.zamienNaWartoscDziesietna(Jeden.lancuchBinarny); WieleLancuchowJeden.Add(Jeden.wartoscX); Console.WriteLine("Wartosc dziesietna lancucha binarnego nr {0} dla Pierwszego osobnika to: {1}", i, WieleLancuchowJeden[i - 1]); Console.WriteLine(); } Jeden.WieleLancuchow = WieleLancuchowJeden; List <double> WielePunktowJeden = new List <double>(); for (int i = 1; i <= Jeden.ilosclancuchow; i++) { Jeden.przesuniecieDoPrzedzialu(Jeden.WieleLancuchow[i - 1], Jeden.dlugosclancucha); WielePunktowJeden.Add(Jeden.punkt); Jeden.punkt = 0; Console.WriteLine("Wartosc punktu dla lancucha binarnego nr {0} Pierwszego osobnika to: {1}", i, WielePunktowJeden[i - 1]); Console.WriteLine(); } Jeden.WielePunktowX = WielePunktowJeden; Jeden.algorytm(Jeden.WielePunktowX, Jeden.ilosclancuchow); Console.WriteLine("Wartosc funkcji dla podanych lancuchow binarnych Pierwszego osobnika to: {0}", Jeden.wynikAlgorytmu); // drugi osobnik Console.WriteLine("______________*______________*______________*______________*______________*______________*______________"); Console.WriteLine(); Osobnik Dwa = new Osobnik(-1, 1, 3); Dwa.Policz(); Console.WriteLine("Dlugosc lancucha binarnego Drugiego oosobnika to: {0} ", Dwa.dlugosclancucha); Console.WriteLine("Podaj ilosc lancuchow binarnych dla Drugiego osobnika: "); Dwa.ilosclancuchow = int.Parse(Console.ReadLine()); List <double> WieleLancuchowDwa = new List <double>(); for (int i = 1; i <= Dwa.ilosclancuchow; i++) { Dwa.generujLancuchBinarny(Dwa.dlugosclancucha); Console.WriteLine("Lancuch binarny nr {0} dla Drugiego oosobnika to: {1}", i, Dwa.lancuchBinarny); Dwa.zamienNaWartoscDziesietna(Dwa.lancuchBinarny); WieleLancuchowDwa.Add(Dwa.wartoscX); Console.WriteLine("Wartosc dziesietna lancucha binarnego nr {0} dla Drugiego osobnika to: {1}", i, WieleLancuchowDwa[i - 1]); Console.WriteLine(); } Dwa.WieleLancuchow = WieleLancuchowDwa; List <double> WielePunktowDwa = new List <double>(); for (int i = 1; i <= Dwa.ilosclancuchow; i++) { Dwa.przesuniecieDoPrzedzialu(Dwa.WieleLancuchow[i - 1], Dwa.dlugosclancucha); WielePunktowDwa.Add(Dwa.punkt); Dwa.punkt = 0; Console.WriteLine("Wartosc punktu dla lancucha binarnego nr {0} Drugiego osobnika to: {1}", i, WielePunktowDwa[i - 1]); Console.WriteLine(); } Dwa.WielePunktowX = WielePunktowDwa; Dwa.algorytm(Dwa.WielePunktowX, Dwa.ilosclancuchow); Console.WriteLine("Wartosc funkcji dla podanych lancuchow binarnych Drugiego osobnika to: {0}", Dwa.wynikAlgorytmu); // trzeci osobnik Console.WriteLine("______________*______________*______________*______________*______________*______________*______________"); Console.WriteLine(); Osobnik Trzy = new Osobnik(-1, 1, 3); Trzy.Policz(); Console.WriteLine("Dlugosc lancucha binarnego Trzeciego osobnika to: {0} ", Trzy.dlugosclancucha); Console.WriteLine("Podaj ilosc lancuchow binarnych: "); Trzy.ilosclancuchow = int.Parse(Console.ReadLine()); List <double> WieleLancuchowTrzy = new List <double>(); for (int i = 1; i <= Trzy.ilosclancuchow; i++) { Trzy.generujLancuchBinarny(Trzy.dlugosclancucha); Console.WriteLine("Lancuch binarny nr {0} dla Trzeciego osobnika to: {1}", i, Trzy.lancuchBinarny); Trzy.zamienNaWartoscDziesietna(Trzy.lancuchBinarny); WieleLancuchowTrzy.Add(Trzy.wartoscX); Console.WriteLine("Wartosc dziesietna lancucha binarnego nr {0} dla Trzeciego osobnika to: {1}", i, WieleLancuchowTrzy[i - 1]); Console.WriteLine(); } Trzy.WieleLancuchow = WieleLancuchowTrzy; List <double> WielePunktowTrzy = new List <double>(); for (int i = 1; i <= Trzy.ilosclancuchow; i++) { Trzy.przesuniecieDoPrzedzialu(Trzy.WieleLancuchow[i - 1], Trzy.dlugosclancucha); WielePunktowTrzy.Add(Trzy.punkt); Trzy.punkt = 0; Console.WriteLine("Wartosc punktu dla lancucha binarnego nr {0} Trzeciego osobnika to: {1}", i, WielePunktowTrzy[i - 1]); Console.WriteLine(); } Trzy.WielePunktowX = WielePunktowTrzy; Trzy.algorytm(Trzy.WielePunktowX, Trzy.ilosclancuchow); Console.WriteLine("Wartosc funkcji dla podanych lancuchow binarnych Trzeciego osobnika to: {0}", Trzy.wynikAlgorytmu); Console.WriteLine("______________*______________*______________*______________*______________*______________*______________"); Console.WriteLine(); Populacja populacjaPierwsza = new Populacja(); populacjaPierwsza.OsobnikiZPopulacji.Add(Jeden.wynikAlgorytmu); populacjaPierwsza.OsobnikiZPopulacji.Add(Dwa.wynikAlgorytmu); populacjaPierwsza.OsobnikiZPopulacji.Add(Trzy.wynikAlgorytmu); int iloscOsobnikow = 3; for (int i = 0; i < iloscOsobnikow; i++) { Console.WriteLine("Osobnik {0} ma wartosc funkcji wynoszaca {1}.", i + 1, populacjaPierwsza.OsobnikiZPopulacji[i]); Console.WriteLine(); } Console.ReadKey(); }
static bool CzyWZakresie(Osobnik osobnik) { return(osobnik.m_fenotyp > 2.0 || osobnik.m_fenotyp < -2.0); }