예제 #1
0
파일: AG.cs 프로젝트: bolo07/MultiGit
        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;
        }
예제 #2
0
파일: AG.cs 프로젝트: bolo07/MultiGit
        public void mutacja(double prawdop, List<gen> dzieco, List<List<gen>> tab_r)
        {
            prawdop =prawdop* 100;
            int m,m2,p,p2,l;
            m = Multi.Form1.x.Next(1, 101); //czy wystąpi mutacja
            gen scie;
            if(m<prawdop)
            {
                if (dzieco.Count() > 16) // losowanie ile mutacji wystąpi
                {
                    l = Multi.Form1.x.Next(1, 3);
                }
                else { l = 1; }

                if (l == 1) //jeśli 1 mutacja to
                {
                    m = Multi.Form1.x.Next(0, dzieco.Count()); //który gen mutuje
                    p = Multi.Form1.x.Next(0, tab_r[m].Count() );

                    scie = new gen(tab_r[m][p].sciezka, tab_r[m][p].cost, tab_r[m][p].delay);
                    dzieco[m] = scie;
                }

                if (l == 2) //jeśli 1 mutacja to
                {
                    m = Multi.Form1.x.Next(0, dzieco.Count()); //który gen mutuje
                    p = Multi.Form1.x.Next(0, tab_r[m].Count());

                    m2 = Multi.Form1.x.Next(0, dzieco.Count()); //który gen mutuje
                    p2 = Multi.Form1.x.Next(0, tab_r[m2].Count());

                    scie = new gen(tab_r[m][p].sciezka, tab_r[m][p].cost, tab_r[m][p].delay);
                    dzieco[m] = scie;
                    scie = new gen(tab_r[m2][p2].sciezka, tab_r[m2][p2].cost, tab_r[m2][p2].delay);
                    dzieco[m2] = scie;
                }
            }
        }
예제 #3
0
파일: AG.cs 프로젝트: bolo07/MultiGit
        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;
        }