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> 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);
        }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 6
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);
            }
        }
Ejemplo n.º 8
0
        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.
        }