Generic Graph Search 알고리즘은 크게 두 가지로 나눌 수 있습니다.
하나는 LIFO Manner를 이용하는 Depth First Search(DFS), 다음은 FIFO Manner를 이용하는 Best First Search 입니다.
BFS(Best First Search)는 Greedy Algorithm과 연관이 되어 있습니다. 해당 상황에서 가장 그럴싸한 경로를 선택한다는 것이 BFS의 핵심이죠. 이 BFS에 속하는 방법중에 하나가 바로 A* Search입니다. root로부터 현재 노드까지의 거리에, 목표 노드까지 남은 거리를 예측하여 그 값을 더하고 OPEN queue에 삽입합니다. 보통 OPEN queue는 MIN HEAP으로 작성된 Priority queue이기 때문에, 최소 예측 비용을 가진 다음 노드까지의 경로가 queue의 선두에 위치해 있게 됩니다. A* Search는 목적지 노드까지 거리를 예측하는데 어떤 특정한 정보를 사용하기 때문에 Heuristic Search로 분류됩니다.
이 A* search에서 heuristic 값이 항상 0으로 고정된다면 무슨일이 일어날까요? 이를 Uniform Cost Search라고 하는데 보통 queue에 들어간 다음 노드까지의 거리만 가지고 다음 노드를 결정하게 됩니다.
위의 그림에서 알고리즘은 어떤 경로를 선택하게 될까요? 먼저 루트 노드인 A가 CLOSE list에 삽입되고, 알고리즘은 A의 자식 노드들을 경로 값과 함께 OPEN list에 집어넣게 됩니다. 그 중 최소값을 가진 D가 다음 노드로 선택되고, D의 자식 노드들이 경로값과 합께 OPEN list에 집어 넣어집니다. 그렇게 되면 queue에는 [B:3, C:2, F:4, E:2]의 노드들이 들어있게 됩니다. 이와 같이 동일한 값이 두 개이상 존재할 경우, 알고리즘은 구현자의 구현에 따라 다음 노드를 고르게 됩니다. 가령 C가 먼저 삽입되었기 때문에 C를 선택한다면 queue에는 [B:3, F:5, F:4, E:2]이 들어있게 됩니다. 다음 노드로는 E가 선택되겠죠.
서로 다른 비용을 가진 노드에 대해서 알고리즘은 최소값을 가진 노드를 선택하게 된다는 것이 이 Uniform Cost Search를 위시한 A* search의 기본 개념입니다. 때문에 Greedy Algorithm과 연관이 되어 있다고 하는 것이기도 합니다.
A* search에서는 그림에 표기된 경로값 외에도 목표까지의 경로 추정치를 휴리스틱으로 사용하게 됩니다. 경로 추정치가 실제의 거리 값보다 작을 경우 이 A* search는 Admissible하다고 표현합니다.
만약 Uniform Cost Search에서 다음 노드까지의 경로값까지도 사용하지 않는다면 과연 어떻게 될까요? 이를 Breadth First Search라고 합니다. 많이들 아시는 넓이 우선 탐색이 바로 그것입니다.
하나는 LIFO Manner를 이용하는 Depth First Search(DFS), 다음은 FIFO Manner를 이용하는 Best First Search 입니다.
BFS(Best First Search)는 Greedy Algorithm과 연관이 되어 있습니다. 해당 상황에서 가장 그럴싸한 경로를 선택한다는 것이 BFS의 핵심이죠. 이 BFS에 속하는 방법중에 하나가 바로 A* Search입니다. root로부터 현재 노드까지의 거리에, 목표 노드까지 남은 거리를 예측하여 그 값을 더하고 OPEN queue에 삽입합니다. 보통 OPEN queue는 MIN HEAP으로 작성된 Priority queue이기 때문에, 최소 예측 비용을 가진 다음 노드까지의 경로가 queue의 선두에 위치해 있게 됩니다. A* Search는 목적지 노드까지 거리를 예측하는데 어떤 특정한 정보를 사용하기 때문에 Heuristic Search로 분류됩니다.
이 A* search에서 heuristic 값이 항상 0으로 고정된다면 무슨일이 일어날까요? 이를 Uniform Cost Search라고 하는데 보통 queue에 들어간 다음 노드까지의 거리만 가지고 다음 노드를 결정하게 됩니다.
위의 그림에서 알고리즘은 어떤 경로를 선택하게 될까요? 먼저 루트 노드인 A가 CLOSE list에 삽입되고, 알고리즘은 A의 자식 노드들을 경로 값과 함께 OPEN list에 집어넣게 됩니다. 그 중 최소값을 가진 D가 다음 노드로 선택되고, D의 자식 노드들이 경로값과 합께 OPEN list에 집어 넣어집니다. 그렇게 되면 queue에는 [B:3, C:2, F:4, E:2]의 노드들이 들어있게 됩니다. 이와 같이 동일한 값이 두 개이상 존재할 경우, 알고리즘은 구현자의 구현에 따라 다음 노드를 고르게 됩니다. 가령 C가 먼저 삽입되었기 때문에 C를 선택한다면 queue에는 [B:3, F:5, F:4, E:2]이 들어있게 됩니다. 다음 노드로는 E가 선택되겠죠.
서로 다른 비용을 가진 노드에 대해서 알고리즘은 최소값을 가진 노드를 선택하게 된다는 것이 이 Uniform Cost Search를 위시한 A* search의 기본 개념입니다. 때문에 Greedy Algorithm과 연관이 되어 있다고 하는 것이기도 합니다.
A* search에서는 그림에 표기된 경로값 외에도 목표까지의 경로 추정치를 휴리스틱으로 사용하게 됩니다. 경로 추정치가 실제의 거리 값보다 작을 경우 이 A* search는 Admissible하다고 표현합니다.
만약 Uniform Cost Search에서 다음 노드까지의 경로값까지도 사용하지 않는다면 과연 어떻게 될까요? 이를 Breadth First Search라고 합니다. 많이들 아시는 넓이 우선 탐색이 바로 그것입니다.
'Tips' 카테고리의 다른 글
안드로이드 부트로더 문제 (0) | 2013.10.24 |
---|---|
안드로이드 최신버전(>=4.2)에서 USB Debugging 사용하기 (0) | 2013.10.24 |
binutils 크로스 컴파일 방법 (0) | 2012.08.10 |
Python-Twitter (0) | 2011.07.27 |
gprolog-GNU's prolog compiler/interpreter (0) | 2011.04.18 |