CodeGym /Kurse /Python SELF DE /Algorithmen zur Suche nach dem kürzesten Weg

Algorithmen zur Suche nach dem kürzesten Weg

Python SELF DE
Level 56 , Lektion 3
Verfügbar

9.1 Prinzipien des Dijkstra-Algorithmus

Der Dijkstra-Algorithmus ist ein Algorithmus, der verwendet wird, um die kürzesten Wege vom Startknoten zu allen anderen Knoten in einem Graphen mit nicht-negativen Kantengewichten zu finden. Der Algorithmus verwendet einen Greedy-Ansatz, indem er bei jedem Schritt den Knoten mit der geringsten bekannten Entfernung vom Startknoten auswählt und die Entfernungen zu den Nachbarknoten aktualisiert.

Schritte des Algorithmus:

1. Initialisierung:

  • Setze die Entfernung zum Startknoten auf 0.
  • Setze die Entfernungen zu allen anderen Knoten auf unendlich.
  • Erstelle eine Menge von unbesuchten Knoten.

2. Auswahl des aktuellen Knotens:

  • Wähle den unbesuchten Knoten mit der kleinsten Entfernung (der Startknoten im ersten Schritt).

3. Aktualisierung der Entfernungen:

  • Für jeden Nachbarknoten des aktuellen Knotens, wenn der neue Weg über den aktuellen Knoten kürzer ist als der bekannte Weg, aktualisiere die Entfernung zu diesem Knoten.

4. Markiere den aktuellen Knoten als besucht:

  • Entferne den aktuellen Knoten aus der Menge der unbesuchten Knoten.

5. Wiederhole die Schritte 2-4, bis alle Knoten besucht wurden oder das Ziel erreicht wurde.

Zeit- und Speicherkomplexität des Dijkstra-Algorithmus:

Zeitkomplexität:

O((V + E) log V) bei Verwendung einer Priority Queue (z. B. Fibonacci Heap), wobei V die Anzahl der Knoten und E die Anzahl der Kanten ist.

O(V^2) bei Verwendung einer einfachen Liste zur Speicherung der Entfernungen.

Speicherkomplexität:

O(V) zur Speicherung der Entfernungen und Vorgänger (für die Wiederherstellung des Weges).

9.2 Implementierung des Dijkstra-Algorithmus

Die Implementierung des Dijkstra-Algorithmus ist zwar lang, aber sehr einfach. Ich empfehle dir, dich damit auseinanderzusetzen. Wenn du etwas nicht verstehst, scrolle ein bisschen nach oben und lies die Hauptschritte des Algorithmus noch einmal.

Beispiel einer Implementierung des Dijkstra-Algorithmus mit einer Priority Queue (Heap):


import heapq

def dijkstra(graph, start):
    # Initialisierung
    distances = {vertex: float('infinity') for vertex in graph}
    distances[start] = 0
    priority_queue = [(0, start)]
    parents = {vertex: None for vertex in graph}
            
    while priority_queue:
        current_distance, current_vertex = heapq.heappop(priority_queue)
            
        # Wenn die aktuelle Entfernung größer ist als die gespeicherte, überspringen wir den Knoten
        if current_distance > distances[current_vertex]:
            continue
            
        # Aktualisierung der Entfernungen zu Nachbarknoten
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            
            # Wenn ein kürzerer Weg zum Nachbarknoten gefunden wurde
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                parents[neighbor] = current_vertex
                heapq.heappush(priority_queue, (distance, neighbor))
            
    return distances, parents
            
# Beispiel:
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}
start_vertex = 'A'
distances, parents = dijkstra(graph, start_vertex)
print("Kürzeste Entfernungen vom Startknoten:", distances)
print("Vorgänger zur Wiederherstellung des Weges:", parents)

Ausgabe:


Kürzeste Entfernungen vom Startknoten: {'A': 0, 'B': 1, 'C': 3, 'D': 4}
Vorgänger zur Wiederherstellung des Weges: {'A': None, 'B': 'A', 'C': 'B', 'D': 'C'}

9.3 Aufgabenbeispiele, die mit dem Dijkstra-Algorithmus gelöst werden

Klassische Beispiele für Aufgaben, die mit dem Dijkstra-Algorithmus gelöst werden:

1. Optimierung von Routen in Transportsystemen

Suche nach dem kürzesten Weg zwischen Punkten in einem Verkehrsnetz (z. B. zwischen Städten).

Anwendung:

Navigationssysteme wie Google Maps nutzen den Dijkstra-Algorithmus zur Berechnung optimaler Routen.

2. Planen von Lieferwegen

Optimierung der Routen für Lieferservices, um Kosten und Lieferzeit zu minimieren.

Anwendung:

Logistikunternehmen nutzen den Dijkstra-Algorithmus zur Planung von Lieferwegen und zur Reduzierung der Betriebskosten.

3. Netzwerkmanagement

Optimierung der Datenpaket-Routing in Computernetzwerken, um Verzögerungen zu minimieren und die Bandbreite zu erhöhen.

Anwendung:

Routing-Protokolle wie OSPF (Open Shortest Path First) verwenden den Dijkstra-Algorithmus, um die kürzesten Wege in Netzwerken zu finden.

4. Analyse sozialer Netzwerke

Suche nach kürzesten Wegen und Messung der Zentralität in sozialen Graphen (z. B. um die einflussreichsten Nutzer zu finden).

Anwendung:

Soziale Plattformen analysieren die Verbindungen zwischen Benutzern, um Empfehlungen bereitzustellen und die Netzwerkaktivität zu analysieren.

5. Spiele und virtuelle Welten

Wegfindung für Charaktere in Spielwelten mit Hindernissen und unterschiedlichen Schwierigkeitsgraden.

Anwendung:

Spiel-Engines nutzen den Dijkstra-Algorithmus zur Berechnung der Bewegung von Charakteren und Objekten in virtuellen Welten.

6. Energiemanagementsysteme

Optimierung der Energieverteilung in Stromnetzen, um Verluste zu minimieren und die Zuverlässigkeit der Versorgung sicherzustellen.

Anwendung:

Energieversorger nutzen den Dijkstra-Algorithmus zur Optimierung der Übertragungswege in Netzen, um Energieverluste zu minimieren und Überlastungen zu vermeiden.

Beispiel:

In Stromnetzen stellt jeder Knoten eine Umspannstation dar, und die Kanten sind Stromleitungen mit unterschiedlichen Widerstandswerten. Der Dijkstra-Algorithmus hilft, den Weg mit dem geringsten Widerstand vom Energieerzeuger zum Verbraucher zu finden.

7. Evakuierungssysteme und Wegplanung

Optimierung von Evakuierungsrouten in Gebäuden oder Städten für eine schnelle und sichere Rettung im Notfall.

Anwendung:

Architekten und Ingenieure nutzen den Dijkstra-Algorithmus zur Planung von Evakuierungsrouten, um eine sichere und schnelle Entfernung von Menschen aus Gefahrenzonen zu gewährleisten.

Beispiel:

In einem Mehrfamilienhaus oder Bürogebäude stellen die Knoten des Graphen Räume und Flure dar, und die Kanten sind Wege dazwischen. Der Dijkstra-Algorithmus kann verwendet werden, um den kürzesten Weg von jedem Punkt im Gebäude zum nächsten Ausgang zu finden.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION