다익스트라 최단 거리 알고리즘

28
다익스트라 최단 경로 탐색 너나들이 X 굴러가는길 X Jang Gong Ui

Upload: -

Post on 11-Apr-2017

4.088 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: 다익스트라 최단 거리 알고리즘

다익스트라 최단 경로 탐색너나들이 X 굴러가는길 X Jang Gong Ui

Page 2: 다익스트라 최단 거리 알고리즘

선행 지식

Page 3: 다익스트라 최단 거리 알고리즘

기본 용어 정리

간선중심이 되는 선, 주요 구간 사이를 연결하는

가중치

요소가 가지는 중요성의 값을 나타내는 비율

☞오후 들어 곳곳의 주요 간선이 심한 교통 체증을 빚고 있습니다

☞많은 대학이 고등학교 내신 성적에 가중치를 적용하여서 신입생을 선발했다.

Page 4: 다익스트라 최단 거리 알고리즘

선행지식 - 그래프

Page 5: 다익스트라 최단 거리 알고리즘

그래프란?

현실 세계의 사물이나 추상적인 개념 간의 연결 관계를 표현한 것

여러 도시들을 연결하는 도로망

사람들 간의 지인 관계

웹사이트 간의 링크 관계

컴퓨터간의 네트워크망

Page 6: 다익스트라 최단 거리 알고리즘

방향 그래프와 무방향 그래프

무방향 그래프에서의 최단 경로를 찾기 위해서는 각각의 양방향 간선을 두개의 일방 통행 간선으로 쪼개서 방향 그래프로 만들어야함

❖다익스트라의 경우 뱡향그래프를 기준으로 설계되었기 때문

Page 7: 다익스트라 최단 거리 알고리즘

그래프의 표현 방식

3

2

0

1 4

그래프 인접 행렬 표현

0 1 2 3 4

2

1

3

4

0 0

0

1

0

1

1

0

0

0

0

0

0

0

1

0

0

0

1

0

0

1

0

0

1

0

Page 8: 다익스트라 최단 거리 알고리즘

선행지식 - 너비 우선 탐색

Page 9: 다익스트라 최단 거리 알고리즘

선행지식 - 우선순위 큐

Page 10: 다익스트라 최단 거리 알고리즘

선행지식 - 우선순위 큐

JAVA는 우선순위 큐 라이브러리를 지원한다!

import -> import java.util.PriorityQueue;

선언 - > PriorityQueue<자료형> queue;

일반적인 큐

연산의 결과로 먼저 들어간 데이터가 먼저 나옴

우선순위 큐

들어간 순서와 상관없이 우선순위가 높은 데이터가 먼저 나옴

병원을 예로 들면 위급한 환자에게 우선순위를 주어 먼져 치료하는 것!

Page 11: 다익스트라 최단 거리 알고리즘

다익스트라 알고리즘

Page 12: 다익스트라 최단 거리 알고리즘

다익스트라 알고리즘이란?

다익스트라(Dijkstra) 알고리즘은가장 유명한 그래프 알고리즘 중 하나이다

단일 시작점 최단 경로 알고리즘으로, 시작 정점으로부터 다른 정점들까지의 최단거리를 계산

❖ 단일 시작점 알고리즘 이란?

하나의 시작점에서 다른 모든 정점까지 가는 최단거리를 구하는것

너비 우선 탐색의 연장으로 분류되며 실제로 그렇다

Page 13: 다익스트라 최단 거리 알고리즘

우선순위 큐를 사용하는 너비 우선 탐색( 眞 다익스트라)

A(0)

CD

E

B

G F

5

1

2

1

5

3

3

3

2

각 정점까지의 최단 거리를 저장하는 배열 array_dist[]

Page 14: 다익스트라 최단 거리 알고리즘

A(0)

CD

E

B

G F

5

1

2

1

5

3

3

3

2

탐색 : 그래프의 구조를 들여다 보지 않았기 때문에, 다른 정점까지의 최단 거리는 알수 없다. 따라서 시작점인 A까지의 최단거리가 0이라는 사실만을 알고 있다.

Page 15: 다익스트라 최단 거리 알고리즘

