// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // METHODEN // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ private void Setup() { // Alle Vertices erstellen foreach (Strecke S in Strecken) { // Vertex nur hinzufügen wenn sie nicht schon existiert if (!Vertices.Exists(x => x.Pos == S.A)) { Vertices.Add(new DijkstraVertex() { Pos = S.A }); } if (!Vertices.Exists(x => x.Pos == S.B)) { Vertices.Add(new DijkstraVertex() { Pos = S.B }); } } // Nachbarn setzen foreach (DijkstraVertex V in Vertices) { List <DijkstraVertex> Nachbarn = new List <DijkstraVertex>(); List <double> NachbarWerte = new List <double>(); // Strecken finden die mit diesem Knoten verbunden sind (Am Punkt A) List <Strecke> NachbarStreckenA = Strecken.FindAll(x => x.A == V.Pos); foreach (Strecke S in NachbarStreckenA) { // Nachbarknoten setzen Nachbarn.Add(Vertices.Find(x => x.Pos == S.B)); // Weg zu Nachbarknoten setzen NachbarWerte.Add(S.Betrag()); } // Strecken finden die mit diesem Knoten verbunden sind (Am Punkt B) List <Strecke> NachbarStreckenB = Strecken.FindAll(x => x.B == V.Pos); foreach (Strecke S in NachbarStreckenB) { // Nachbarknoten setzen Nachbarn.Add(Vertices.Find(x => x.Pos == S.A)); // Weg zu Nachbarknoten setzen NachbarWerte.Add(S.Betrag()); } // Listen setzen V.Nachbarn = Nachbarn; V.NachbarWerte = NachbarWerte; } // Start- und Endvertex bestimmen Startvertex = Vertices.Find(x => x.Pos == Startpunkt); Endvertex = Vertices.Find(x => x.Pos == Endpunkt); }
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ private DijkstraVertex VertexMitGeringsterDistanz(List <DijkstraVertex> Q) { DijkstraVertex BesteVertex = null; foreach (DijkstraVertex V in Q) { if (BesteVertex == null || V.Distanz < BesteVertex.Distanz) { BesteVertex = V; } } return(BesteVertex); }
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public DijkstraVertex[] Berechnung() { // Q - Alle unbesuchten Vertices List <DijkstraVertex> Q = new List <DijkstraVertex>(); // Vertx Startwerte setzen foreach (DijkstraVertex V in Vertices) { V.Distanz = double.PositiveInfinity; V.Vorgaenger = null; // Alle zu Q hinzufügen Q.Add(V); } Startvertex.Distanz = 0; while (Q.Count > 0) { // Nächste Vertex DijkstraVertex U = VertexMitGeringsterDistanz(Q); // Als besucht markieren Q.Remove(U); // Abbruchbedingung if (U == Endvertex) { Berchnung_SchnellsterWeg(); return(Sequenz.ToArray()); } // Nachbarwerte setzen foreach (DijkstraVertex V in U.Nachbarn) { double Alt = U.Distanz + U.WegZu(V); if (Alt < V.Distanz) { V.Distanz = Alt; V.Vorgaenger = U; } } } return(null); }
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ private void Berchnung_SchnellsterWeg() { List <DijkstraVertex> S = new List <DijkstraVertex>(); DijkstraVertex U = Endvertex; if (U.Vorgaenger != null || U == Startvertex) { while (U != null) { S.Add(U); U = U.Vorgaenger; } } S.Reverse(); Sequenz = S; }
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // METHODEN // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public double WegZu(DijkstraVertex _Nachbar) { int Index = Nachbarn.FindIndex(x => x == _Nachbar); return(NachbarWerte[Index]); }