protected void AlgorytmDijkstry(Wierzcholek <byte> wierzcholek, Graf.Graf <byte> graf, byte iloscPrzesiadek, Linia linia) { Linia liniaWynikowa = null; var min = byte.MaxValue; if (wierzcholek.przystanek != przystanekKoncowy) { foreach (var k in wierzcholek.krawedzie) { if (k.wierzcholekKoncowy.czyOdwiedzony) { continue; } liniaWynikowa = k.wierzcholekStartowy.przystanek.ZnajdzLinieDoPrzystanku(k.wierzcholekKoncowy.przystanek); k.wierzcholekKoncowy.waga = liniaWynikowa == linia ? iloscPrzesiadek : ++iloscPrzesiadek; if (iloscPrzesiadek < min) { min = iloscPrzesiadek; } k.wierzcholekKoncowy.elementTrasy = new ElementTrasy(liniaWynikowa, TimeSpan.Zero, TimeSpan.Zero, k.wierzcholekKoncowy.przystanek); k.wierzcholekKoncowy.poprzedniWierzcholek = wierzcholek; } AlgorytmDijkstry(graf.OdwiedzNajmniejszy(), graf, min, liniaWynikowa); } }
public virtual List <ElementTrasy> KonwertujWynikAlgorytmuNaTrase(Wierzcholek <byte> wKoncowy) { var rezultat = new List <ElementTrasy>(); for (var w1 = wKoncowy; w1.poprzedniWierzcholek != null; w1 = w1.poprzedniWierzcholek) { rezultat.Insert(0, w1.elementTrasy); if (w1.poprzedniWierzcholek.elementTrasy == null) { try { rezultat.Insert(0, new ElementTrasy(w1.elementTrasy.Linia, w1.poprzedniWierzcholek.przystanek, w1.poprzedniWierzcholek.przystanek.ZwrocPierwszyPrzejazdDanejLinii(w1.elementTrasy.Linia), TimeSpan.Zero)); } catch (TrasaNieZnalezionaWyjatek) { czyPosiadaTrase = false; } break; } } return(rezultat); }
protected void AlgorytmDijkstry(Wierzcholek <ulong> wierzcholek, Graf.Graf <ulong> graf, ulong dystans) { var rezultat = new List <ElementTrasy>(); ulong min = 0; if (wierzcholek.przystanek != przystanekKoncowy) { foreach (var k in wierzcholek.krawedzie) { if (k.wierzcholekKoncowy.czyOdwiedzony) { continue; } var trasa = k.wierzcholekStartowy.przystanek.ZnajdzTraseDoNastepnegoPrzystanku(k.wierzcholekKoncowy .przystanek); k.wierzcholekKoncowy.waga = dystans + (ulong)trasa.DystansTrasy; if (k.wierzcholekKoncowy.waga < min) { min = k.wierzcholekKoncowy.waga; } k.wierzcholekKoncowy.elementTrasy = new ElementTrasy(k.wierzcholekStartowy.przystanek. ZnajdzLinieDoPrzystanku(k.wierzcholekKoncowy.przystanek), TimeSpan.Zero, TimeSpan.Zero, k.wierzcholekKoncowy.przystanek); k.wierzcholekKoncowy.poprzedniWierzcholek = wierzcholek; } AlgorytmDijkstry(graf.OdwiedzNajmniejszy(), graf, min); } }
public static int Dijkstry(int[,] macierz, int startowy) //zwraca sumę najmniejszych odleglosci od danego wierzcholka do wszystkich pozostałych { //przygotowanie macierzy, dla wierzch startowego dist = 0 int iloscW = macierz.GetLength(0); Wierzcholek[] tab = new Wierzcholek[iloscW]; for (int i = 0; i < iloscW; i++) { if (i == startowy) { Wierzcholek w = new Wierzcholek(); w.dist = 0; w.odwiedzony = false; w.prev = -1; tab[i] = w; } else { Wierzcholek w = new Wierzcholek(); w.dist = 21474836; w.odwiedzony = false; w.prev = -1; tab[i] = w; } } //ZACZYNAMY NASZ ALGORYTM :D int u = startowy; //nasze poszukiwania zaczniemy od badań względem wierzch. wskazanego przez uzytkownika. while (u != -1) //pozniej u będzie się zmieniać, gdy wszystkie będą odiwedzone met. pom. "Znajdz Min Dist wypluje -1"; { tab[u].odwiedzony = true; //zapamiętajmy, że już wzgledem niego badalismy for (int i = 0; i < iloscW; i++) { if (macierz[u, i] > 0) //jesli nie ma krawedzi miedzy wierzcholkami to nie ma co szukac, tam bedzie "-1" { if (tab[u].dist + macierz[u, i] < tab[i].dist) //jesli znaleziony dist jest mniejszy od zapamietanego to zamieniamy { { tab[i].dist = tab[u].dist + macierz[u, i]; tab[i].prev = u; } } } } u = ZnajdzMinDist(tab); //teraz bedziemy szukać względem kolejnego wierzchołka - o najmniejszym na razie dystansie } //sumujemy odleglosci int suma = 0; for (int i = 0; i < tab.Length; i++) { suma = suma + tab[i].dist; } return(suma); }
private void DodajElementy(List <T> l, Wierzcholek <T> w) { l.Add(w.Wartosc); foreach (var k in w.Dzieci) { DodajElementy(l, k); } }
private static List <Przystanek> KonwertujWynikAlgorytmuNaTrase(Wierzcholek <TimeSpan> wierzcholekKoncowy) { var trasa = new List <Przystanek>(); Wierzcholek <TimeSpan> w1; for (w1 = wierzcholekKoncowy; w1 != null; w1 = w1.poprzedniWierzcholek) { trasa.Insert(0, w1.przystanek); } return(trasa); }
protected virtual void AlgorytmDijkstry(Wierzcholek <TimeSpan> wierzcholek, Graf.Graf <TimeSpan> graf, TimeSpan czasPoczatkowy) { if (wierzcholek.przystanek != przystanekKoncowy) { TimeSpan minWaga = TimeSpan.Zero; WpisRozkladuJazdy min; foreach (var k in wierzcholek.krawedzie) { if (k.wierzcholekKoncowy.czyOdwiedzony) { continue; } var pozostalePrzejazdy = ZwrocPozostalePrzejazdy(k, czasPoczatkowy); if (!pozostalePrzejazdy.Any()) { throw new TrasaNieZnalezionaWyjatek(); } min = null; minWaga = TimeSpan.MaxValue; foreach (var wrj in pozostalePrzejazdy) { var czasPrzejazdu = wrj.PozostalyCzas(czasPoczatkowy) + wrj.LiniaObslugujaca.CzasPrzejazduPoMiedzyPrzystankami( k.wierzcholekStartowy.przystanek, k.wierzcholekKoncowy.przystanek); if (czasPrzejazdu < minWaga) { min = wrj; minWaga = czasPrzejazdu; } } k.wierzcholekKoncowy.waga = minWaga; k.wierzcholekKoncowy.elementTrasy = new ElementTrasy(min.LiniaObslugujaca, min.PozostalyCzas(czasPoczatkowy), min.LiniaObslugujaca.CzasPrzejazduPoMiedzyPrzystankami(k.wierzcholekKoncowy.przystanek, k.wierzcholekKoncowy.przystanek), k.wierzcholekKoncowy.przystanek); k.wierzcholekKoncowy.poprzedniWierzcholek = wierzcholek; } AlgorytmDijkstry(graf.OdwiedzNajmniejszy(), graf, czasPoczatkowy + minWaga); } }
private void AlgorytmDijkstry(Wierzcholek <TimeSpan> wierzcholek, Graf.Graf <TimeSpan> graf) { if (wierzcholek.przystanek != przystanekKoncowy) { foreach (var krawedz in wierzcholek.krawedzie) { if (krawedz.wierzcholekKoncowy.czyOdwiedzony) { continue; } if (krawedz.wierzcholekKoncowy.waga > wierzcholek.waga + krawedz.spodziewanyCzasPrzejazdu) { krawedz.wierzcholekKoncowy.waga = wierzcholek.waga + krawedz.spodziewanyCzasPrzejazdu; krawedz.wierzcholekKoncowy.poprzedniWierzcholek = wierzcholek; } } AlgorytmDijkstry(graf.OdwiedzNajmniejszy(), graf); } }
public Wierzcholek(T wartosc, Wierzcholek <T> rodzic = null) { this.wartosc = wartosc; this.rodzic = rodzic; dzieci = new List <Wierzcholek <T> >(); }
public void DodajKorzen(T wartosc) { korzen = new Wierzcholek <T>(wartosc); }
// konstruktor public Krawedz(Wierzcholek cel, double waga) { this.cel = cel; this.waga = waga; }