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; * } */ }
public Sciezka(Wezel Pierwszy, Wezel Ostatni) : this() { this.Wezel1 = Pierwszy; this.Wezel2 = Ostatni; this.wezel1 = Pierwszy.idWezla; this.wezel2 = Ostatni.idWezla; }
/// <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); } }
public void usunWezel(Wezel w) { try { this.wezly.Remove(w); this.liczbaWezlow--; } catch (Exception e) { Console.WriteLine("Failed to delete the node."); } }
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(); }
/// <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); }
/// <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; }
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!"); } }
/// <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); } }
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)); }
/// <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>()); } }
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); } }
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; } }
/// <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) { }
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); }
public void dodajWezel(Wezel w) { this.wezly.Add(w); this.liczbaWezlow++; }