예제 #1
0
파일: AG.cs 프로젝트: bolo07/MultiGit
        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;
        }
예제 #2
0
파일: AG.cs 프로젝트: bolo07/MultiGit
        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));
        }
예제 #3
0
파일: AG.cs 프로젝트: bolo07/MultiGit
        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;
        }
예제 #4
0
파일: AG.cs 프로젝트: bolo07/MultiGit
        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;
        }