-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdijkstra_algorithm.py
More file actions
95 lines (77 loc) · 3.1 KB
/
Copy pathdijkstra_algorithm.py
File metadata and controls
95 lines (77 loc) · 3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import matplotlib.pyplot as plt
import networkx as nx
import pandas as pd
# =============================================================
# PROGRAM OPTIMASI RUTE TERPENDEK - DIJKSTRA
# Ahmad Hanif Abiyyu Khrisna (NRP : 2125640006)
# Untuk NRP Belakang 6 (Node A ke Node G)
# =============================================================
def program_dijkstra():
# // 1. DEFINISI STRUKTUR GRAF (Berdasarkan Page 3).
# // Format: 'Node': {'Tetangga': Jarak}
graf = {
'A': {'C': 1, 'B': 2, 'D': 10},
'B': {'A': 2, 'D': 1, 'F': 7},
'C': {'A': 1, 'D': 4, ' E': 8},
'D': {'A': 10, 'B': 1, 'C': 4, 'E': 5, 'F': 5},
'E': {'C': 8, 'D': 5, 'G': 2},
'F': {'B': 7, 'D': 5, 'G': 3},
'G': {'E': 2, 'F': 3}
}
# // 2. INISIALISASI VARIABEL
start, end = 'A', 'G'
nodes = list(graf.keys())
jarak = {node: float('inf') for node in nodes}
jarak[start] = 0
parent = {node: None for node in nodes}
dikunjungi = []
antrian = nodes.copy()
# // List untuk menyimpan history langkah demi langkah (untuk Tabel)
log_tabel = []
# // 3. PROSES ITERASI ALGORITMA
print(f"Mencari rute terpendek dari {start} ke {end}...\n")
while antrian:
# // Cari node dengan jarak terkecil di antrian
node_skrg = min(antrian, key=lambda n: jarak[n])
# // Simpan kondisi saat ini ke log sebelum diproses
log = {'Iterasi': len(dikunjungi) + 1, 'Node_Aktif': node_skrg}
for n in nodes:
log[n] = f"{jarak[n]}({parent[n]})" if jarak[n] != float('inf') else "inf"
log_tabel.append(log)
if node_skrg == end: break
antrian.remove(node_skrg)
dikunjungi.append(node_skrg)
# // Update Jarak Tetangga (Relaksasi Edge)
for tetangga, bobot in graf[node_skrg].items():
if tetangga in antrian:
baru = jarak[node_skrg] + bobot
if baru < jarak[tetangga]:
jarak[tetangga] = baru
parent[tetangga] = node_skrg
# // 4. MENYUSUN RUTE KEMBALI
rute = []
curr = end
while curr:
rute.insert(0, curr)
curr = parent[curr]
# // 5. OUTPUT TABEL KE KONSOL
df = pd.DataFrame(log_tabel)
print("--- TABEL RIWAYAT PERHITUNGAN (DIJKSTRA TABLE) ---")
print(df.to_string(index=False))
# // 6. VISUALISASI GRAFIK
G = nx.Graph()
for u, neighbors in graf.items():
for v, w in neighbors.items():
G.add_edge(u, v, weight=w)
pos = nx.spring_layout(G, seed=42) # Layout agar rapi
nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=800, font_weight='bold')
# // Gambar label bobot pada garis
labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
# // Highlight rute terpendek dengan warna merah
edges_rute = list(zip(rute, rute[1:]))
nx.draw_networkx_edges(G, pos, edgelist=edges_rute, width=3, edge_color='red')
plt.title(f"Rute Terpendek: {' -> '.join(rute)} (Jarak: {jarak[end]})")
plt.show()
# Jalankan Program
program_dijkstra()