[파이썬] 벨만-포드 알고리즘의 개념과 활용
벨만-포드 알고리즘은 그래프의 최단 경로를 찾는 알고리즘 중 하나입니다. 이 알고리즘은 다익스트라 알고리즘과 마찬가지로 단일 출발점 최단 경로를 구하는데 사용됩니다. 그러나 벨만-포드 알고리즘은 음수 가중치를 갖는 간선을 다룰 수 있다는 점에서 다익스트라 알고리즘과 차이가 있습니다.
알고리즘의 개념과 동작 원리
벨만-포드 알고리즘은 최단 거리를 갱신하는 과정을 반복하여 최적의 결과를 찾아냅니다. 알고리즘의 동작 원리는 다음과 같습니다.
- 출발 노드를 설정하고, 출발 노드의 최단 거리를 0으로 설정합니다.
- 모든 간선에 대해 최단 거리를 갱신하는 과정을 N-1번 반복합니다. (N은 노드의 개수)
- N번째 반복에서도 최단 거리가 갱신된다면, 음수 사이클이 존재하는 것이므로 최적의 결과를 찾을 수 없습니다.
벨만-포드 알고리즘은 각 반복마다 모든 간선을 확인하고 최단 거리를 갱신하는 과정을 수행합니다. 이 과정은 다익스트라 알고리즘과 비교하여 상대적으로 시간이 오래 걸리지만, 음수 가중치를 다룰 수 있다는 점에서 유용하게 사용될 수 있습니다.
알고리즘의 활용
벨만-포드 알고리즘은 다양한 실제 문제에 활용될 수 있습니다. 일반적으로 음수 가중치가 존재하는 그래프에서 최단 경로를 찾을 때 사용되며, 예를 들어 다음과 같은 상황에서 활용될 수 있습니다.
- 금융 분야에서 주식 거래 경로의 최솟값을 찾을 때
- 통신 네트워크에서 패킷 전송 시 최단 경로를 찾을 때
- 게임 개발에서 유저의 최단 이동 경로를 찾을 때
Python을 활용한 벨만-포드 알고리즘 구현
다음은 Python을 사용하여 벨만-포드 알고리즘을 구현한 예시 코드입니다.
def bellman_ford(graph, start):
# 노드의 개수
nodes = len(graph)
# 시작 노드에서의 최단 거리를 무한대로 초기화
distance = [float('inf')] * nodes
# 시작 노드의 최단 거리를 0으로 설정
distance[start] = 0
# 모든 간선을 확인하고 최단 거리를 갱신하는 과정을 반복
for _ in range(nodes - 1):
for u in range(nodes):
for v, w in graph[u]:
if distance[u] + w < distance[v]:
distance[v] = distance[u] + w
# 음수 사이클이 존재하는지 확인
for u in range(nodes):
for v, w in graph[u]:
if distance[u] + w < distance[v]:
return "음수 사이클이 존재합니다."
return distance
위의 코드에서 graph
는 그래프를 나타내는 인접 리스트 형태의 입력입니다. 각 노드의 인접한 노드와 가중치가 포함되어 있습니다.
벨만-포드 알고리즘은 최악의 경우 O(NM)의 시간 복잡도를 가지게 됩니다. 따라서 그래프의 크기에 따라 실행 시간이 늘어날 수 있으므로, 대부분의 경우 다익스트라 알고리즘이 선호됩니다. 그러나 음수 가중치를 다룰 필요가 있는 상황에서는 벨만-포드 알고리즘이 유용하게 사용될 수 있습니다.