Ο αλγόριθμος του Dijkstra βήμα-βήμα με παράδειγμα και κώδικα Python

 

Ας δούμε ένα παράδειγμα βήμα προς βήμα για να καταλάβετε ακριβώς πώς λειτουργεί ο αλγόριθμος.
Έστω ότι έχουμε 4 πόλεις (κόμβους): Α, Β, Γ, Δ. Θέλουμε να βρούμε τις συντομότερες αποστάσεις ξεκινώντας από την πόλη Α.
Οι δρόμοι (ακμές) μεταξύ τους έχουν τα εξής βάρη (αποστάσεις σε χιλιόμετρα):

📍 Αρχική Κατάσταση

Φτιάχνουμε έναν πίνακα με τις αποστάσεις από το Α και βάζουμε παντού άπειρο, εκτός από το Α που είναι 0.

🔁 Βήμα 1: Επιλογή του Α (Απόσταση = 0)

Επιλέγουμε το Α γιατί έχει τη μικρότερη απόσταση. Κοιτάμε τους γείτονές του (Β και Γ) και κάνουμε χαλάρωση (update):
Μαρκάρουμε το Α ως επισκεπτόμενο.

🔁 Βήμα 2: Επιλογή του Γ (Απόσταση = 2)

Από τους εναπομείναντες {Β, Γ, Δ}, η μικρότερη απόσταση είναι του Γ (2). Εξετάζουμε τους μη επισκεπτόμενους γείτονές του (Β και Δ):
Μαρκάρουμε το Γ ως επισκεπτόμενο.

🔁 Βήμα 3: Επιλογή του Β (Απόσταση = 3)

Από τους {Β, Δ}, μικρότερη απόσταση έχει το Β (3). Εξετάζουμε τον μη επισκεπτόμενο γείτονά του (Δ):
Μαρκάρουμε το Β ως επισκεπτόμενο.

🔁 Βήμα 4: Επιλογή του Δ (Απόσταση = 8)

Απομένει μόνο το Δ. Δεν έχει άλλους μη επισκεπτόμενους γείτονες να ελέγξει. Μαρκάρεται ως επισκεπτόμενο.

🏆 Τελικό Αποτέλεσμα

Ο αλγόριθμος ολοκληρώθηκε! Οι συντομότερες αποστάσεις από το Α είναι:

💻 Κώδικας σε Python

Αν θέλετε να δείτε πώς μεταφράζεται αυτό σε κώδικα, ορίστε μια απλή υλοποίηση με τη χρήση της βιβλιοθήκης heapq (ουρά προτεραιότητας):

 

import heapq

def dijkstra(graph, start):
    # Αρχικοποίηση αποστάσεων με άπειρο
    distances = {node: float('infinity') for node in graph}
    distances[start] = 0
    
    # Ουρά προτεραιότητας (απόσταση, κόμβος)
    priority_queue = [(0, start)]
    
    while priority_queue:
        # Επιλογή του κόμβου με τη μικρότερη απόσταση
        current_distance, current_node = heapq.heappop(priority_queue)
        
        # Αν έχουμε βρει ήδη μικρότερη απόσταση για αυτόν τον κόμβο, προσπέρνα τον
        if current_distance > distances[current_node]:
            continue
            
        # Χαλάρωση ακμών (έλεγχος γειτόνων)
        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            
            # Αν βρέθηκε συντομότερο μονοπάτι
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))
                
    return distances

# Ορισμός του γραφήματος από το παράδειγμά μας
my_graph = {
    'A': {'B': 4, 'Γ': 2},
    'B': {'Δ': 5},
    'Γ': {'B': 1, 'Δ': 8},
    'Δ': {}
}

# Εκτέλεση
print(dijkstra(my_graph, 'A'))
# Έξοδος: {'A': 0, 'B': 3, 'Γ': 2, 'Δ': 8}