A* 알고리즘이란?
A* 알고리즘A-star Algorithm은 최단 경로 탐색 알고리즘 중 하나로, 다익스트라 알고리즘과 휴리스틱 탐색을 결합한 방식이다. 네비게이션 시스템, 게임 AI, 로봇 경로 탐색 등 다양한 분야에서 활용된다.
- 휴리스틱Heuristic: 특정 문제에 대한 근사적인 해결책을 찾기 위해 사용되는 경험적이고 규칙적인 방법이나 규칙. 불충분한 시간이나 정보로 인하여 합리적인 판단을 할 수 없거나, 체계적이면서 합리적인 판단이 굳이 필요하지 않은 상황에서 사람들이 빠르게 사용할 수 있게 보다 용이하게 구성된 간편 추론의 방법.
[출처] 휴리스틱 알고리즘
A* 알고리즘의 원리
A* 알고리즘은 탐색할 노드를 선택할 때 다음의 비용 함수 $ f(n) $을 사용한다:
$ f(n)=g(n)+h(n) $
- $ g(n) $: 시작 노드에서 현재 노드까지의 실제 비용
- $ h(n) $: 현재 노드에서 목표 노드까지의 휴리스틱(추정) 비용
- $ f(n) $: 총 예상 비용 (작을수록 우선 탐색)
이러한 방식으로 A* 알고리즘은 최단 경로를 효율적으로 찾을 수 있다.
다익스트라 알고리즘과의 차이점
A* 알고리즘과 다익스트라 알고리즘은 둘 다 그래프에서 최단 경로를 찾는 방법이지만 몇 가지 차이점이 있다.
| 비교 항목 | 다익스트라 알고리즘 | A* 알고리즘 |
| 탐색 방식 | 모든 가능한 경로를 탐색하여 최단 경로 보장 | 휴리스틱을 활용하여 유망한 경로를 우선 탐색 |
| 휴리스틱 사용 | X | O ($ h(n) $ 사용) |
| 탐색 속도 | 느림 (모든 노드를 탐색) | 빠름 (최적 경로 방향으로 진행) |
| 최적 해 보장 | 항상 최적 경로 보장 | 적절한 휴리스틱 사용 시 최적 경로 보장 |
즉, 다익스트라 알고리즘은 모든 경로를 탐색하여 항상 최단 경로를 찾지만, A* 알고리즘은 휴리스틱을 활용해 탐색 범위를 줄여 더 빠르게 최단 경로를 찾을 수 있다.
휴리스틱 함수의 선택
휴리스틱 함수 $ h(n) $의 선택이 알고리즘 성능에 큰 영향을 미친다. 대표적인 휴리스틱 함수로는 다음이 있다:
- 맨해튼 거리: $|x_1 - x_2| + |y_1 - y_2|$ → 격자 기반 경로 탐색에서 자주 사용
- 유클리드 거리: $ \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} $
- 체비쇼프 거리: 최대 좌표 차이를 사용한 거리 계산
💻 코드 구현
import heapq
def a_star(graph, start, goal, heuristic):
open_list = []
heapq.heappush(open_list, (0, start))
came_from = {}
g_score = {node: float('inf') for node in graph}
g_score[start] = 0
while open_list:
_, current = heapq.heappop(open_list)
if current == goal:
path = []
while current in came_from:
path.append(current)
current = came_from[current]
return path[::-1]
for neighbor, cost in graph[current].items():
tentative_g_score = g_score[current] + cost
if tentative_g_score < g_score[neighbor]:
came_from[neighbor] = current
g_score[neighbor] = tentative_g_score
f_score = tentative_g_score + heuristic(neighbor, goal)
heapq.heappush(open_list, (f_score, neighbor))
return None
A* 알고리즘의 장단점
✅ 장점
- 다익스트라 알고리즘보다 빠르게 최적의 경로를 찾을 수 있음
- 탐색 속도가 빠르고, 다양한 휴리스틱 함수를 적용할 수 있음
❌ 단점
- 휴리스틱 함수가 적절하지 않으면 성능이 저하될 수 있음
- 메모리 사용량이 많아질 수 있음
정리
A* 알고리즘은 경로 탐색 문제에서 매우 강력한 도구이며, 휴리스틱 함수를 잘 선택하면 효율적인 탐색이 가능하다.
읽어보기
'Krafton Jungle > 3. TIL' 카테고리의 다른 글
| [Week03] Trie (0) | 2025.04.02 |
|---|---|
| [WEEK03] B-Tree (0) | 2025.04.02 |
| [WEEK02] Two-pointer 알고리즘 (0) | 2025.03.24 |
| [WEEK02] 힙 (0) | 2025.03.22 |
| [WEEK02] 순열과 조합 by itertools (0) | 2025.03.22 |