public List<osobnik> krzyzowanie_rownomierne(List<osobnik> populacja, List<int> wylosowani, double p_mutacji, List<List<gen>> l_tab_r) { List <osobnik> dzieci = new List<osobnik>(); osobnik drzewo; List<gen> dziecko1; List<gen> dziecko2; int j; List<int> wektor = new List<int>(); dzieci.Clear(); j=1; for (int i = 0; i < wylosowani.Count(); i += 2) //tworzenie nowej populacji { dziecko1 = new List<gen>(); dziecko2 = new List<gen>(); wektor.Clear(); for (int c = 0; c < populacja[i].chromosom.Count(); c++) { wektor.Add(Multi.Form1.x.Next(0,2)); } for (int k = 0; k < populacja[i].chromosom.Count(); k++) //reprodukcja { if(wektor[k] == 0) { dziecko1.Add(siec.DeepCopy(populacja[wylosowani[j]].chromosom[k])); dziecko2.Add(siec.DeepCopy(populacja[wylosowani[i]].chromosom[k])); } else if (wektor[k] == 1) { dziecko1.Add(siec.DeepCopy(populacja[wylosowani[i]].chromosom[k])); dziecko2.Add(siec.DeepCopy(populacja[wylosowani[j]].chromosom[k])); } }//reprodukcja mutacja(p_mutacji, dziecko1, l_tab_r); //mutacja dziecko1 drzewo = new osobnik(dziecko1, -1); //dodanie dziecka do populacji dzieci.Add(drzewo); mutacja(p_mutacji, dziecko1, l_tab_r); //mutacja dziecko1 drzewo = new osobnik(dziecko2, -1);//dodanie dziecka do populacji dzieci.Add(drzewo); j += 2; } return dzieci; }
public bool algorytm_genetyczny(int p_pocz, Int16 m_generowania, Int16 m_selekcji, Int16 m_krzyzowania, double p_mutacji, siec[] graf, int[] odbiorcy, int ile_sciezek, int ile_pokolen, int delta ) { System.IO.StreamWriter plik = System.IO.File.AppendText(@"AG.txt"); System.IO.StreamWriter plikcsv = System.IO.File.AppendText(@"AG.csv"); List<List<gen>> l_tab_r = new List<List<gen>>(); //lista tablic routingu (baza genów) List<gen> drzewo ; //drzewo transmisji multicas List<osobnik> populacja = new List<osobnik>(); //populacja osobników osobnik chromosom; //chromosom (drzewo transmisji) List<int> wylosowani = new List<int>(); //lista wybranych do krzyżowania osobników List<osobnik> dzieci = new List<osobnik>(); //lista dzieci List<osobnik> dzieci_nowe = new List<osobnik>(); dzieci.Clear(); l_tab_r.Clear(); dzieci_nowe.Clear(); ////////////////////////////// 1 Generowanie populacji poczatkowej////////////////////////////////// #region switch (m_generowania) { case 1://generuje tablice routingu przeszukując grf w szerz int rand1 = 0; populacja.Clear(); for (int i = 1; i < odbiorcy.Count(); i++) { l_tab_r.Add(Generowanie_BFS(graf, ile_sciezek, odbiorcy[0], odbiorcy[i])); } for (int j = 0; j < p_pocz; j++) { drzewo = new List<gen>(odbiorcy.Count()-1); for (int i = 0; i < odbiorcy.Count() - 1; i++) { rand1 = Multi.Form1.x.Next(0, l_tab_r[i].Count()); drzewo.Add(siec.DeepCopy(l_tab_r[i][rand1])); } chromosom = new osobnik(drzewo, -1); populacja.Add(chromosom); } /* siec node; for (int k = 0; k < populacja.Count(); k++) { Debug.WriteLine(""); Debug.WriteLine("Osobnik ("+k+")"); for (int i = 0; i < populacja[k].chromosom.Count(); i++) { for (node = populacja[k].chromosom[i].sciezka; node != null; node = node.next) { Debug.Write(node.from + " -> "); } Debug.Write(odbiorcy[0] + " " + populacja[k].chromosom[i].cost + " " + populacja[k].chromosom[i].delay); Debug.WriteLine(""); } } Debug.WriteLine("Koniec_inicjacji");*/ break; case 2: populacja.Clear(); int rand2 = 0; for (int i = 1; i < odbiorcy.Count(); i++) { l_tab_r.Add(Generowanie_YEN(graf, ile_sciezek, odbiorcy[0], odbiorcy[i])); } for (int j = 0; j < p_pocz; j++) { drzewo = new List<gen>(odbiorcy.Count()-1); for (int i = 0; i < odbiorcy.Count() - 1; i++) { rand2 = Multi.Form1.x.Next(0, l_tab_r[i].Count()); drzewo.Add(siec.DeepCopy(l_tab_r[i][rand2])); } chromosom = new osobnik(drzewo, -1); populacja.Add(chromosom); } /* siec node1; for (int k = 0; k < populacja.Count(); k++) { Debug.WriteLine(""); Debug.WriteLine("Osobnik ("+k+")"); for (int i = 0; i < populacja[k].chromosom.Count(); i++) { for (node1 = populacja[k].chromosom[i].sciezka; node1 != null; node1 = node1.next) { Debug.Write(node1.to + " -> "); if (node1.next == null) { Debug.Write(node1.from); } } Debug.Write(" " + populacja[k].chromosom[i].cost + " " + populacja[k].chromosom[i].delay); Debug.WriteLine(""); } } Debug.WriteLine("Koniec_inicjacji"); */ break; }//Gen_populacji #endregion// ///////////////////////////////////2 ocena populacji /////////////////////////////////////////////// ocena_przyst(populacja, delta); // for (int i = 0; i < populacja.Count(); i++) { Debug.WriteLine(populacja[i].przystosowanie); } ///////////////////////////////// 3 selekcja osobnikow/////////////////////////////////////////////// for (int ile_pok = 0; ile_pok < ile_pokolen; ile_pok++) { #region switch (m_selekcji) { case 1: wylosowani = selekcja_ruletka(populacja); break; case 2: wylosowani = selekcja_turniej(populacja); break; case 3: wylosowani = selekcja_ranking(populacja); break; }//selekcja #endregion /////////////////////////////////// 4 krzyżowanie /////////////////////////////////////////////////// #region switch (m_krzyzowania) { case 1: dzieci.Clear(); dzieci = krzyzowanie_jednop(populacja, wylosowani, p_mutacji, l_tab_r); break; case 2: dzieci.Clear(); dzieci = krzyzowanie_dwup(populacja, wylosowani, p_mutacji, l_tab_r); break; case 3: dzieci.Clear(); dzieci = krzyzowanie_rownomierne(populacja, wylosowani, p_mutacji, l_tab_r); break; }//krzyżowanie //sukcesja #endregion /////////////////////////////// 5 redukcja duplikatów ////////////////////////////////////////////// dzieci = redukcja_duplikatów(dzieci, l_tab_r); populacja = sukcesja(dzieci, populacja); ocena_przyst(populacja, delta); }/////główna pętla iteracja pokoleń populacja = populacja.OrderByDescending(o => o.przystosowanie).ToList(); /////////////////////////////////////6 zapis wyniku ///////////////////////////////////////////////// #region begin: double koszt = 0, opoznienie = 0; ; siec pomoc = new siec(); siec pomoc2 = new siec(); int n = Convert.ToInt16(graf.Count()); siec[] lista_sciezek = new siec[odbiorcy.Count() - 1]; bool[][] kontrolka1 = new bool[n][]; for (int i = 0; i < n; i++) { kontrolka1[i] = new bool[n]; } //zerowanie kontrolki for (int f = 0; f < n; f++) { for (int h = 0; h < n; h++) { kontrolka1[f][h] = false; } } siec[] mst = new siec[n]; siec nowy2; for (int i = 0; i < n; i++) { mst[i] = null; } for (int i = 0; i < odbiorcy.Count() - 1; i++) { for (pomoc2 = populacja[0].chromosom[i].sciezka; pomoc2 != null; pomoc2 = pomoc2.next) { if (kontrolka1[pomoc2.from][pomoc2.to] != true && kontrolka1[pomoc2.to][pomoc2.from] != true) { nowy2 = new siec(pomoc2.cost, pomoc2.delay, pomoc2.from, pomoc2.to, pomoc2.id, mst[pomoc2.to]); //tworzenie nowej krawedzi mst[pomoc2.to] = nowy2; nowy2 = new siec(pomoc2.cost, pomoc2.delay, pomoc2.to, pomoc2.from, pomoc2.id, mst[pomoc2.from]); mst[pomoc2.from] = nowy2; kontrolka1[pomoc2.to][pomoc2.from] = true; kontrolka1[pomoc2.from][pomoc2.to] = true; } } } int sc = 0; for (int j = 1; j < odbiorcy.Count(); j++) { lista_sciezek[sc] = pomoc.sciezka(odbiorcy[0], odbiorcy[j], n, mst, "cost"); //obliczam sciezk if (lista_sciezek[sc] == null) { plikcsv.WriteLine("zly wynik " + odbiorcy[j]); populacja.RemoveAt(0); goto begin; } sc++; } for (int i = 0; i < n; i++) { kontrolka1[i] = new bool[n]; } siec[] mst2 = new siec[n]; for (int i = 0; i < n; i++) { mst2[i] = null; } for (int i = 0; i < lista_sciezek.Count(); i++) { for (pomoc2 = lista_sciezek[i]; pomoc2 != null; pomoc2 = pomoc2.next) { if (kontrolka1[pomoc2.from][pomoc2.to] != true && kontrolka1[pomoc2.to][pomoc2.from] != true) { nowy2 = new siec(pomoc2.cost, pomoc2.delay, pomoc2.from, pomoc2.to, pomoc2.id, mst2[pomoc2.to]); //tworzenie nowej krawedzi mst2[pomoc2.to] = nowy2; nowy2 = new siec(pomoc2.cost, pomoc2.delay, pomoc2.to, pomoc2.from, pomoc2.id, mst2[pomoc2.from]); mst2[pomoc2.from] = nowy2; kontrolka1[pomoc2.to][pomoc2.from] = true; kontrolka1[pomoc2.from][pomoc2.to] = true; } } } for (int f = 0; f < n; f++) { //zerowanie kontrolki for (int h = 0; h < n; h++) { kontrolka1[f][h] = false; } } for (int i = 0; i < n; i++) //oblicza calkowity koszt drzewa multicast { pomoc = mst2[i]; if (pomoc != null) { while (pomoc != null) { if (kontrolka1[pomoc.from][pomoc.to] != true && kontrolka1[pomoc.to][pomoc.from] != true) { koszt = koszt + pomoc.cost; opoznienie = opoznienie + pomoc.delay; kontrolka1[pomoc.to][pomoc.from] = true; kontrolka1[pomoc.from][pomoc.to] = true; } pomoc = pomoc.next; } } } Debug.Write("\n"); Debug.Write("Koszt drzewa multicast wynosi = "); Debug.Write(koszt); Debug.Write("\n"); Debug.Write("\n"); Debug.Write("\n"); Debug.Write("DRZEWO MULTICAST "); Debug.Write("\n"); Debug.Write("\n"); plik.WriteLine("\n" + "delta = " + delta + "\n"); plik.WriteLine("\n" + "Koszt drzewa multicast wynosi = " + koszt + "\n"); plikcsv.WriteLine(koszt); plik.WriteLine("\n" + "Nadawca = " + odbiorcy[0] + "\n"); plik.Write("Odbiorcy = "); for (int i = 1; i < odbiorcy.Count(); i++) { plik.Write(odbiorcy[i] + ", "); } plik.WriteLine(""); plik.WriteLine(""); plik.WriteLine("\n" + "DRZEWO MULTICAST " + "\n"); for (int i = 0; i < n; i++) //wyswietla Lsonsiadow graf_kpp { pomoc = mst2[i]; if (pomoc != null) { Debug.Write("DMT["); Debug.Write(i); Debug.Write("] ="); plik.Write("DMT[" + i + "] ->"); while (pomoc != null) { Debug.Write(" " + pomoc.to + " "); plik.Write(" " + pomoc.to + " "); pomoc = pomoc.next; } Debug.Write("\n"); plik.WriteLine(""); } } Debug.Write("\n"); #endregion Debug.WriteLine(koszt); plik.Close(); plikcsv.Close(); return true; // MessageBox.Show("Koszt drzewa transmisji grupowej wynosi: " + Convert.ToString(koszt) + " \n " + Convert.ToString(opoznienie)); }
public List<osobnik> krzyzowanie_jednop(List<osobnik> populacja, List<int> wylosowani, double p_mutacji, List<List<gen>>l_tab_r ) { List <osobnik> dzieci = new List<osobnik>(); osobnik drzewo; List<gen> dziecko1; List<gen> dziecko2; int j, p_ciecia; dzieci.Clear(); j=1; for (int i = 0; i < wylosowani.Count(); i += 2) //tworzenie nowej populacji { p_ciecia = Multi.Form1.x.Next(1, populacja[i].chromosom.Count()); //losowanie punktu cięcia dziecko1 = new List<gen>(); dziecko2 = new List<gen>(); for (int k = 0; k < populacja[i].chromosom.Count(); k++ ) { if(k<p_ciecia) { dziecko1.Add(siec.DeepCopy(populacja[wylosowani[i]].chromosom[k])); dziecko2.Add(siec.DeepCopy(populacja[wylosowani[j]].chromosom[k])); } if(k>=p_ciecia) { dziecko1.Add(siec.DeepCopy(populacja[wylosowani[j]].chromosom[k])); dziecko2.Add(siec.DeepCopy(populacja[wylosowani[i]].chromosom[k])); } } //reprodukcja mutacja(p_mutacji, dziecko1, l_tab_r); //mutacja dziecko1 drzewo = new osobnik(dziecko1, -1); dzieci.Add(drzewo); mutacja(p_mutacji, dziecko2, l_tab_r); //mutacja dziecko2 drzewo = new osobnik(dziecko2, -1); dzieci.Add(drzewo); j += 2; } return dzieci; }
public List<osobnik> redukcja_duplikatów(List<osobnik> populacja_do_spr, List<List<gen>> l_tab_r) { List<osobnik> dzieci_nowe = new List<osobnik>(); osobnik nowy; siec gen1,gen2; int drzewo; for (int c = 0; c < populacja_do_spr.Count(); c++ ) { dzieci_nowe.Add(null); } for (int i = 0; i < populacja_do_spr.Count(); i++) //porównanie wszystkich dzieci { for (int j = i+1; j < populacja_do_spr.Count(); j++)//porównanie ze innymi dziećmi { if (i != j)//nie porównuje do samego siebie { drzewo = 0; for (int k = 0; k < populacja_do_spr[i].chromosom.Count(); k++) //porównywanie osobników { gen1 = populacja_do_spr[i].chromosom[k].sciezka; gen2 = populacja_do_spr[j].chromosom[k].sciezka; if (gen1.from == gen2.from && gen1.to == gen2.to) { for (; gen1 != null; gen1 = gen1.next) { if (gen1.from == gen2.from && gen1.to == gen2.to) { if (gen2 != null) { gen2 = gen2.next; } } else { break; } } drzewo++; } else { break; } } if (drzewo == populacja_do_spr[i].chromosom.Count()) { List<gen> chromos = new List<gen>(); nowy = new osobnik(chromos, -1); for (int z = 0; z < populacja_do_spr[i].chromosom.Count(); z++) { nowy.chromosom.Add(siec.DeepCopy(l_tab_r[z][Multi.Form1.x.Next(0, l_tab_r[z].Count())])); } dzieci_nowe[j] = nowy; // Debug.WriteLine("redukcja_duplikatów " + i+ " " +j); } } } }//for - porównanie wszystkich dzieci for (int c = 0; c < populacja_do_spr.Count(); c++) { if (dzieci_nowe[c] == null) dzieci_nowe[c] = siec.DeepCopy(populacja_do_spr[c]); } return dzieci_nowe; }