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); } }
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 List <Przystanek> ZnajdzNajkrotszaTrase(Graf.Graf <TimeSpan> graf) { var wStartowy = graf.ZnajdzWierzcholekZawierajacyPrzystanek(przystanekPoczatkowy); wStartowy.waga = TimeSpan.Zero; AlgorytmDijkstry(graf.OdwiedzNajmniejszy(), graf); var wierzcholekKoncowy = graf.WynikAlgorytmuDijkstry(); var rezultat = KonwertujWynikAlgorytmuNaTrase(wierzcholekKoncowy); graf.ZresetujGraf(TimeSpan.MaxValue); return(rezultat); }
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); } }