Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 4
0
        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);
            }
        }