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> ZnajdzTrase(Graf.Graf <TimeSpan> graf) { foreach (var trasa in obliczoneTrasy) { if (trasa[0] == przystanekPoczatkowy && trasa[trasa.Count - 1] == przystanekKoncowy) { return(trasa); } } return(ZnajdzNajkrotszaTrase(graf)); }
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); }
public TrasaPasazera ZnajdzTrase(Graf.Graf <TimeSpan> graf, TimeSpan czasUtworzenia) { UsunPrzedawnioneTrasy(czasUtworzenia); foreach (var trasa in obliczoneTrasy) { if (trasa.PrzystanekStartowy == przystanekPoczatkowy && trasa.PrzystanekKoncowy == przystanekKoncowy) { return(trasa); } } return(ZnajdzNajkrotszaTrase(graf, czasUtworzenia)); }
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 PasazerWygodnicki(int czasWsiadania, int czasWysiadania, Przystanek przystanekPoczatkowy, Przystanek przystanekKoncowy, Graf.Graf <byte> graf, TimeSpan czasOstatniegoStworzeniaTrasy) : base(czasWsiadania, czasWysiadania, przystanekPoczatkowy, przystanekKoncowy, czasOstatniegoStworzeniaTrasy) { this.graf = graf; var temp = CzyTrasaObliczona(przystanekPoczatkowy, przystanekKoncowy); if (temp == null) { trasaPasazera = ZnajdzTrase(graf); if (trasaPasazera != null) { obliczoneTrasy.Add(trasaPasazera); } this.czasOstatniegoStworzeniaTrasy = czasOstatniegoStworzeniaTrasy; } else { trasaPasazera = new TrasaPasazera(temp, temp.CzasWaznosci); } }
public PrymitywnyPasazerDijkstry(int czasWsiadania, int czasWysiadania, Przystanek przystanekPoczatkowy, Przystanek przystanekKoncowy, Graf.Graf <TimeSpan> graf) : base(czasWsiadania, czasWysiadania, przystanekPoczatkowy, przystanekKoncowy) { this.graf = graf; trasaPasazera = ZnajdzTrase(graf); graf.ZresetujGraf(TimeSpan.MaxValue); if (trasaPasazera.Count > 1) { przystanekPoczatkowy = trasaPasazera[0]; przystanekKoncowy = trasaPasazera[trasaPasazera.Count - 1]; obecnyPrzystanek = przystanekPoczatkowy; } UsunPierwszyElementTrasy(); // Usuwanie pierwszego elementu dla ulatwienia implementacji logiki porozy. }