CodeGym /자바 코스 /Python SELF KO /최단 경로 탐색 알고리즘

최단 경로 탐색 알고리즘

Python SELF KO
레벨 56 , 레슨 3
사용 가능

9.1 다익스트라 알고리즘의 작동 원리

다익스트라 알고리즘은 시작 노드에서 모든 다른 노드로의 최단 경로를 찾는 알고리즘이야. 간선 가중치가 비음수인 그래프에서 사용되고, 각 단계에서 시작 노드로부터의 가장 작은 알려진 거리를 갖는 노드를 선택하면서 인접한 노드로의 거리를 업데이트해.

알고리즘 단계:

1. 초기화:

  • 시작 노드까지의 거리를 0으로 설정해.
  • 다른 모든 노드까지의 거리는 무한대로 설정해.
  • 방문하지 않은 노드의 집합을 만들어.

2. 현재 노드 선택:

  • 방문하지 않은 노드 중에서 최단 거리를 가진 노드를 선택해 (첫 단계에서는 시작 노드야).

3. 거리 업데이트:

  • 현재 노드의 각 인접 노드에 대해, 현재 노드를 통해 가는 새로운 경로가 더 짧다면 그 노드까지의 거리를 갱신해.

4. 현재 노드를 방문한 것으로 표시:

  • 방문하지 않은 노드의 집합에서 현재 노드를 제거해.

5. 2-4 단계를 반복해, 모든 노드를 방문하거나 목표 노드에 도달할 때까지 계속해.

다익스트라 알고리즘의 시간 및 공간 복잡도:

시간 복잡도:

O((V + E) log V) 우선순위 큐를 사용할 때 (예: Fibonacci heap), 여기서 V는 노드 수, E는 간선 수야.

O(V^2) 간단한 리스트로 거리를 저장할 때.

공간 복잡도:

O(V) 경로를 복원하기 위한 거리 및 부모 노드를 저장하기 위해 필요해.

9.2 다익스트라 알고리즘 구현

다익스트라 알고리즘의 구현은 길지만 매우 간단해. 이해해보려고 해봐. 잘 안 되면 조금 위로 돌아가 알고리즘의 기본 단계를 다시 읽어봐.

우선순위 큐 (힙)을 사용한 다익스트라 알고리즘의 구현 예시:


import heapq

def dijkstra(graph, start):
    # 초기화
    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)
            
        # 현재 거리가 기록된 거리보다 크면 노드를 넘어가
        if current_distance > distances[current_vertex]:
            continue
            
        # 인접 노드까지의 거리 업데이트
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            
            # 인접 노드까지의 더 짧은 경로가 발견되면
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                parents[neighbor] = current_vertex
                heapq.heappush(priority_queue, (distance, neighbor))
            
    return distances, parents
            
# 사용 예시:
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("시작 노드로부터의 최단 거리:", distances)
print("경로 복원을 위한 부모 노드:", parents)

출력:


시작 노드로부터의 최단 거리: {'A': 0, 'B': 1, 'C': 3, 'D': 4}
경로 복원을 위한 부모 노드: {'A': None, 'B': 'A', 'C': 'B', 'D': 'C'}

9.3 다익스트라 알고리즘을 사용한 문제 예제

다익스트라 알고리즘으로 해결할 수 있는 문제의 전형적인 예시:

1. 교통 네트워크의 경로 최적화

교통 네트워크에서 지점 간 최단 경로 찾기 (예: 도시 간).

적용:

내비게이션 시스템, 예를 들어 Google Maps, 는 최적 경로 계산을 위해 다익스트라 알고리즘을 사용해.

2. 배송 경로 계획

배송 서비스의 경로를 최적화하여 비용과 배송 시간을 최소화해줘.

적용:

물류 회사는 다익스트라 알고리즘을 사용하여 배송 경로를 계획하고 운영 비용을 줄여.

3. 네트워크 관리

데이터 패킷의 라우팅을 최적화하여 지연 최소화 및 대역폭 증가를 목표로 해줘.

적용:

OSPF (Open Shortest Path First)와 같은 라우팅 프로토콜은 네트워크에서 최단 경로를 찾기 위해 다익스트라 알고리즘을 사용해.

4. 소셜 네트워크 분석

소셜 그래프에서 최단 경로 찾기와 중심성 측정 (예: 가장 영향력 있는 사용자를 찾기).

적용:

소셜 플랫폼은 사용자 간의 관계를 분석하여 추천사항을 제공하고 네트워크 활동을 분석해.

5. 게임과 가상 세계

장애물과 다양한 난이도가 있는 게임 세계에서 캐릭터의 경로 찾기.

적용:

게임 엔진은 가상 세계에서 캐릭터와 객체의 움직임을 계산하기 위해 다익스트라 알고리즘을 사용해.

6. 에너지 관리 시스템

에너지 손실 최소화와 안정적 공급 보장을 위해 전력망 분배 최적화.

적용:

전력 회사는 네트워크 내 에너지 전송 경로를 최적화하여 에너지 손실을 최소화하고 과부하를 피하기 위해 다익스트라 알고리즘을 사용해.

예시:

전력망에서 각 노드는 변전소를 나타내고, 간선은 다양한 저항 수준의 전송선을 나타내. 다익스트라 알고리즘은 에너지 원천에서 소비자까지 최소 저항 경로를 찾는 데 도움을 줘.

7. 대피 및 경로 계획 시스템

건물이나 도시에서 사람들을 신속하고 안전하게 대피시키기 위한 경로 최적화.

적용:

건축가와 엔지니어는 대피 경로를 계획하여 위험 구역에서 사람들을 안전하고 신속하게 제거하기 위해 다익스트라 알고리즘을 사용해.

예시:

다세대 주택이나 사무실 건물에서 그래프 노드는 방과 복도를 나타내고, 간선은 그 사이의 경로를 나타내. 다익스트라 알고리즘은 건물 내 어느 지점에서 가장 가까운 출구까지 최단 경로를 찾는 데 사용할 수 있어.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION