Пример #1
0
        public List<gen> Generowanie_BFS(siec[] graf, int ile_sciezek, int nadawca, int odbiorca)
        {
            List<siec> tab = new List<siec>();
            List<gen> tab_r = new List<gen>();               //tablica routingu
            bool[] vis = new bool[graf.Count()];              //kontrolka
            List<int> kolejka = new List<int>();             //kolejka
            List<int> gen = new List<int>();                //scieżka
            siec node =new siec();                         //krawędź
            siec nw ;
            int random = 0;
            int koniec = nadawca;
            int wczesniej = nadawca;
            siec kopia;

            int licz = 0, licz2=0;
            while(licz2 <ile_sciezek)
            {
                kolejka.Clear();
                tab.Add(null);

                gen.Clear();
                gen.Add(nadawca);

                for (int i = 0; i < graf.Count(); i++) { vis[i] = false; } //zerowanie kontrolki
                vis[nadawca] = true; //odwiedzony

                for (node = graf[nadawca]; node != null; node = node.next) //dodanie sasiadow startu
                {
                    if (vis[node.to] != true)
                    {
                        kolejka.Add(node.to);
                    }
                } //for

                do
                {

                    while (kolejka.Count == 0 && koniec != odbiorca) //jak wejdzie w slepy zaulek
                    {
                        //cout<<gen.back();
                        gen.RemoveAt(gen.Count() - 1);
                        for (node = graf[gen[gen.Count - 1]]; node != null; node = node.next) //dodanie sasiadow startu
                        {
                            if (vis[node.to] != true)
                            {
                                kolejka.Add(node.to);
                            }
                        } //for

                    }

                    random = Multi.Form1.x.Next(0, kolejka.Count); //wylosowanie kolejnego allelu
                    node = graf[kolejka[random]];
                    koniec = kolejka[random];

                    gen.Add(kolejka[random]); //dodaj wylosowany wierzcholek do genu

                    vis[kolejka[random]] = true;
                    kolejka.Clear();

                    for (; node != null; node = node.next) //dodanie sasiadow wylosowanego wierzcholka
                    {
                        if (!vis[node.to])
                        {
                            kolejka.Add(node.to);
                        }
                    } //for

                } while (koniec != odbiorca); //do while

                int j = 0;
                for (j = 1; j < gen.Count();j++ )
                {

                    for (nw = graf[gen[j]]; nw != null; nw = nw.next)
                    {
                        if (nw.from == gen[j] && nw.to == gen[j - 1])
                        {
                            kopia = new siec(nw);
                            node = kopia;
                            node.next = tab[licz];
                            tab[licz] = node;
                        }
                    }
                 }

                if (licz != 0)
                {

                    for (int i = 0; i < tab.Count(); i++)
                    {
                        nw = tab[licz];

                        if (i != licz && nw !=null )
                        {
                            kopia = tab[i];
                            if (kopia != null)
                            {

                                while (kopia != null && nw !=null && kopia.to == nw.to )
                                {
                                    nw = nw.next;
                                    kopia = kopia.next;

                                    if (nw == null && kopia == null)
                                    {
                                        tab.RemoveAt(licz);
                                        licz--;

                                        break;

                                    }

                                }
                            }
                        }

                    }

                }

                licz++;
                licz2++;
            }//while główny
            /*
            Debug.WriteLine("");
            for (int i = 0; i < tab_r.Count(); i++)
            {
                for (node = tab_r[i]; node != null; node = node.next)
                {
                    Debug.Write(node.from + " -> ");

                }
                Debug.Write(nadawca);
                Debug.WriteLine("");
            }

             */
            double koszt, opoznienie ;

            siec pomoc;
            gen sciezka;

            for (int k = 0; k < tab.Count();k++ )
            {
                koszt = 0;
                opoznienie = 0;
                kopia = siec.DeepCopy(tab[k]);
                for (pomoc = kopia; pomoc != null; pomoc = pomoc.next)
                {
                    koszt = koszt + pomoc.cost;
                    opoznienie = opoznienie + pomoc.delay;
                }

                sciezka = new gen(kopia, koszt, opoznienie);
                tab_r.Add(sciezka);

            }

                return tab_r;
        }