A(0)

C(1)D

E

B(5)

G F

5

1

2

1

5

3

3

3

2

방문 : 다익스트라 알고리즘은 매 단계마다 아직 방문하지 않은 정점 중 시작점과 가까운 점을 찾아 방문한다. 아직 우리가 알고 있는 최단거리 정점은 시작점밖에 없음으로, 첫 단계는 항상 시작점을 방문하는 것

최단경로 산정 : 우리는 지금까지 이 경로들을 몰랐으므로 이 값들을 array_dist[B] 와 array_dist[C]에 저장

❖각 정점까지의 최단 거리를 저장하는 배열 array_dist[]

큐 저장 : 이는 현재까지의 최단거리이기 때문에 우선순위 큐에 (array_dist[B],B), (array_dist[C],C) 를 삽입

탐색 : A에 연결된 정점들을 살펴 보면 B로 가는 길이 5인 경로와 C로가는 길이 1인 경로를 발견 할 수 있다

Page 16: 다익스트라 최단 거리 알고리즘

A(0)

C(1)D(5)

E

B(5)

G F

5

1

2

1

5

3

3

3

2

방문 : 시작점으로부터의 거리를 아는 정점 중 가장 가까운 것은 그 거리가 1인 C 이므로 C를 방문한다.

탐색 : A 에서 C로 가는 최단 거리는 1인데, 이 뒤에 길이 2인 간선을 붙히면 D로 가는 길이 3인 경로를 발견할수 있다.

최단경로 산정 : 이 값들을 array_dist[D] 에 저장

큐 저장 : 이는 현재까지의 최단거리이기 때문에 우선순위 큐에 (array_dist[D],D) 를 삽입

Page 17: 다익스트라 최단 거리 알고리즘

A(0)

C(1)D(5)

E(8)

B(4)

G F(6)

5

1

2

1

5

3

3

3

2

방문 : array_dist[D]가 가장 작으므로 D를 방문한다.

탐색 : 인접한 정점들을 탐색하면 B로 가는 길이 4인 경로, E로 가는 길이 8인 경로 F로 가는 길이 6인 경로를 발견한다.

최단경로 산정 :이중 B[4]로 가는 경로는 우리가 알던 B까지의 최단경로보다 짧은걸 알수 있다. array_dist[E] = 8 저장 , array_dist[E] = 6 저장

갱신 :기존 5 였던 array_dist[B]를 4로 변경하고 마찬가지로 우선순위 큐도 데이터를 반영한다.큐 저장 : 우선순위 큐에 기존 (array_dist[B](5) ,B) 는 그대로 두고 (array_dist[B](4) ,B) 를 추가한다. (array_dist[E] ,E) 추가 , (array_dist[F] ,F) 추가

이후 큐에서 꺼낼 때 array_dist[B]를 비교하여 짧은 경로를 판별하는 것이 우선순위 큐 내에서 값을 찾아내 바꾸는 것보다 효율적임

Page 18: 다익스트라 최단 거리 알고리즘

A(0)

C(1)D(5)

E(8)

B(4)

G(7) F(7)

5

1

2

1

5

3

3

2

2

방문 : array_dist[B]가 가장 작으므로 B를 방문한다.

탐색 : 인접한 정점들을 탐색하면 G로 가는 길이 7인 경로, F로 가는 길이 7인 경로를 발견한다.

최단경로 산정 : G까지 가는 최단 경로 array_dist[G] = 7 을 저장 , F까지 가는 경로 를 발견하지만 이미 7보다 적으므로 변경하지 않음

큐 저장 : (array_dist[G] ,G) 추가

Page 19: 다익스트라 최단 거리 알고리즘

A(0)

C(1)D(5)

E(8)

B(4)

G(7) F(6)

5

1

2

1

5

3

3

3

2

방문 : array_dist[F]가 가장 작으므로 F를 방문한다.

탐색 : 인접한 정점들을 탐색하면 G로 가는 길이 8인 경로를 발견

최단경로 산정 : 이미 arrat_dist = 7 이므로 변경하지 않음

Page 20: 다익스트라 최단 거리 알고리즘

A(0)

C(1)D(5)

