/* selekcja turniejowa */ private List <Osobnik> Turniej(int rozmiarTurnieju, List <Osobnik> populacja) { List <Osobnik> turniej = new List <Osobnik>(), populacjaRodzicielska = new List <Osobnik>(); if (populacja.Count > rozmiarTurnieju) { while (populacja.Count > 0 && populacjaRodzicielska.Count < MaksymalnyRozmiarPopulacji) { for (int i = 0; i < rozmiarTurnieju; i++) { if (populacja.Count == 0) { break; } int k = rand.Next(Populacja.Count); Osobnik osobnik = Populacja[k]; turniej.Add(osobnik); populacja.RemoveAt(k); } populacjaRodzicielska.Add(turniej.Max()); turniej.Clear(); } return(populacjaRodzicielska); } else { return(populacja); } }
/* jeden przebieg iteracji algorytmu genetycznego */ public void Iteracja() { NumerIteracji++; List <Osobnik> nowaPopulacja = new List <Osobnik>(), populacjaRodzicielska; Osobnik nowyOsobnik; populacjaRodzicielska = Turniej(RozmiarTurnieju, Populacja); // wyselekcjonowanie populacji rodzicielskiej metodą turniejową while (nowaPopulacja.Count == 0) { for (int i = 0; i < populacjaRodzicielska.Count; i++) { if (Los(PrawdopodobienstwoKrzyzowania)) { for (int j = 0; j < populacjaRodzicielska.Count; j++) { if (i != j) { Osobnik[] noweOsobniki = Krzyzowanie(populacjaRodzicielska[i], populacjaRodzicielska[j]); nowaPopulacja.Add(noweOsobniki[0]); nowaPopulacja.Add(noweOsobniki[1]); } if (nowaPopulacja.Count >= MaksymalnyRozmiarPopulacji - 1) { break; } } } if (nowaPopulacja.Count >= MaksymalnyRozmiarPopulacji - 1) { break; } if (Los(PrawdopodobienstwoMutacji)) { nowyOsobnik = Mutacja(populacjaRodzicielska[i]); nowaPopulacja.Add(nowyOsobnik); } } } for (int i = 0; i < Elitaryzm; i++) { Osobnik osobnik = populacjaRodzicielska.Max(); nowaPopulacja.Add(osobnik); // przeniesienie najlepszego osobnika z populacji rodzicielskiej do nowej populacji populacjaRodzicielska.Remove(osobnik); } foreach (Osobnik osobnik in nowaPopulacja) { if (osobnik != null) { osobnik.WyliczPrzystosowanie(); } } Populacja = nowaPopulacja; }
private Osobnik Mutacja(Osobnik osobnik) { Osobnik nowyOsobnik = new Osobnik(); int n = DaneWejsciowe.Instancja.LiczbaRund, k = DaneWejsciowe.Instancja.LiczbaAutomatow; for (int i = 0; i < n; i++) { if (Los(PrawdopodobienstwoMutacji)) // zmutowanie danego genu nastąpi z prawdopodobieństwem 50% { nowyOsobnik.Chromosom[i] = DaneWejsciowe.Instancja.Automaty[rand.Next(k)]; // gen zostaje podmieniony na wylosowany } else { nowyOsobnik.Chromosom[i] = osobnik.Chromosom[i]; } } return(nowyOsobnik); }
/* sprawdza czy dany osobnik istnieje już w populacji */ private bool CzyIstnieje(Osobnik osobnik, List <Osobnik> populacja) { int n = DaneWejsciowe.Instancja.LiczbaRund; foreach (Osobnik osobnik2 in Populacja) { int i; for (i = 0; i < n; i++) { if (osobnik.Chromosom[i].ID != osobnik2.Chromosom[i].ID) { break; } } if (i == n) { return(true); } } return(false); }
/* krzyżowanie jednostajne */ private Osobnik[] Krzyzowanie(Osobnik osobnik1, Osobnik osobnik2) { Osobnik[] noweOsobniki = new Osobnik[2]; noweOsobniki[0] = new Osobnik(); noweOsobniki[1] = new Osobnik(); int n = DaneWejsciowe.Instancja.LiczbaRund; for (int i = 0; i < n; i++) { if (Los(50)) // wymiana genu nastąpi z prawdopodobieństwem 50% { noweOsobniki[0].Chromosom[i] = osobnik1.Chromosom[i]; noweOsobniki[1].Chromosom[i] = osobnik2.Chromosom[i]; } else { noweOsobniki[0].Chromosom[i] = osobnik2.Chromosom[i]; noweOsobniki[1].Chromosom[i] = osobnik1.Chromosom[i]; } } return(noweOsobniki); }
public void GenerujPopulacjePoczatkowa() { int n = DaneWejsciowe.Instancja.LiczbaAutomatow, m = DaneWejsciowe.Instancja.LiczbaRund, k; n = n ^ m; if (n < RozmiarPopulacjiPoczatkowej) { k = n; } else { k = RozmiarPopulacjiPoczatkowej; } for (int i = 0; i < k; i++) { Osobnik osobnik = new Osobnik(); do { osobnik.LosujChromosom(); /* losuje populację początkową */ }while (CzyIstnieje(osobnik, Populacja)); Populacja.Add(osobnik); } }