Ejemplo n.º 1
0
        public void wyznaczWezly(Wezel Skad)
        {
            //znalezienie lacza wychodzacego od wezla
            Lacze lacze = KrawedzieSciezki.Find(x => x.Wezel1 == Skad);

            if (lacze != null)
            {
                if (!ListaWezlowSciezki.Contains(lacze.Wezel1))
                {
                    ListaWezlowSciezki.Add(lacze.Wezel1);
                }
                if (!ListaWezlowSciezki.Contains(lacze.Wezel2))
                {
                    ListaWezlowSciezki.Add(lacze.Wezel2);
                }

                //Wyznaczamy wezly dalej, zaczynajac od drugiego wezla
                wyznaczWezly(lacze.Wezel2);
            }

            /*
             * foreach (Lacze lacze in ListaKrawedziSciezki)
             * {
             *  if (!ListaWezlowSciezki.Contains(lacze.Wezel1))
             *      ListaWezlowSciezki.Add(lacze.Wezel1);
             *  if (!ListaWezlowSciezki.Contains(lacze.Wezel2))
             *      ListaWezlowSciezki.Add(lacze.Wezel2);
             *  else
             *      continue;
             * } */
        }
Ejemplo n.º 2
0
 public Sciezka(Wezel Pierwszy, Wezel Ostatni) : this()
 {
     this.Wezel1 = Pierwszy;
     this.Wezel2 = Ostatni;
     this.wezel1 = Pierwszy.idWezla;
     this.wezel2 = Ostatni.idWezla;
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Czy ścieżka z w1 do w2 prowadzi bezpośrednio do w2, czy są tam jeszcze jakieś węzły?
 /// </summary>
 /// <param name="w1"></param>
 /// <param name="w2"></param>
 /// <returns></returns>
 public bool saBliskimiSasiadami(Wezel w1, Wezel w2)
 {
     if (tablicaKierowaniaWezlami[w1.idWezla - 1, w2.idWezla - 1] == w2)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Ejemplo n.º 4
0
 public void usunWezel(Wezel w)
 {
     try
     {
         this.wezly.Remove(w);
         this.liczbaWezlow--;
     }
     catch (Exception e)
     {
         Console.WriteLine("Failed to delete the node.");
     }
 }
Ejemplo n.º 5
0
 public Wezel()
 {
     identyfikatorWezla = 0;
     wspolrzednaX       = 0;
     wspolrzednaY       = 0;
     doMniePrzez        = null;
     etykieta           = 0;
     odwiedzony         = false;
     ip = "";
     doprowadzoneKrawedzie = new List <Lacze>();
     SNPP = new SubNetworkPointPool(new SubNetworkPoint(IPAddress.Any));
     //eonTable = new EONTable();
 }
Ejemplo n.º 6
0
        /// <summary>
        /// Wyznacza sciezke z Skad do Dokad o pasmie band i czestotliwosci frequency. Wpisuje band i frequency!
        /// </summary>
        /// <param name="Skad"></param>
        /// <param name="Dokad"></param>
        /// <param name="band"></param>
        /// <param name="frequency"></param>
        /// <param name="network">Sieć, zawierająca tablice kierowania węzłami, łączami, kosztów.</param>
        /// <returns></returns>
        public List <Lacze> wyznaczSciezke(Wezel Skad, Wezel Dokad, short band, short frequency, Siec network)
        {
            var path = wyznaczSciezke(Skad, Dokad, network.zwrocTabliceKierowaniaLaczami,
                                      network.zwrocTabliceKierowaniaWezlami,
                                      ref network.wezly, band, network.Koszty, frequency);

            //Wpisanie wartosci czetotliwosci i pasma do sciezki
            if (path != null && path.Count != 0)
            {
                this.band      = band;
                this.frequency = frequency;
            }

            return(path);
        }
Ejemplo n.º 7
0
 /// <summary>
 /// Konstruktor kopiujący
 /// </summary>
 /// <param name="siec"></param>
 public Siec(Siec siec)
 {
     this.liczbaWezlow             = siec.liczbaWezlow;
     this.liczbaLaczy              = siec.liczbaLaczy;
     this.liczbaKabli              = siec.liczbaKabli;
     this.algorytm                 = siec.algorytm;
     this.centrala                 = siec.centrala;
     wezly                         = new List <Wezel>(siec.wezly);
     krawedzie                     = new List <Lacze>(siec.krawedzie);
     sciezki                       = new List <Sciezka>(siec.sciezki);
     tablicaMST                    = new List <int>(siec.tablicaMST);
     this.tablicaKierowaniaWezlami = siec.tablicaKierowaniaWezlami;
     this.tablicaKierowaniaLaczami = siec.tablicaKierowaniaLaczami;
     this.tablicaKosztow           = siec.tablicaKosztow;
     this.suma                     = siec.suma;
     this.usunieteKrawedzie        = new List <Lacze>(siec.usunieteKrawedzie);
     this.brakPowodzenia           = siec.brakPowodzenia;
     ustawPoczatkoweKoszty         = siec.ustawPoczatkoweKoszty;
 }
Ejemplo n.º 8
0
        public void pokazSciezke()
        {
            int   i    = 0;
            Wezel temp = new Wezel();

            if (ListaKrawedziSciezki.Count == 0)
            {
                Console.WriteLine("Sciezka jest pusta.");
            }
            else
            {
                temp = ListaWezlowSciezki[ListaWezlowSciezki.Count - 1];
                Console.WriteLine($"Sciezka z wezla nr {ListaWezlowSciezki[0].idWezla} do wezla nr {temp.idWezla}");
                while (ListaKrawedziSciezki.ElementAtOrDefault(i) != null)
                {
                    Console.WriteLine($"Od wezla : {ListaWezlowSciezki[i].idWezla}");
                    Console.WriteLine($"przejdz krawedzia: {ListaKrawedziSciezki[i].idKrawedzi}");
                    i++;
                }
                Console.WriteLine("Jestes na miejscu!");
            }
        }
Ejemplo n.º 9
0
 /// <summary>
 /// Znajduje najblizsy wezel prowadzacy do danego wezla
 /// </summary>
 /// <param name="skad"></param>
 /// <param name="dokad"></param>
 /// <returns></returns>
 public Wezel znajdzNajblizszegoSasiadaProwadzocegoDo(Wezel skad, Wezel dokad)
 {
     try
     {
         if (tablicaKierowaniaWezlami[skad.idWezla - 1, dokad.idWezla - 1] == dokad)
         {
             return(dokad);
         }
         else if (skad != null)
         {
             return(znajdzNajblizszegoSasiadaProwadzocegoDo(skad,
                                                            tablicaKierowaniaWezlami[skad.idWezla - 1, dokad.idWezla - 1]));
         }
         else
         {
             return(null);
         }
     }
     catch (Exception E)
     {
         return(null);
     }
 }
Ejemplo n.º 10
0
 public List <Lacze> wyznaczSciezke(Wezel Skad, Wezel Dokad, Lacze[,] tablicaKierowaniaLaczami,
                                    Wezel[,] tablicaKierowaniaWezlami, ref List <Wezel> listaWezlow, short band, float[,] tablicaKosztow)
 {
     return(this.wyznaczSciezke(Skad, Dokad, tablicaKierowaniaLaczami, tablicaKierowaniaWezlami, ref listaWezlow,
                                band, tablicaKosztow, 0));
 }
Ejemplo n.º 11
0
        /// <summary>
        /// Nie wpisuje wartosci czestotliwosci i pasma do sciezki!
        /// </summary>
        /// <param name="Skad"></param>
        /// <param name="Dokad"></param>
        /// <param name="tablicaKierowaniaLaczami"></param>
        /// <param name="tablicaKierowaniaWezlami"></param>
        /// <param name="listaWezlow"></param>
        /// <param name="band"></param>
        /// <param name="tablicaKosztow"></param>
        /// <param name="frequency"></param>
        /// <returns></returns>
        public List <Lacze> wyznaczSciezke(Wezel Skad, Wezel Dokad, Lacze[,] tablicaKierowaniaLaczami,
                                           Wezel[,] tablicaKierowaniaWezlami, ref List <Wezel> listaWezlow, short band, float[,] tablicaKosztow, short frequency)
        {
            try
            {
                //Jedno wywolanie wiecej
                wywolaniaWyznaczSciezke += 1;

                //zwracana lista
                List <Lacze> tempList = new List <Lacze>();

                //indeksy wezlow
                int w1, w2;

                //Odnalezienie indeksow
                w1 = listaWezlow.FindIndex(x => x.ip == Skad.ip);
                w2 = listaWezlow.FindIndex(x => x.ip == Dokad.ip);

                //Zabezpieczenie przed nieskonczonym wywolywaniem sie tej samej funkcji. Po 200 wywolaniach tej funkcji wychodzimy.
                if (wywolaniaWyznaczSciezke < 200)
                {
                    if (tablicaKierowaniaWezlami.Length > 0 && tablicaKierowaniaWezlami[w1, w2] != null)
                    {
                        if (tablicaKierowaniaWezlami[w1, w2] == Dokad)
                        {
                            var cost = tablicaKosztow[w1, w2];

                            //Odnalezienie, jakim łączem idzie ścieżka
                            var link = tablicaKierowaniaLaczami[w1, w2];

                            //Odnalezienie SNP wejściowego łącza
                            SubNetworkPoint snpSkad = Skad.SNPP.snps.Find(x => x.portOUT == link.idKrawedzi);

                            //Odnalezienie SNP wyjsciowego łącza
                            SubNetworkPoint snpDokad = Dokad.SNPP.snps.Find(x => x.portIN == link.idKrawedzi);

                            //Gdy pasmo jest wolne na danej czestotliwosci
                            if (cost <= (EONTable.capacity - band) * (EONTable.capacity - band) &&
                                snpSkad.eonTable.CheckAvailability(frequency, band, "out") &&
                                snpDokad.eonTable.CheckAvailability(frequency, band, "in"))
                            {
                                tempList.Add(tablicaKierowaniaLaczami[w1, w2]);
                            }
                            else
                            {
                                return(null);
                            }
                            //TODO
                        }
                        else
                        {
                            //Dodajemy sciezke z Skad do punktu posredniego, wskazanego przez tablice kierowania Wezlami
                            var path = wyznaczSciezke(Skad, tablicaKierowaniaWezlami[w1, w2],
                                                      tablicaKierowaniaLaczami, tablicaKierowaniaWezlami, ref listaWezlow, band,
                                                      tablicaKosztow, frequency);
                            if (path != null)
                            {
                                tempList.AddRange(path);
                            }
                            else
                            {
                                return(null);
                            }
                            //TODO:Tutaj wyskakuje nullpointerexception, ze nie mozna dodac AddRangem nulla.
                            //TODO:A funkcja zwraca null, gdy probuje wyznaczyc sciezke od wezla 6 do 6 zdaje sie.
                            //Potem doklejamy drugi koniec listy, liste krawedzi z posredniego do koncowego
                            path = wyznaczSciezke(tablicaKierowaniaWezlami[w1, w2],
                                                  Dokad, tablicaKierowaniaLaczami, tablicaKierowaniaWezlami, ref listaWezlow, band,
                                                  tablicaKosztow, frequency);
                            if (path != null)
                            {
                                tempList.AddRange(path);
                            }
                            else
                            {
                                return(null);
                            }
                        }
                        //Kopiowanie listy krawedzi sciezki
                        ListaKrawedziSciezki = new List <Lacze>(tempList);

                        if (ListaKrawedziSciezki.Count != 0)
                        {
                            //wyzerowanie wezlow sciezki
                            WezlySciezki = new List <Wezel>();

                            //Wyznaczenie wezlow sciezki
                            wyznaczWezly(ListaKrawedziSciezki[0].Wezel1);
                        }

                        wywolaniaWyznaczSciezke--;
                        return(tempList);
                    }
                }
                else
                {
                    wywolaniaWyznaczSciezke--;
                }
                return(new List <Lacze>());
            }
            catch (Exception E)
            {
                wywolaniaWyznaczSciezke--;
                return(new List <Lacze>());
            }
        }
Ejemplo n.º 12
0
        public Lacze(int _identyfikatorKrawedzi, Wezel _WezelPierwszy, Wezel _WezelDrugi, short band, short frequency)
        {
            this.identyfikatorKrawedzi = _identyfikatorKrawedzi;
            this.WezelPierwszy         = _WezelPierwszy;
            this.WezelDrugi            = _WezelDrugi;
            this.wezelpierwszy         = _WezelPierwszy.idWezla;
            this.wezeldrugi            = _WezelDrugi.idWezla;

            int SNP1Index, SNP2Index;

            if (Wezel1.SNPP.snps[0].portOUT == -1)
            {
                SNP1Index = 0;
                Wezel1.SNPP.snps[0].portOUT = _identyfikatorKrawedzi;
            }

            else
            {
                //Odnalezienie węzła z dołączonym interfejsem
                SNP1Index = this.Wezel1.SNPP.snps.FindIndex(x => x.portOUT == _identyfikatorKrawedzi);
            }

            if (Wezel2.SNPP.snps[0].portIN == -1)
            {
                SNP2Index = 0;
                Wezel2.SNPP.snps[0].portIN = _identyfikatorKrawedzi;
            }

            else
            {
                //Odnalezienie węzła z dołączonym interfejsem
                SNP2Index = this.Wezel2.SNPP.snps.FindIndex(x => x.portIN == _identyfikatorKrawedzi);
            }

            //Jeżeli węzeł nie ma doprowadzonego takiego łącza
            if (SNP1Index == -1)
            {
                //TODO: Zmien konstruktor SubNetworkPointa!
                //Dodanie nowego interfejsu do wezla 1
                Wezel1.SNPP.snps.Add(new SubNetworkPoint(IPAddress.Parse(Wezel1.ip), -1, _identyfikatorKrawedzi));
                SNP1Index = Wezel1.SNPP.snps.Count - 1;
            }

            //Jeżeli węzeł nie ma doprowadzonego takiego łącza
            if (SNP2Index == -1)
            {
                //Dodanie nowego interfejsu do wezla 2
                Wezel2.SNPP.snps.Add(new SubNetworkPoint(IPAddress.Parse(Wezel2.ip), _identyfikatorKrawedzi, -1));
                SNP2Index = Wezel2.SNPP.snps.Count - 1;
            }

            if (band <= EONTable.capacity)
            {
                //Na wyjsciu wezla 1
                this.Wezel1.SNPP.snps[SNP1Index].eonTable.addRow(new EONTableRowOut(frequency, band));
                //Na wejsciu wezla 2
                this.Wezel2.SNPP.snps[SNP2Index].eonTable.addRow(new EONTableRowIN(frequency, band));

                this.waga = (float)Math.Pow(band, 2);
            }
        }
Ejemplo n.º 13
0
        public Lacze(int _identyfikatorKrawedzi, Wezel _WezelPierwszy, Wezel _WezelDrugi, int waga)
        {
            this.identyfikatorKrawedzi = _identyfikatorKrawedzi;
            this.WezelPierwszy         = _WezelPierwszy;
            this.WezelDrugi            = _WezelDrugi;
            this.wezelpierwszy         = _WezelPierwszy.idWezla;
            this.wezeldrugi            = _WezelDrugi.idWezla;

            short band = (short)(EONTable.capacity - Math.Sqrt(waga));

            int SNP1Index, SNP2Index;

            if (Wezel1.SNPP.snps[0].portOUT == -1)
            {
                SNP1Index = 0;
                Wezel1.SNPP.snps[0].portOUT = _identyfikatorKrawedzi;
            }

            else
            {
                //Odnalezienie węzła z dołączonym interfejsem
                SNP1Index = this.Wezel1.SNPP.snps.FindIndex(x => x.portOUT == _identyfikatorKrawedzi);
            }

            if (Wezel2.SNPP.snps[0].portIN == -1)
            {
                SNP2Index = 0;
                Wezel2.SNPP.snps[0].portIN = _identyfikatorKrawedzi;
            }
            else
            {
                //Odnalezienie węzła z dołączonym interfejsem
                SNP2Index = this.Wezel2.SNPP.snps.FindIndex(x => x.portIN == _identyfikatorKrawedzi);
            }

            //Jeżeli węzeł nie ma doprowadzonego takiego łącza
            if (SNP1Index == -1)
            {
                //Dodanie nowego interfejsu do wezla 1
                Wezel1.SNPP.snps.Add(new SubNetworkPoint(IPAddress.Parse(Wezel1.ip), -1, identyfikatorKrawedzi));
                SNP1Index = Wezel1.SNPP.snps.Count - 1;
            }

            //Jeżeli węzeł nie ma doprowadzonego takiego łącza
            if (SNP2Index == -1)
            {
                //Dodanie nowego interfejsu do wezla 2
                Wezel2.SNPP.snps.Add(new SubNetworkPoint(IPAddress.Parse(Wezel2.ip), identyfikatorKrawedzi, -1));
                SNP2Index = Wezel2.SNPP.snps.Count - 1;
            }

            if (EONTable.capacity >= Math.Sqrt(this.Waga))
            {
                //Na wyjsciu wezla 1
                this.Wezel1.SNPP.snps[SNP1Index].eonTable
                .addRow(new EONTableRowOut(0, (short)(EONTable.capacity - band)));
                //Na wejsciu wezla 2
                this.Wezel2.SNPP.snps[SNP2Index].eonTable
                .addRow(new EONTableRowIN(0, (short)(EONTable.capacity - band)));

                this.waga = waga;
            }
        }
Ejemplo n.º 14
0
 /// <summary>
 /// Konstruktor Lacza bez zajtego pasma
 /// </summary>
 /// <param name="_identyfikatorKrawedzi"></param>
 /// <param name="_WezelPierwszy"></param>
 /// <param name="_WezelDrugi"></param>
 public Lacze(int _identyfikatorKrawedzi, Wezel _WezelPierwszy, Wezel _WezelDrugi)
     : this(_identyfikatorKrawedzi, _WezelPierwszy, _WezelDrugi, 0, 0)
 {
 }
Ejemplo n.º 15
0
        public int algorytmDijkstry()
        {
            int          liczbaOdwiedzonychWezlow = 0;
            int          INF            = int.MaxValue;
            int          najtanszyWezel = 0;
            int          koniec;
            int          k = 0;
            int          nieDolaczoneWezly = 0;
            Wezel        pomocniczy        = new Wezel();
            List <Wezel> wezlyDijktry      = new List <Wezel>(wezly);

            for (int i = 0; i < wezly.Count; i++)
            {
                wezly[i].Odwiedzony = false;
            }

            for (int i = 0; i < wezly.Count; i++)
            {
                if (wezly[i].listaKrawedzi.Count == 0)
                {
                    nieDolaczoneWezly++;
                }
            }

            /*
             * Dla potrzeb algorytmu dodalem w kasie Wezel trzy 2 nowe zmienne i liste przechowujaca indeksy krawedzi, ktore sa doprowadzone do konkretnego Wezla.
             * Dwie zmienne to : etykieta, czyli najtanszy koszt dotarcia do wierzcholka oraz zmienna dzieki ktorej wiem przez ktory wierzcholek nalezy do tego punktu isc.
             * Pierwszy wierzcholek sciezki ma etykiete 0 a pozostale na nieskonczonosc, ktora zdefiniowalem jako 1000.
             */
            for (int i = 0; i < wezly.Count; i++)
            {
                wezly[i].Etykieta = INF;
            }
            sciezki[0].Wezel1.Etykieta = 0;

            do
            {
                koniec = 0;
                //wybieram pierwszy dowolny wezel, ktory posluzy mi jako odnosnik do wyszukiwania najkorzystniejszego wezla.
                do
                {
                    if (wezly[k].Odwiedzony == false)
                    {
                        najtanszyWezel = k;
                        koniec         = 1;
                    }
                    k++;
                } while (koniec == 0);

                //Poszukiwanie najtanszego
                for (int i = liczbaOdwiedzonychWezlow; i < wezly.Count; i++)
                {
                    if (wezly[i].Odwiedzony == false)
                    {
                        if (wezly[i].Etykieta < wezly[najtanszyWezel].Etykieta)
                        {
                            najtanszyWezel = i;
                        }
                    }
                }
                //Tu wykorzystuje liste ktora stworzylem w klasie wezel po to, aby nie szukac wsrod wszystkich krawedzi. Wiem z gory ktore krawedzie musze przegladnac.
                //Wiem jakich mam sasiadow
                foreach (Lacze krawedz in wezly[najtanszyWezel].listaKrawedzi)
                {
                    //Jezeli wybrany jest najtanszy wezel to sprawdzam, ktory jest to wezel w krawedzi. WezelPierwszy, czy WezelDrugi
                    if (wezly[najtanszyWezel].idWezla == krawedz.Wezel1.idWezla)
                    {
                        //Jezeli ten sasiad byl juz przegladany to nie bedzie dla niego lepszego polonczenia, jest "skreslony"
                        if (krawedz.Wezel2.Odwiedzony == false)
                        {
                            if (krawedz.Wezel2.Etykieta > (krawedz.Waga + krawedz.Wezel1.Etykieta))
                            {
                                krawedz.Wezel2.Etykieta = krawedz.Waga + krawedz.Wezel1.Etykieta;
                                //Jezeli to polonczenie okazuje sie byc najkorzystniejsze to zmieniam Wezel przez ktory droga jest najtansza
                                krawedz.Wezel2.NajlepiejPrzez = wezly[najtanszyWezel];
                                // temp = krawedz.idKrawedzi;
                            }
                        }
                    }
                    else
                    {
                        if (krawedz.Wezel1.Odwiedzony == false)
                        {
                            if (krawedz.Wezel1.Etykieta > (krawedz.Waga + krawedz.Wezel2.Etykieta))
                            {
                                krawedz.Wezel1.Etykieta       = krawedz.Waga + krawedz.Wezel2.Etykieta;
                                krawedz.Wezel1.NajlepiejPrzez = wezly[najtanszyWezel];
                            }
                        }
                    }
                }

                wezly[najtanszyWezel].Odwiedzony = true;
                //tablicaMST.Add(temp);

                // Przejmuje referencje do obiektu, usuwam najkorzystniejszy wezel z jego miejsca w liscie i umieszczam na miejscach, gdzie nie bede juz sprawdzal
                //Pętle for beze zaczynal dla i= liczbieOdwiedzonychWezlow czyli petla ich już nie obejmuje, czyli petla krazy mniejszą ilosc razy.
                if (najtanszyWezel != liczbaOdwiedzonychWezlow)
                {
                    pomocniczy = wezly[najtanszyWezel];
                    //usuwanie z listy
                    wezly.RemoveAt(najtanszyWezel);
                    //dodawanie do listy na miejscu wskazanym
                    wezly.Insert(liczbaOdwiedzonychWezlow, pomocniczy);
                }

                liczbaOdwiedzonychWezlow++;
            } while ((liczbaOdwiedzonychWezlow + nieDolaczoneWezly) != (wezly.Count - 1));

            //Tutaj sprawdzalem czy wypisuje jak trzeba sciezke

            Wezel zmienna1 = sciezki[0].Wezel2;
            Wezel zmienna  = sciezki[0].Wezel2.NajlepiejPrzez;

            try
            {
                do
                {
                    for (int i = 0; i < liczbaLaczy; i++)
                    {
                        if ((krawedzie[i].Wezel1.idWezla == zmienna1.idWezla && krawedzie[i].Wezel2.idWezla == zmienna.idWezla) || (krawedzie[i].Wezel2.idWezla == zmienna1.idWezla && krawedzie[i].Wezel1.idWezla == zmienna.idWezla))
                        {
                            tablicaMST.Add(krawedzie[i].idKrawedzi);
                        }
                    }
                    zmienna1 = zmienna;
                    zmienna  = zmienna.NajlepiejPrzez;
                } while (zmienna1 != sciezki[0].Wezel1);
            }
            catch
            {
            }
            //Lacze result = krawedzie.Find(x => x.Wezel1.idWezla == sciezki[0].Wezel2.idWezla , x => x.Wezel2.idWezla == zmienna.idWezla);

            /* while (zmienna.NajlepiejPrzez != sciezki[0].Wezel1)
             * {
             *   zmienna = zmienna.NajlepiejPrzez;
             *       Console.WriteLine(zmienna.idWezla);
             * }
             * Console.WriteLine(sciezki[0].Wezel1.idWezla);*/


            return(0);
        }
Ejemplo n.º 16
0
 public void dodajWezel(Wezel w)
 {
     this.wezly.Add(w);
     this.liczbaWezlow++;
 }