들어가기전에..
그래프 탐색 기반 경로 계획

그래프 구조

최소 비용 문제







나머지 노드 E, F에 대해서도 동일하게 적용시키면 다음과 같은 결과가 나온다.


최종 경로
import heapq
import matplotlib.pyplot as plt
def dijkstra(graph, start_node, end_node):
# 각 노드까지의 거리를 무한대로 초기화
distances = {node : float('inf') for node in graph}
# 각 노드의 방문 여부를 False로 초기화
visited = {node : False for node in graph}
# 각 노드의 이전 노드를 저장할 딕셔너리를 None으로 초기화
predecessors = {node : None for node in graph}
# 시작 노드까지의 거리는 0으로 설정
distances[start_node] = 0
# 우선순위 큐를 초기화하고 시작 노드를 추가
pq = [(0, start_node)]
# 우선순위 큐가 빌 때까지 반복
while pq:
# 우선순위 큐에서 가장 작은 거리의 노드를 꺼냄
current_distance, current_node = heapq.heappop(pq)
# 이미 방문한 노드인 경우 스킵
if visited[current_node]:
continue
# 현재 노드를 방문 처리
visited[current_node] = True
# 목표 노드에 도달한 경우, 최단 경로를 구하고 반환
if current_node == end_node:
path = []
while current_node:
path.append(current_node)
current_node = predecessors[current_node]
path.reverse()
return path, distances[end_node]
# 현재 노드와 이웃한 노드들을 확인하며 최단 거리 갱신
for neighbor, weight in graph[current_node].items():
distance = current_distance + weight
# 새로운 거리가 기존의 거리보다 짧은 경우 갱신
if distance < distances[neighbor]:
distances[neighbor] = distance
predecessors[neighbor] = current_node
heapq.heappush(pq, (distance, neighbor))
# 목표 노드에 도달할 수 없는 경우 None 반환
return None, None
# 주어진 그래프 정의
graph = {
'A' : {'B' : 3, 'C' : 6, 'E' : 7},
'B' : {'A' : 3, 'C' : 2, 'D' : 5},
'C' : {'A' : 6, 'B' : 2, 'D' : 2, 'E' : 5, 'F' : 4, 'G' : 6},
'D' : {'B' : 5, 'C' : 2, 'G' : 1},
'E' : {'A' : 7, 'C' : 5, 'F' : 3, 'H' : 2},
'F' : {'C' : 4, 'E' : 3, 'G' : 3, 'H' : 2, 'I' : 2},
'H' : {'E' : 2, 'F' : 2, 'I' : 7},
'G' : {'C' : 5, 'D' : 1, 'F' : 3, 'I' : 6},
'I' : {'F' : 2, 'G' : 6, 'H' :7}
}
# 각 노드의 위치 지정
# 각 노드의 위치 지정
pos = {
'A': (0, 0),
'B': (1, 1),
'C': (1, -1),
'D': (2, 1),
'E': (2, -1),
'F': (3, 0),
'G': (3, 2),
'H': (4, -1),
'I': (4, 1)
}
# 시작 노드와 목표 노드 설정
start_node = 'A'
end_node = 'E'
# 다익스트라 알고리즘을 사용하여 최단 경로와 최단 거리 계산
path, shortest_distance = dijkstra(graph, start_node, end_node)
# 최단 경로 및 최단 거리 출력
print(f"The shortest path from {start_node} to {end_node} is : {path}")
print(f"The shortest distance is : {shortest_distance}")
# 그래프 그리기
plt.figure(figsize=(8, 6))
# 간선 그리기
for node in graph:
for neighbor, weight in graph[node].items():
plt.plot([pos[node][0], pos[neighbor][0]], [pos[node][1], pos[neighbor][1]], 'k-')
# 노드 그리기
# 노드 그리기
for node in graph:
plt.plot(pos[node][0], pos[node][1], 'o', markersize=10, alpha=0.5)
plt.text(pos[node][0], pos[node][1], node, fontsize=12, ha='center', va='center')
plt.axis('off')
plt.show()
실행 결과
The shortest path from A to I is : ['A', 'B', 'C', 'F', 'I']
The shortest distance is : 11
