public void mutacja(int LBnCh, List <Osobnik> newpop, List <Osobnik> populacja, int lParam, int TurRozm = 0) { Random rand = new Random(); if (TurRozm == 0) { TurRozm = rand.Next(2, Convert.ToInt32(populacja.Count * 0.2)); } Osobnik najlepszy = selekcjaTurniej(TurRozm, populacja); Osobnik nowy = new Osobnik(); int bPunkt = rand.Next(0, LBnCh * lParam); for (int i = 0; i < LBnCh * lParam; i++) { if (bPunkt == i) { nowy.Chromosomy.Add(najlepszy.Chromosomy[i] ^ 1); } else { nowy.Chromosomy.Add(najlepszy.Chromosomy[i]); } } newpop.Add(nowy); }
public Osobnik selekcjaTurniej(int TurRozm, List <Osobnik> populacja) { Random rand = new Random(); Osobnik win = new Osobnik(); List <int> possible = Enumerable.Range(0, populacja.Count).ToList(); List <int> listNumbers = new List <int>(); for (int i = 0; i < TurRozm; i++) { int index = rand.Next(0, possible.Count); listNumbers.Add(possible[index]); possible.RemoveAt(index); } double max = populacja[0].Ocena; foreach (int nr in listNumbers) { if (populacja[nr].Ocena > max) { max = populacja[nr].Ocena; } } foreach (Osobnik osob in populacja) { if (osob.Ocena == max) { win = osob; } } return(win); }
public List <Osobnik> krzyzowanie(Osobnik p1, Osobnik p2, int LBnCh, int lParam) { Random rand = new Random(); Osobnik nowy = new Osobnik(); List <Osobnik> nowList = new List <Osobnik>(); int bPunkt = rand.Next(0, LBnCh * 2); for (int i = 0; i < LBnCh * lParam; i++) { if (bPunkt >= i) { nowy.Chromosomy.Add(p1.Chromosomy[i]); } else { nowy.Chromosomy.Add(p2.Chromosomy[i]); } } nowList.Add(nowy); nowy = new Osobnik(); for (int i = 0; i < LBnCh * lParam; i++) { if (bPunkt < i) { nowy.Chromosomy.Add(p1.Chromosomy[i]); } else { nowy.Chromosomy.Add(p2.Chromosomy[i]); } } nowList.Add(nowy); return(nowList); }
public List <Osobnik> tworzOsobniki(int ilosc, int LBnCh, int lParam, List <Osobnik> populacja) { Random rand = new Random(); for (int i = 0; i < ilosc; i++) { Osobnik osobnik = new Osobnik(); for (int j = 0; j < LBnCh * lParam; j++) { osobnik.Chromosomy.Add(rand.Next(0, 2)); } populacja.Add(osobnik); } return(populacja); }
public void zad3Rek(int LBnCh, int ZDMin, int ZDMax, int iteracje, int obecna, List <Osobnik> populacja) { List <Osobnik> newpop = new List <Osobnik>(); for (int j = 0; j < (populacja.Count - 1) / 3; j++) { Osobnik os = selekcjaTurniej2(3, populacja); newpop.Add(mutacja2(LBnCh, os, 9)); } for (int j = 0; j < (populacja.Count - 1) / 6; j++) { Osobnik p1 = selekcjaTurniej2(3, populacja); Osobnik p2 = selekcjaTurniej2(3, populacja); List <Osobnik> krzyz = krzyzowanie(p1, p2, LBnCh, 9); foreach (Osobnik osobnik in krzyz) { newpop.Add(osobnik); } } for (int j = 0; j < (populacja.Count - 1) / 6; j++) { Osobnik p1 = selekcjaTurniej2(3, populacja); Osobnik p2 = selekcjaTurniej2(3, populacja); List <Osobnik> krzyz = krzyzowanie(p1, p2, LBnCh, 9); foreach (Osobnik osobnik in krzyz) { newpop.Add(mutacja2(LBnCh, osobnik, 9)); } } Osobnik najlepszy = selekcjaTurniej2(populacja.Count, populacja); newpop.Add(najlepszy); zad3Licz(newpop, LBnCh, ZDMin, ZDMax); double suma = 0; foreach (Osobnik osobnik in populacja) { suma += osobnik.Ocena; } finish.Text += "Najnizsza ocena: " + najlepszy.Ocena + " Srednia ocena: " + (suma / populacja.Count) + "\n"; if (obecna < iteracje - 1) { zad3Rek(LBnCh, ZDMin, ZDMax, iteracje, obecna + 1, newpop); } }
public Osobnik mutacja2(int LBnCh, Osobnik os, int lParam) { Random rand = new Random(); Osobnik nowy = new Osobnik(); int bPunkt = rand.Next(0, LBnCh * 2); for (int i = 0; i < LBnCh * lParam; i++) { if (bPunkt == i) { nowy.Chromosomy.Add(os.Chromosomy[i] ^ 1); } else { nowy.Chromosomy.Add(os.Chromosomy[i]); } } return(nowy); }
private void generuj(Warstwa warstwa, int i, int LBnCh, Osobnik osobnik, double ZDMin, double ZDMax) { for (int j = 0; j < (warstwy[i] + 1) * warstwy[i + 1]; j++) { List <int> chromosomy = new List <int>(); if (i == 0) { for (int k = j * LBnCh; k < LBnCh * (j + 1); k++) { chromosomy.Add(osobnik.Chromosomy[k]); } } else { for (int k = j * LBnCh + i * (warstwy[i - 1] + 1) * warstwy[i] * LBnCh; k < LBnCh * (j + 1) + i * (warstwy[i - 1] + 1) * warstwy[i] * LBnCh; k++) { chromosomy.Add(osobnik.Chromosomy[k]); } } warstwa.Wagi.Add(dekoduj(chromosomy, LBnCh, ZDMin, ZDMax)); } }
public void zad1Rek(int LBnCh, int ZDMin, int ZDMax, int iteracje, int obecna, int lParam, List <Osobnik> populacja) { List <Osobnik> newpop = new List <Osobnik>(); for (int j = 0; j < populacja.Count - 1; j++) { mutacja(LBnCh, newpop, populacja, lParam); } Osobnik najlepszy = selekcjaTurniej(populacja.Count, populacja); newpop.Add(najlepszy); zad1Licz(LBnCh, ZDMin, ZDMax, newpop); double suma = 0; foreach (Osobnik osobnik in populacja) { suma += osobnik.Ocena; } finish.Text += "Najwyzsza ocena: " + najlepszy.Ocena + " Srednia ocena: " + (suma / populacja.Count) + "\n"; if (obecna < iteracje - 1) { zad1Rek(LBnCh, ZDMin, ZDMax, iteracje, obecna + 1, lParam, newpop); } }
private void robWarstwy(Warstwa warstwa, List <int> warstwy, int skip, int LBnCh, Osobnik osobnik, int ZDMin, int ZDMax) { Warstwa tmp = new Warstwa(); if (warstwy.Count - 1 != skip) { generuj(tmp, skip, LBnCh, osobnik, ZDMin, ZDMax); } warstwa.Dzieci.Add(tmp); if (warstwy.Count > skip + 1) { robWarstwy(tmp, warstwy, skip + 1, LBnCh, osobnik, ZDMin, ZDMax); } }