public void wylosujPotencjalnychRodzicow() { Selekcja Selekcja = new Selekcja(populacja); Selekcja.obliczWartoscPopulacji(); Selekcja.obliczPrawdopodobienstwo(); Selekcja.setDystrybuantyDlaOsobnikow(); // tu można wybrać interesującą nas selekcje: //List<Osobnik> WylosowaniOsobnicySukcesji = Selekcja.obracanieRulatki(); List <Osobnik> WylosowaniOsobnicySukcesji = Selekcja.wyborOsobnikowMetodaRankingowaMalejaco(); //List<Osobnik> WylosowaniOsobnicySukcesji = Selekcja.wyborOsobnikowMetodaRankingowaRosnaco(); //List<Osobnik> WylosowaniOsobnicySukcesji = Selekcja.ZwracajacaWyborOsobnikowMetodaTurniejowaMalejaco(2); //w nawiasie ilość osób w grupie //List<Osobnik> WylosowaniOsobnicySukcesji = Selekcja.ZwracajacaWyborOsobnikowMetodaTurniejowaRosnaco(2); //List<Osobnik> WylosowaniOsobnicySukcesji = Selekcja.wyborOsobnikowMetodaTurniejowaMalejaco(2); //List<Osobnik> WylosowaniOsobnicySukcesji = Selekcja.wyborOsobnikowMetodaTurniejowaRosnaco(2); List <Osobnik> potencjalniRodzice = new List <Osobnik>(); for (int i = 0; i < WylosowaniOsobnicySukcesji.Count; i++) { string imie = "Potencjalny rodzic " + i; Osobnik potencjalnyRodzic = new Osobnik(imie, WylosowaniOsobnicySukcesji[i]); potencjalnyRodzic.SetIndex(i); potencjalniRodzice.Add(potencjalnyRodzic); } Populacja PopulacjaPotencjalnychRodzicow = new Populacja(); PopulacjaPotencjalnychRodzicow.SetListaOsobnikowNowaPopulacja(WylosowaniOsobnicySukcesji.Count, potencjalniRodzice, populacja.poczatkiLista, populacja.konceLista, populacja.precyzjaLista); this.PopulacjaPotencjalnychRodzicow = PopulacjaPotencjalnychRodzicow; }
public void krzyzujOsobnikow() { Selekcja Krzyzowanie = new Selekcja(PopulacjaPotencjalnychRodzicow); Krzyzowanie.wyborOsobnikowDoKrzyzowania(); List <Osobnik> przyszliRodzice = new List <Osobnik>(); for (int i = 0; i < Krzyzowanie.osobnicyDoSparowania.Count; i++) { string imie = "Rodzic " + i; Osobnik Rodzic = new Osobnik(imie, Krzyzowanie.osobnicyDoSparowania[i]); Rodzic.SetIndex(i); przyszliRodzice.Add(Rodzic); } Populacja PopulacjaRodzicow = new Populacja(); PopulacjaRodzicow = PopulacjaPotencjalnychRodzicow; PopulacjaRodzicow.SetListaOsobnikow(przyszliRodzice); Selekcja Parowanie = new Selekcja(PopulacjaRodzicow); Parowanie.SetOsobnicyDoSparowania(przyszliRodzice); List <Osobnik> PotomkowieKrzyzowania = new List <Osobnik>(); for (int i = 0; i < (Krzyzowanie.osobnicyDoSparowania.Count / 2); i++) { Parowanie.stworzPare(); // tu można wybrać interesujący nas rodzaj krzyżowania: //PopulacjaRodzicow.krzyzowanieJednopunktowe(Parowanie.para[0].calyLancuchBinarny, Parowanie.para[1].calyLancuchBinarny); //PopulacjaRodzicow.krzyzowanieDwupunktowe(Parowanie.para[0].calyLancuchBinarny, Parowanie.para[1].calyLancuchBinarny); //PopulacjaRodzicow.krzyzowanieWielopunktowe(Parowanie.para[0].calyLancuchBinarny, Parowanie.para[1].calyLancuchBinarny); PopulacjaRodzicow.krzyzowanieRownomierne(Parowanie.para[0].calyLancuchBinarny, Parowanie.para[1].calyLancuchBinarny); for (int j = 0; j < PopulacjaRodzicow.listaPotomkow.Count; j++) { PotomkowieKrzyzowania.Add(PopulacjaRodzicow.listaPotomkow[j]); } } List <Osobnik> Potomkowie = new List <Osobnik>(); for (int i = 0; i < PotomkowieKrzyzowania.Count; i++) { string imie = "Potomek " + i; Osobnik Potomek = new Osobnik(imie, PotomkowieKrzyzowania[i]); Potomek.SetIndex(i); Potomkowie.Add(Potomek); } Populacja PotomkowiePoKrzyzowaniu = PopulacjaRodzicow; PotomkowiePoKrzyzowaniu.SetListaOsobnikow(Potomkowie); this.PotomkowiePoKrzyzowaniu = PotomkowiePoKrzyzowaniu; }
public void wybierzNastepnePokolenie() { List <Osobnik> nowePokolenie = new List <Osobnik>(); for (int i = 0; i < populacja.listaOsobnikow.Count; i++) { string imie = "Krolik " + i; Osobnik Potomek = new Osobnik(imie, WszyscyOsobnicy[i]); Potomek.SetIndex(i); nowePokolenie.Add(Potomek); } List <Osobnik> Potomkowie = new List <Osobnik>(); for (int i = 0; i < nowePokolenie.Count; i++) { string imie = "Krolik " + i; Osobnik Potomek = new Osobnik(imie, nowePokolenie[i]); Potomek.SetIndex(i); Potomkowie.Add(Potomek); } Populacja NowePokolenie = populacja; NowePokolenie.SetListaOsobnikow(Potomkowie); this.populacja = NowePokolenie; }
public void wybierzNastepnePokolenie() { List <Osobnik> nowePokolenie = new List <Osobnik>(); var rng = new Random(Guid.NewGuid().GetHashCode()); for (int i = 0; i < populacja.listaOsobnikow.Count; i++) { int index = rng.Next(0, (WszyscyOsobnicy.Count - 1)); string imie = "Krolik " + i; Osobnik Potomek = new Osobnik(imie, WszyscyOsobnicy[index]); Potomek.SetIndex(i); nowePokolenie.Add(Potomek); } List <Osobnik> Potomkowie = new List <Osobnik>(); for (int i = 0; i < nowePokolenie.Count; i++) { string imie = "Krolik " + i; Osobnik Potomek = new Osobnik(imie, nowePokolenie[i]); Potomek.SetIndex(i); Potomkowie.Add(Potomek); } Populacja NowePokolenie = populacja; NowePokolenie.SetListaOsobnikow(Potomkowie); this.populacja = NowePokolenie; }
// KRZYŻOWANIE: // KRZYŻOWANIE JEDNOPUNKTOWE: public void krzyzowanieJednopunktowe(string lancuchPierwszegoRodzica, string lancuchDrugiegoRodzica) { string lancuchPierwszegoPotomka = string.Empty; char[] lancuchPierwszegoRodzicaJakoChar = lancuchPierwszegoRodzica.ToCharArray(); string lancuchDrugiegoPotomka = string.Empty; char[] lancuchDrugiegoRodzicaJakoChar = lancuchDrugiegoRodzica.ToCharArray(); List <string> listaLancuchow = new List <string>(); List <Osobnik> listaPotomkow = new List <Osobnik>(); var rng = new Random(Guid.NewGuid().GetHashCode()); int r; int m = (int)listaOsobnikow[0].dlugoscCalegoLancucha - 1; r = rng.Next(1, m); //Console.WriteLine(); //Console.WriteLine("Punkt krzyzowania to: " + r); for (int i = 0; i <= r; i++) { lancuchPierwszegoPotomka += string.Concat(lancuchPierwszegoRodzicaJakoChar[i]); lancuchDrugiegoPotomka += string.Concat(lancuchDrugiegoRodzicaJakoChar[i]); } for (int i = r + 1; i <= m; i++) { lancuchPierwszegoPotomka += string.Concat(lancuchDrugiegoRodzicaJakoChar[i]); lancuchDrugiegoPotomka += string.Concat(lancuchPierwszegoRodzicaJakoChar[i]); } listaLancuchow.Add(lancuchPierwszegoPotomka); listaLancuchow.Add(lancuchDrugiegoPotomka); for (int i = 0; i < listaLancuchow.Count; i++) { string imie = "Potomek krolika " + i + "" + i; Osobnik Potomek = new Osobnik(imie); for (int j = 0; j < this.poczatkiLista.Count; j++) { PunktGenetyczny Punkt = new PunktGenetyczny(this.poczatkiLista[j], this.konceLista[j], this.precyzjaLista[j]); Punkt.Policz(); Punkt.generujLancuchBinarny(Punkt.dlugosclancucha); Punkt.przesuniecieDoPrzedzialu(); Potomek.punktyGenetyczne.Add(Punkt); } Potomek.przydzielNowyLancuchBinarny(listaLancuchow[i]); Potomek.SetWartoscOsobnika(); Potomek.SetScalLancuchBinarny(); Potomek.policzDlugoscCalegoLancucha(); listaPotomkow.Add(Potomek); } this.listaPotomkow = listaPotomkow; }
public Osobnik(Osobnik osobnikDoZduplikowania) { this.imie = osobnikDoZduplikowania.imie; this.punktyGenetyczne = osobnikDoZduplikowania.punktyGenetyczne; this.wartoscOsobnika = osobnikDoZduplikowania.wartoscOsobnika; this.prawdopodobienstwo = osobnikDoZduplikowania.prawdopodobienstwo; this.dystrybuanta = osobnikDoZduplikowania.dystrybuanta; this.calyLancuchBinarny = osobnikDoZduplikowania.calyLancuchBinarny; this.dlugoscCalegoLancucha = osobnikDoZduplikowania.dlugoscCalegoLancucha; }
public void SetListaOsobnikow(List <Osobnik> listaOsobnikow) { List <Osobnik> listaDoZastapienia = new List <Osobnik>(); for (int i = 0; i < listaOsobnikow.Count; i++) { string imie = "Kroliczek " + i; Osobnik Kroliczek = new Osobnik(imie, listaOsobnikow[i]); listaDoZastapienia.Add(Kroliczek); } this.listaOsobnikow = listaDoZastapienia; }
public void wybierzNastepnePokolenie() { List <Osobnik> nowePokolenie = WszyscyOsobnicy; nowePokolenie = usunPodobnychOsobnikow(nowePokolenie); var rng = new Random(Guid.NewGuid().GetHashCode()); while (nowePokolenie.Count < populacja.listaOsobnikow.Count) { for (int i = 0; i < (populacja.listaOsobnikow.Count - nowePokolenie.Count); i++) { int index = rng.Next(0, (nowePokolenie.Count - 1)); string imie = "Krolik " + i; Osobnik Potomek = new Osobnik(imie, nowePokolenie[index]); Potomek.SetIndex(i); nowePokolenie.Add(Potomek); } nowePokolenie = usunPodobnychOsobnikow(nowePokolenie); } if (nowePokolenie.Count > populacja.listaOsobnikow.Count) { List <Osobnik> nowePokoleniePoOdjeciuNadmiaru = new List <Osobnik>(); for (int i = 0; i < populacja.listaOsobnikow.Count; i++) { nowePokoleniePoOdjeciuNadmiaru.Add(nowePokolenie[i]); } nowePokolenie = nowePokoleniePoOdjeciuNadmiaru; } List <Osobnik> Potomkowie = new List <Osobnik>(); for (int i = 0; i < nowePokolenie.Count; i++) { string imie = "Krolik " + i; Osobnik Potomek = new Osobnik(imie, nowePokolenie[i]); Potomek.SetIndex(i); Potomkowie.Add(Potomek); } Populacja NowePokolenie = populacja; NowePokolenie.SetListaOsobnikow(Potomkowie); this.populacja = NowePokolenie; }
public void SetListaOsobnikowNowaPopulacja(int ileOsobnikow, List <Osobnik> listaOsobnikow, List <double> listaPoczatkow, List <double> listaKoncow, List <double> listaPrecyzji) { List <Osobnik> listaDoZastapienia = new List <Osobnik>(); this.poczatkiLista = listaPoczatkow; this.konceLista = listaKoncow; this.precyzjaLista = listaPrecyzji; for (int i = 0; i < ileOsobnikow; i++) { string imie = "Kroliczek " + i; Osobnik Kroliczek = new Osobnik(imie, listaOsobnikow[i]); listaDoZastapienia.Add(Kroliczek); } this.listaOsobnikow = listaDoZastapienia; }
public override bool Equals(object obj) { if (obj is Osobnik) { Osobnik tmp = obj as Osobnik; if (this.calyLancuchBinarny.Equals(tmp.calyLancuchBinarny)) { return(true); } else { return(false); } } else { return(false); } }
public void generujPopulacje(int iloscOsobnikow) { for (int i = 0; i < iloscOsobnikow; i++) { string imie = "Krolik " + i; Osobnik Krolik = new Osobnik(imie); for (int j = 0; j < this.poczatkiLista.Count; j++) { PunktGenetyczny Punkt = new PunktGenetyczny(this.poczatkiLista[j], this.konceLista[j], this.precyzjaLista[j]); Punkt.Policz(); Punkt.generujLancuchBinarny(Punkt.dlugosclancucha); Punkt.przesuniecieDoPrzedzialu(); Krolik.punktyGenetyczne.Add(Punkt); } Krolik.scalLancuchBinarny(); Krolik.policzDlugoscCalegoLancucha(); Krolik.algorytm(); Krolik.SetIndex(i); listaOsobnikow.Add(Krolik); } }
public List <Osobnik> wyrzucanieOsobnika(Osobnik doWyrzucenia, List <Osobnik> pozostaliOsobnicy) { var nowaLista = pozostaliOsobnicy.Select(x => x).Where(x => x.wartoscOsobnika != doWyrzucenia.wartoscOsobnika).Select(x => x).ToList <Osobnik>(); return(nowaLista); }
public void wybierzNastepnePokolenie() { List <Osobnik> nowePokolenie = new List <Osobnik>(); List <Osobnik> WszyscyOsobnicyBezTychZPierwotnejPopulacji = WszyscyNowiOsobnicy; Osobnik doWyrzucenia; Osobnik Wybraniec; for (int i = 0; i < populacja.listaOsobnikow.Count; i++) { Wybraniec = populacja.listaOsobnikow[i]; for (int j = 0; j < WszyscyOsobnicyBezTychZPierwotnejPopulacji.Count; j++) { doWyrzucenia = WszyscyOsobnicyBezTychZPierwotnejPopulacji[j]; if (Wybraniec.Equals(doWyrzucenia)) { WszyscyOsobnicyBezTychZPierwotnejPopulacji = wyrzucanieOsobnika(doWyrzucenia, WszyscyOsobnicyBezTychZPierwotnejPopulacji); } } } // tu można wybrać rodzaj sortowania osobników: //WszyscyOsobnicyBezTychZPierwotnejPopulacji = posortujOsobnikowRosnaco(WszyscyOsobnicyBezTychZPierwotnejPopulacji); WszyscyOsobnicyBezTychZPierwotnejPopulacji = posortujOsobnikowMalejaco(WszyscyOsobnicyBezTychZPierwotnejPopulacji); var rng = new Random(Guid.NewGuid().GetHashCode()); int iloscOsobnikowZNastepnejPopulacji = rng.Next(0, (populacja.listaOsobnikow.Count - 1)); int iloscOsobnikowZPierwotnejPopulacji = populacja.listaOsobnikow.Count - iloscOsobnikowZNastepnejPopulacji; int index = 0; for (int i = 0; i < iloscOsobnikowZPierwotnejPopulacji; i++) { string imie = "Krolik " + i; Osobnik Potomek = new Osobnik(imie, populacja.listaOsobnikow[i]); Potomek.SetIndex(i); nowePokolenie.Add(Potomek); } for (int i = 0; i < iloscOsobnikowZNastepnejPopulacji; i++) { index = rng.Next(0, (WszyscyOsobnicyBezTychZPierwotnejPopulacji.Count - 1)); string imie = "Krolik " + i; Osobnik Potomek = new Osobnik(imie, WszyscyOsobnicyBezTychZPierwotnejPopulacji[index]); Potomek.SetIndex(i); nowePokolenie.Add(Potomek); } List <Osobnik> Potomkowie = new List <Osobnik>(); for (int i = 0; i < nowePokolenie.Count; i++) { string imie = "Krolik " + i; Osobnik Potomek = new Osobnik(imie, nowePokolenie[i]); Potomek.SetIndex(i); Potomkowie.Add(Potomek); } Populacja NowePokolenie = new Populacja(); NowePokolenie.SetListaOsobnikowNowaPopulacja(populacja.listaOsobnikow.Count, Potomkowie, populacja.poczatkiLista, populacja.konceLista, populacja.precyzjaLista); this.populacja = NowePokolenie; }
// METODA TURNIEJOWA: public List <Osobnik> wyrzucanieOsobnika(Osobnik zwrocony, List <Osobnik> pozostaliOsobnicy) { var nowaLista = pozostaliOsobnicy.Where(x => x.id != zwrocony.id).Select(x => x).ToList <Osobnik>(); return(nowaLista); }
// KRZYŻOWANIE RÓWNOMIERNE: public void krzyzowanieRownomierne(string lancuchPierwszegoRodzica, string lancuchDrugiegoRodzica) { string lancuchPierwszegoPotomka = string.Empty; char[] lancuchPierwszegoRodzicaJakoChar = lancuchPierwszegoRodzica.ToCharArray(); string lancuchDrugiegoPotomka = string.Empty; char[] lancuchDrugiegoRodzicaJakoChar = lancuchDrugiegoRodzica.ToCharArray(); List <string> listaLancuchow = new List <string>(); List <Osobnik> listaPotomkow = new List <Osobnik>(); var rng = new Random(Guid.NewGuid().GetHashCode()); int indexWzorca; int m = (int)listaOsobnikow[0].dlugoscCalegoLancucha - 1; indexWzorca = rng.Next(0, listaOsobnikow.Count); Osobnik Wzorzec = listaOsobnikow[indexWzorca]; //Console.WriteLine("Lancuch osobnika bedacego wzorcem: " + Wzorzec.calyLancuchBinarny); //Console.WriteLine(); char[] lancuchWzorcowy = Wzorzec.calyLancuchBinarny.ToCharArray(); for (int i = 0; i <= m; i++) { if (lancuchWzorcowy[i] == '0') { lancuchPierwszegoPotomka += string.Concat(lancuchPierwszegoRodzicaJakoChar[i]); } else if (lancuchWzorcowy[i] == '1') { lancuchPierwszegoPotomka += string.Concat(lancuchDrugiegoRodzicaJakoChar[i]); } } listaLancuchow.Add(lancuchPierwszegoPotomka); for (int i = 0; i <= m; i++) { if (lancuchWzorcowy[i] == '1') { lancuchDrugiegoPotomka += string.Concat(lancuchPierwszegoRodzicaJakoChar[i]); } else if (lancuchWzorcowy[i] == '0') { lancuchDrugiegoPotomka += string.Concat(lancuchDrugiegoRodzicaJakoChar[i]); } } listaLancuchow.Add(lancuchDrugiegoPotomka); for (int i = 0; i < listaLancuchow.Count; i++) { string imie = "Potomek krolika " + i + "" + i; Osobnik Potomek = new Osobnik(imie); for (int j = 0; j < this.poczatkiLista.Count; j++) { PunktGenetyczny Punkt = new PunktGenetyczny(this.poczatkiLista[j], this.konceLista[j], this.precyzjaLista[j]); Punkt.Policz(); Punkt.generujLancuchBinarny(Punkt.dlugosclancucha); Punkt.przesuniecieDoPrzedzialu(); Potomek.punktyGenetyczne.Add(Punkt); } Potomek.przydzielNowyLancuchBinarny(listaLancuchow[i]); Potomek.SetWartoscOsobnika(); Potomek.SetScalLancuchBinarny(); Potomek.policzDlugoscCalegoLancucha(); listaPotomkow.Add(Potomek); } this.listaPotomkow = listaPotomkow; }
// KRZYŻOWANIE WIELOPUNKTOWE: public void krzyzowanieWielopunktowe(string lancuchPierwszegoRodzica, string lancuchDrugiegoRodzica) { string lancuchPierwszegoPotomka = string.Empty; char[] lancuchPierwszegoRodzicaJakoChar = lancuchPierwszegoRodzica.ToCharArray(); string lancuchDrugiegoPotomka = string.Empty; char[] lancuchDrugiegoRodzicaJakoChar = lancuchDrugiegoRodzica.ToCharArray(); List <string> listaLancuchow = new List <string>(); List <Osobnik> listaPotomkow = new List <Osobnik>(); List <int> listaPunktowKrzyzowania = new List <int>(); var rng = new Random(Guid.NewGuid().GetHashCode()); int r; int o = 0; int ktoryPunkt; int poczatkowyPunktDoLosowania = 0; int m = (int)listaOsobnikow[0].dlugoscCalegoLancucha - 1; r = rng.Next(1, ((m / 2) - 2)); //Console.WriteLine(); //Console.WriteLine("Ilosc punktow krzyzowania: " + r); for (int i = 0; i < r; i++) { ktoryPunkt = i + 1; if (poczatkowyPunktDoLosowania < m - 2) { o = rng.Next(poczatkowyPunktDoLosowania + 1, m); //Console.WriteLine(); //Console.WriteLine("{0} punkt to: {1}", i, o); if (ktoryPunkt % 2 != 0) { for (int j = poczatkowyPunktDoLosowania; j < o; j++) { lancuchPierwszegoPotomka += string.Concat(lancuchPierwszegoRodzicaJakoChar[j]); lancuchDrugiegoPotomka += string.Concat(lancuchDrugiegoRodzicaJakoChar[j]); } } else if (ktoryPunkt % 2 == 0) { for (int j = poczatkowyPunktDoLosowania; j < o; j++) { lancuchPierwszegoPotomka += string.Concat(lancuchDrugiegoRodzicaJakoChar[j]); lancuchDrugiegoPotomka += string.Concat(lancuchPierwszegoRodzicaJakoChar[j]); } } poczatkowyPunktDoLosowania = o; if (r == ktoryPunkt) { if (r % 2 != 0) { for (int j = poczatkowyPunktDoLosowania; j <= m; j++) { lancuchPierwszegoPotomka += string.Concat(lancuchDrugiegoRodzicaJakoChar[j]); lancuchDrugiegoPotomka += string.Concat(lancuchPierwszegoRodzicaJakoChar[j]); } } else if (r % 2 == 0) { for (int j = poczatkowyPunktDoLosowania; j <= m; j++) { lancuchPierwszegoPotomka += string.Concat(lancuchPierwszegoRodzicaJakoChar[j]); lancuchDrugiegoPotomka += string.Concat(lancuchDrugiegoRodzicaJakoChar[j]); } } } } else if (poczatkowyPunktDoLosowania >= m - 2) { if (r == ktoryPunkt) { if (r % 2 != 0) { for (int j = poczatkowyPunktDoLosowania; j <= m; j++) { lancuchPierwszegoPotomka += string.Concat(lancuchDrugiegoRodzicaJakoChar[j]); lancuchDrugiegoPotomka += string.Concat(lancuchPierwszegoRodzicaJakoChar[j]); } } else if (r % 2 == 0) { for (int j = poczatkowyPunktDoLosowania; j <= m; j++) { lancuchPierwszegoPotomka += string.Concat(lancuchPierwszegoRodzicaJakoChar[j]); lancuchDrugiegoPotomka += string.Concat(lancuchDrugiegoRodzicaJakoChar[j]); } } } o = 0; } } listaLancuchow.Add(lancuchPierwszegoPotomka); listaLancuchow.Add(lancuchDrugiegoPotomka); for (int i = 0; i < listaLancuchow.Count; i++) { string imie = "Potomek krolika " + i + "" + i; Osobnik Potomek = new Osobnik(imie); for (int j = 0; j < this.poczatkiLista.Count; j++) { PunktGenetyczny Punkt = new PunktGenetyczny(this.poczatkiLista[j], this.konceLista[j], this.precyzjaLista[j]); Punkt.Policz(); Punkt.generujLancuchBinarny(Punkt.dlugosclancucha); Punkt.przesuniecieDoPrzedzialu(); Potomek.punktyGenetyczne.Add(Punkt); } Potomek.przydzielNowyLancuchBinarny(listaLancuchow[i]); Potomek.SetWartoscOsobnika(); Potomek.SetScalLancuchBinarny(); Potomek.policzDlugoscCalegoLancucha(); listaPotomkow.Add(Potomek); } this.listaPotomkow = listaPotomkow; }