static void Main(string[] args) { int nrPokolenia = 0; LiczbyBazowe liczbyBazowe = new LiczbyBazowe(); liczbyBazowe.LosujBaze(); Populacja populacja = new Populacja(); populacja.LosujPopulacje(); //wylosowanie populacji rodzicielskiej populacja.ObliczFenotypy(); populacja.ObliczDostosowanie(); Console.WriteLine("Nr pokolenia Srednia wartosc funkcji dostosowania"); Console.Write("{0, 3} ", nrPokolenia); populacja.PokazDostosowanieSrednie(); while (nrPokolenia < Parametry.lp) { nrPokolenia++; populacja.Turniej(3); populacja.KrzyzowanieNieLosowe(); populacja.Mutacje(); populacja.ObliczFenotypy(); populacja.ObliczDostosowanie(); Console.Write("{0, 3} ", nrPokolenia); populacja.PokazDostosowanieSrednie(); } populacja.PokazChromosomyPopulacji(); populacja.PokazFenotypyPopulacji(); populacja.PokazDostosowaniePopulacji(); Console.ReadKey(); }
public void Mutacje() { //metoda losuje chromosomy do mutacji //i mutuje losowe geny w wylosowanych chromosomach Random Generator = new Random(LiczbyBazowe.PobierzBazowa()); //tworzy generator liczb losowych oparty o kolejną //liczbę bazową double[] losowe = new double[Parametry.pula]; for (int i = 0; i < Parametry.pula; i++) { losowe[i] = Generator.Next(100) / 100.0; } //proces krzyżowania genów w parach int miejsceMutacji; for (int i = 0; i < Parametry.pula; i++) { if (losowe[i] < Parametry.pm) { miejsceMutacji = Generator.Next(Parametry.N); if (populacja[i, miejsceMutacji] == 0) { populacja[i, miejsceMutacji] = 1; } else { populacja[i, miejsceMutacji] = 0; } } } }
public void Ruletka() { //selekcja chromosomów w populacji metodą koła ruletki Byte[,] nowePokolenie = new Byte[Parametry.pula, Parametry.N]; //tablica pomocnicza chromosomów dla ruletki double[] tablicaNI = new double[Parametry.pula]; //tablica pomocnicza ruletki double sumaDostosowanie = 0; foreach (double dostosowanie in tablicaDostosowanie) { sumaDostosowanie += dostosowanie; } for (int i = 0; i < Parametry.pula; i++) { tablicaNI[i] = tablicaDostosowanie[i] / sumaDostosowanie * power; } int[] losowe = new int[Parametry.pula]; //tabela 'losowe' przechowuje liczby losowe z przedziału 0...Power() Random Generator = new Random(LiczbyBazowe.PobierzBazowa()); for (int i = 0; i < Parametry.pula; i++) { losowe[i] = Generator.Next(power); } double[] ruletka = new double[Parametry.pula]; //tablica pozycji wycinków ruletki double pozycja = 0; for (int i = 0; i < Parametry.pula; i++) { pozycja += tablicaNI[i]; ruletka[i] = pozycja; } for (int i = 0; i < Parametry.pula; i++) { int j = 0; while (losowe[i] > ruletka[j]) { j++; } for (int k = 0; k < Parametry.N; k++) { nowePokolenie[i, k] = populacja[j, k]; } } populacja = nowePokolenie; }
//tablica wartości funkcji dostosowania dla populacji chromosomw public void LosujPopulacje() { //metoda losuje nową populację chromosomów //i umieszcza je w lokalnej tablicy 'populacja' for (int pozycja = 0; pozycja < Parametry.pula; pozycja++) { Random Generator = new Random(LiczbyBazowe.PobierzBazowa()); for (int j = 0; j < Parametry.N; j++) { populacja[pozycja, j] = (Byte)Generator.Next(2); } } }
void Krzyzowanie() { Random Generator = new Random(LiczbyBazowe.PobierzBazowa()); //tworzy generator liczb losowych oparty o kolejną //liczbę bazową //losowanie par osobników do krzyżowania int liczbaPar = Parametry.pula / 2; int[] losowePary = new int[liczbaPar]; for (int i = 0; i < liczbaPar; i++) { losowePary[i] = Generator.Next(100); } //losowanie miejsc krzyżowania dla par int[] losoweMiejsca = new int[liczbaPar]; for (int i = 0; i < liczbaPar; i++) { losoweMiejsca[i] = Generator.Next(Parametry.N - 2); } //proces krzyżowania genów w parach int pierwszy = 0; //indeks pierwszego osobnika w każdej parze byte bufor; for (int para = 0; para < liczbaPar; para++) { if (losowePary[para] < Parametry.pk * 100) { for (int i = losoweMiejsca[para]; i < Parametry.N; i++) { bufor = populacja[pierwszy, i]; populacja[pierwszy, i] = populacja[pierwszy + 1, i]; populacja[pierwszy + 1, i] = bufor; } } pierwszy += 2; } }