Ejemplo n.º 1
0
        private void buttonOK_Click(object sender, EventArgs e)
        {
            Automobil = new Auto();
            Automobil.HranaPoloha = comboBoxSilnice.Items[comboBoxSilnice.SelectedIndex] as CestyGraf.Hrana;
            Automobil.VzdalenostOdV1 = hScrollBarPozice.Value;
            Automobil.VzdalenostOdV2 = hScrollBarPozice.Maximum - hScrollBarPozice.Value;

            this.DialogResult = System.Windows.Forms.DialogResult.OK;
            Close();
        }
Ejemplo n.º 2
0
        public static LinkedList<CestyGraf.Hrana> doDijkstra(CestyGraf graf, Auto startPozice, CestyGraf.Hrana cil)
        {
            int pocetProhledanych = 0;
            Stopwatch stopky = new Stopwatch();
            stopky.Start();
            double vzdalenost = 0; ;
            LinkedList<CestyGraf.Hrana> cilovaCesta = new LinkedList<CestyGraf.Hrana>();
            DVrchol cilPosledni = new DVrchol();

            PriorityQueue<double, DVrchol, CestyGraf.IBod> otevrene = new PriorityQueue<double, DVrchol, CestyGraf.IBod>(graf.CountVrcholy());
            Dictionary<CestyGraf.IBod, DVrchol> uzavrene = new Dictionary<CestyGraf.IBod, DVrchol>(graf.CountVrcholy());

            DVrchol zkoumany = new DVrchol();
            otevrene.Enqueue(startPozice.VzdalenostOdV1, new DVrchol(startPozice.HranaPoloha.Vrchol1 as CestyGraf.Vrchol, null, startPozice.HranaPoloha, startPozice.VzdalenostOdV1), startPozice.HranaPoloha.Vrchol1.Souradnice);
            otevrene.Enqueue(startPozice.VzdalenostOdV2, new DVrchol(startPozice.HranaPoloha.Vrchol2 as CestyGraf.Vrchol, null, startPozice.HranaPoloha, startPozice.VzdalenostOdV2), startPozice.HranaPoloha.Vrchol2.Souradnice);

            while (otevrene.Count != 0) {
                zkoumany = otevrene.Dequeue().Value;
                if (uzavrene.ContainsKey(zkoumany.Data.Souradnice)) {
                    if (uzavrene[zkoumany.Data.Souradnice].MetrikaOdStartu < zkoumany.MetrikaOdStartu) {
                        // zahození horší cesty (zlepšilo o několik % procházení - méně procházených cest)
                        continue;
                    } else { // pokud by náhodou nastalo, odebrat starý vrchol (kvůli jedinečnosti): O(1)
                        uzavrene.Remove(zkoumany.Data.Souradnice);
                    }
                }
                uzavrene.Add(zkoumany.Data.Souradnice, zkoumany);

                if (zkoumany.Data == cil.Vrchol1 || zkoumany.Data == cil.Vrchol2) { // je nalezen cíl
                    if (cilPosledni.Data != null) {
                        if (cilPosledni.MetrikaOdStartu > zkoumany.MetrikaOdStartu) {
                            cilPosledni = zkoumany; // nebude pouze ukazatel, který se neustále mění?
                            Debug.WriteLine("Další výskyt: " + cilPosledni.MetrikaOdStartu + ", vrchol: " + cilPosledni.Data.Data);
                        } else {
                            Debug.WriteLine("Nepoužitý výskyt: " + zkoumany.MetrikaOdStartu + ", vrchol: " + zkoumany.Data.Data);
                        }
                    } else {
                        cilPosledni = zkoumany;
                        Debug.WriteLine("První výskyt: " + cilPosledni.MetrikaOdStartu + ", vrchol: " + cilPosledni.Data.Data);
                        //break; // pokud chceme ukončit po nalezení prvního vrcholu
                    }
                }

                foreach (CestyGraf.Hrana item in zkoumany.Data.DejHrany()) { // z zkoum. pro každou hranu přidat do otevřených koncový bod
                    if (!item.Sjizdna) {
                        continue;
                    }
                    pocetProhledanych++;
                    DVrchol v1 = new DVrchol(item.Vrchol1 as CestyGraf.Vrchol, zkoumany, item, zkoumany.MetrikaOdStartu + item.Metrika);
                    DVrchol v2 = new DVrchol(item.Vrchol2 as CestyGraf.Vrchol, zkoumany, item, zkoumany.MetrikaOdStartu + item.Metrika);

                    if (zkoumany.Data.Equals(item.Vrchol1)) {
                        otevrene.Enqueue(v2.MetrikaOdStartu, v2, v2.Data.Souradnice);
                    } else {
                        otevrene.Enqueue(v1.MetrikaOdStartu, v1, v1.Data.Souradnice);
                    }
                }
            }
            Debug.WriteLine("Poslední výskyt: " + cilPosledni.MetrikaOdStartu + ", vrchol: " + cilPosledni.Data.Data);
            while (cilPosledni.Predchudce != null) {
                vzdalenost += cilPosledni.SilniceDoPredchudce.Metrika;
                cilovaCesta.AddFirst(cilPosledni.SilniceDoPredchudce);
                cilPosledni = cilPosledni.Predchudce;
            }
            CestyGraf.Hrana hrStart = new CestyGraf.Hrana(null, startPozice.DejPolohu(), cilPosledni.Data, 0, true);

            cilovaCesta.AddFirst(hrStart);
            stopky.Stop();
            Debug.WriteLine("Milisekund: " + stopky.ElapsedMilliseconds + ", Tiků: " + stopky.ElapsedTicks + ", Prohledaných stavů celkem: " + pocetProhledanych);
            return cilovaCesta;
        }