Пример #2
0
        public List<gen> Generowanie_YEN(siec[] graf, int ile_sciezek, int nadawca, int odbiorca)
        {
            List<gen> tab_r = new List<gen>();               //tablica routingu
            List<gen> stos = new List<gen>();                  // stos z potencjalnymi najkrutszymi ściezkami
            List<siec> removed_node = new List<siec>();       //usuniete krawędzie
            siec dijkastra = new siec();
            siec pomoc, pomoc2, pomoc3,pomoc4;
            List<int> root_path;
            siec total_path =null, spur_path;                                //suma root_path i spur_path
            siec spur_node;
            int dlugosc_sciezki, usuwanie_nadawcy;
            double koszt, opoznienie;
            gen sciezka;
            int sprawdzenie;

            siec[] kopia_graf = siec.DeepCopy(graf);
            koszt = 0;
            opoznienie = 0;

            pomoc4=dijkastra.sciezka(nadawca, odbiorca, graf.Count(), graf, "cost"); //obliczenie najkrutszej ścieżki

            for (pomoc3 = pomoc4; pomoc3 != null; pomoc3 = pomoc3.next)
            {
                koszt = koszt + pomoc3.cost;
                opoznienie = opoznienie + pomoc3.delay;
            }

            sciezka = new gen(pomoc4, koszt, opoznienie);
            tab_r.Add(sciezka);

            for (int k = 1; k < ile_sciezek; k++)//główny for ile sciezek trzeba wyznaczyć
                {
                    dlugosc_sciezki = 0;
                    root_path = new List<int>();            //sciezka
                    spur_node = tab_r[k - 1].sciezka;              //nowy wiezchołek startowy
                    root_path.Add(spur_node.to);
                    usuwanie_nadawcy = 0;
                    removed_node.Clear();

                    for (pomoc = tab_r[k - 1].sciezka; pomoc != null; pomoc = pomoc.next)//liczy ilość węzłów w ścieżce
                    {
                        dlugosc_sciezki++;
                    }

                    for(int i =0; i<dlugosc_sciezki; i++)//
                    {

                        for (int c = 0; c < tab_r.Count(); c++) //usuwa wszystkie krawędzie należące do tab_r z węzłem startowym spur_node z graf
                        {

                            for (pomoc2 = tab_r[c].sciezka; pomoc2 != null; pomoc2 = pomoc2.next)
                            {

                                if (spur_node.to == pomoc2.to) // && pour_node.from !=pomoc2.from
                                {

                                    for (pomoc = kopia_graf[pomoc2.from]; pomoc != null; pomoc = pomoc.next)
                                    {

                                        if (spur_node.to == pomoc.to && pomoc.from == pomoc2.from)
                                        {
                                            if (pomoc.before == null)
                                            {
                                                kopia_graf[pomoc2.from] = pomoc.next;
                                                if (kopia_graf[pomoc2.from] != null && kopia_graf[pomoc2.from].before != null)
                                                {
                                                    kopia_graf[pomoc2.from].before = null;
                                                }
                                                break;
                                            }
                                            else
                                            {
                                                pomoc.before.next = pomoc.next;
                                                if (pomoc.next != null)
                                                {
                                                    pomoc.next.before = pomoc.before;
                                                }
                                                break;
                                            }

                                        }

                                    } //for

                                    for (pomoc = kopia_graf[pomoc2.to]; pomoc != null; pomoc = pomoc.next)
                                    {

                                        if (pomoc2.to == pomoc.from && pomoc2.from == pomoc.to)
                                        {
                                            if (pomoc.before == null)
                                            {
                                                kopia_graf[pomoc2.to] = pomoc.next;
                                                if (kopia_graf[pomoc2.to] != null && kopia_graf[pomoc2.to].before != null)
                                                {
                                                    kopia_graf[pomoc2.to].before = null;
                                                }
                                                break;
                                            }
                                            else
                                            {
                                                pomoc.before.next = pomoc.next;
                                                if (pomoc.next != null)
                                                {
                                                    pomoc.next.before = pomoc.before;
                                                }
                                                break;
                                            }
                                        }

                                    } //for

                                }

                                if (i == 1&& usuwanie_nadawcy ==0)
                                {
                                    int kontrolka = 0;
                                    kopia_graf[nadawca] = null;
                                    usuwanie_nadawcy = 1;
                                    while (kontrolka < kopia_graf.Count())
                                    {

                                        for (pomoc = kopia_graf[kontrolka]; pomoc != null; pomoc = pomoc.next)
                                        {

                                            if (nadawca == pomoc.to)
                                            {
                                                if (pomoc.before == null)
                                                {
                                                    kopia_graf[kontrolka] = pomoc.next;
                                                    if ( kopia_graf[kontrolka]!= null && kopia_graf[kontrolka].before != null)
                                                    {
                                                        kopia_graf[kontrolka].before = null;
                                                    }
                                                    break;
                                                }
                                                else
                                                {

                                                    pomoc.before.next = pomoc.next;
                                                    if (pomoc.next != null)
                                                    {
                                                        pomoc.next.before = pomoc.before;
                                                    }
                                                    break;

                                                }
                                            }

                                        }
                                        kontrolka++;
                                    }
                                }
                            }
                         }//koniec for usuwa

                        koszt = 0;
                        opoznienie = 0;
                        if (i == 0)
                        {
                            sciezka = new gen(dijkastra.sciezka(spur_node.to, odbiorca, kopia_graf.Count(), kopia_graf, "cost"), 0, 0);

                            if (sciezka.sciezka != null)
                            {
                                for (pomoc3 = sciezka.sciezka; pomoc3 != null; pomoc3 = pomoc3.next)
                                {
                                    koszt = koszt + pomoc3.cost;
                                    opoznienie = opoznienie + pomoc3.delay;
                                }
                                sciezka.cost = koszt;
                                sciezka.delay = opoznienie;

                                stos.Add(sciezka);
                            }

                        }
                        else
                        {

                            total_path = siec.DeepCopy(tab_r[k - 1].sciezka);

                            for (spur_path=total_path; spur_path.from != spur_node.to; spur_path = spur_path.next)
                            {

                            }
                            pomoc4=dijkastra.sciezka(spur_node.to, odbiorca, kopia_graf.Count(), kopia_graf, "cost");
                            spur_path.next = pomoc4;

                            if (spur_path.next == null)
                            {
                                break;
                            }
                            else
                            {
                                for (pomoc3 = total_path; pomoc3 != null; pomoc3 = pomoc3.next)
                                {
                                    koszt = koszt + pomoc3.cost;
                                    opoznienie = opoznienie + pomoc3.delay;
                                }
                                sciezka = new gen(total_path, koszt, opoznienie);
                                stos.Add(sciezka);
                            }

                        }

                        spur_node = spur_node.next;
                        if(spur_node!=null)
                        root_path.Add(spur_node.to);
                       // kopia_graf = siec.DeepCopy(kopia_graf);

                    }

                    kopia_graf = siec.DeepCopy(graf); //przywrucenie własności grafu
                    if (stos.Count() == 0)
                    {
                        break;
                    }

                    stos = stos.OrderBy(o => o.cost).ToList();

                  do
                  {
                      sprawdzenie = 0;
                      for (int spr = 0; spr < tab_r.Count(); spr++)
                      {
                          pomoc = tab_r[spr].sciezka;
                          if (stos.Count() != 0)
                          {
                              for (pomoc2 = stos.FirstOrDefault().sciezka; pomoc2 != null; pomoc2 = pomoc2.next)
                              {
                                  if (pomoc.to == pomoc2.to && pomoc.from == pomoc2.from)
                                  {
                                      if (pomoc.next == pomoc2.next && pomoc.next == null && pomoc2.next == null)
                                      {
                                          stos.Remove(stos.FirstOrDefault());
                                          sprawdzenie = 1;

                                          break;
                                      }

                                  }else
                                  {
                                      break;
                                  }

                                  pomoc = pomoc.next;
                                  if (pomoc == null)
                                  {
                                      break;
                                  }
                              }
                          }
                          else
                          {
                              break;
                          }
                          if(sprawdzenie == 1)
                          {

                              break;
                          }

                      }

                  } while (sprawdzenie == 1);

                  if (stos.Count() == 0)
                  {
                      break;
                  }
                    tab_r.Add(stos.FirstOrDefault());
                    stos.Remove(stos.FirstOrDefault());
                }//for główny

                return tab_r;
        }
Пример #3
0
        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));
        }