예제 #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);
            }
        }
예제 #2
0
        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);
            }
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #7
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);
            }
        }
예제 #9
0
 public Wierzcholek(T wartosc, Wierzcholek <T> rodzic = null)
 {
     this.wartosc = wartosc;
     this.rodzic  = rodzic;
     dzieci       = new List <Wierzcholek <T> >();
 }
예제 #10
0
 public void DodajKorzen(T wartosc)
 {
     korzen = new Wierzcholek <T>(wartosc);
 }
예제 #11
0
 // konstruktor
 public Krawedz(Wierzcholek cel, double waga)
 {
     this.cel  = cel;
     this.waga = waga;
 }