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(); }
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; }