E(8)

B(4)

G(7) F(6)

5

1

2

1

5

3

3

3

2

방문 : array_dist[G]가 array_dist[E]보다 우선이므로 방문 (너비 우선 탐색 법칙)

Page 21: 다익스트라 최단 거리 알고리즘

A(0)

C(1)D(5)

E(8)

B(4)

G(7) F(6)

5

1

2

1

5

3

3

3

2

방문 : E 방문 (너비 우선 탐색 법칙)

존재하는 모든 정점에 대한 경로 탐색이 완료 된다

Page 22: 다익스트라 최단 거리 알고리즘

최단 경로 계산 완료

이렇게 모든 정점이 방문된 시점에서 다익스트라 알고리즘이 계산한 arrat_dist[] 배열에는 각 정점까지의 최단 경로가 모두 계산되어 있음

굵게 표시된 간선들을 모아보면 트리 형태가 된다. 이 트리의 루트 (A)에서 각 정점까지로 가는 경로는 원래 그래프의 최단경로이다

이를 최소 비용 스패닝트리(minimum cost spanning tree) 라고한다.그래프의 각 변에 비용이 주어질 경우 생성 트리들 중에 모든 꼭짓점을 포함하며 비용이 최소이며 을 말한다.

Page 23: 다익스트라 최단 거리 알고리즘

산정된 최단 경로는 정당한가?

Page 24: 다익스트라 최단 거리 알고리즘

귀류법에 따른 정당성의 증명

어떤 주장에 대해 그 함의하는 내용을 따라가다보면 이치에 닿지 않는 내용 또는 결론에 이르게 된다는 것을 보여서 그 주장이 잘못된 것임을 보이는 것

Page 25: 다익스트라 최단 거리 알고리즘

정당성의 증명

귀류법을 위해 다익스트라 알고리즘이 최단 거리를 제대로 계산하지 못하는 정점 U가 있다고 가정

KS

P

QU

방문됨

아직 방문되지 않음

다익스트라 알고리즘이 산정한 최단 경로는 실선 dist[U]

제대로 계산하지 못하여 실제 최단 경로는 점선 dist[Q]를 거쳐 정점 U에 도착하는 경로라 가정

❖dist[X] 시작점으로부터 X까지의 경로

Page 26: 다익스트라 최단 거리 알고리즘

KS

P

QU

방문됨

아직 방문되지 않음

정당성의 증명1. 시작점에 대해서는 항상 정확하게 최단거리를 계산하기 때문에 U는 시작점이 항상 아니라는 사실을 알 수 있음

2. 다익스트라 알고리즘이 U를 방문하는 순간, U 이전에 방문한 정점들과 아직 방문하지 못한 정점들로 그래프를 나눌 수 있음

이때 U에 대해 최단 거리를 잘못 계산했다는 말은 다익스트라 알고리즘이 만든 스패팅 트리에서의 경로보다 더 짧은 경로가 존재 한다는 의미

Page 27: 다익스트라 최단 거리 알고리즘

KS

P

QU

방문됨

아직 방문되지 않음

정당성의 증명

1 .이미 방문한 정점을 P ,그 직전에 만난 정점을 Q 라고 가정

2. 이 때 시작점 부터 Q까지의 최단 거리는 dist[P] + w(P,Q) 가 된다.

❖ 가중치 w(❨X,Y)❩

❖dist[X] 시작점으로부터 X까지의 경로

3. 하지만 P는 이미 방문한 상태이기 때문에, dist[Q]는 이미 최단 거리가 저장되있고, 우선순위 큐에도 들어가 있는 상태이다.

4. 다익스트라가 큐에서 dist[U]를 먼져 꺼냈다는 말은 dist[U] < dist[Q] 임을 증명

즉 Q를 지나서 U로 오는 경로가 dist[U]보다 짧다는 말은 모순이며 최소비용 스패닝트리보다 짮은 경로는 존재할수 없다.

Page 28: 다익스트라 최단 거리 알고리즘

다익스트라 알고리즘이 찾아내는 경로는 항상 최단 경로이다.

결론

❖ 모든 간선의 가중치가 0이상인 경우