도구스개발

A* 경로 탐색 계산기

격자에서 A*로 최단 경로를 찾고 같은 격자를 다익스트라로도 풀어 펼친 칸 수를 견줍니다. 휴리스틱을 부풀리거나 대각선을 허용해 h가 실제 거리를 넘게 만들면 최단이 아닌 답이 나오는 것을 직접 볼 수 있습니다.

1이 보통의 A*. 올리면 빨라지지만 최단이 아닐 수 있습니다

h = |Δx| + |Δy|

진한 파랑이 찾은 경로, 옅은 칸이 탐색이 펼친 자리입니다. 색이 진할수록 먼저 펼쳤습니다

경로 비용 — 최단입니다

30

31칸을 펼쳤습니다 · 다익스트라는 256칸 (12.1%)

경로 비용30
최단 비용 (다익스트라)30
최단 대비100%
경로가 지나는 칸 수31
펼친 칸 (A*)31
펼친 칸 (다익스트라)256
다익스트라 대비12.1%
열린 목록의 최대 크기29
출발점에서의 h30 (실제 30)
h가 허용 가능한가예 — 최단을 보장합니다
계산 근거f(n) = g(n) + w·h(n) · h = |Δx| + |Δy| · w = 1이동 비용: 직선 1 (대각선 없음)g는 지금까지 실제로 걸어온 거리, h는 목표까지 남은 거리의 짐작값입니다. f가 작은 칸부터 꺼내며, 같으면 g가 큰 쪽을 먼저 꺼내 결과가 매번 같도록 했습니다. h = 0으로 두면 f = g가 되어 그대로 다익스트라가 되므로, 위의 두 값은 같은 코드를 h만 바꿔 두 번 돌린 것입니다.
지금 h는 허용 가능합니다 — 실제 남은 거리를 절대 넘지 않습니다. 그래서 A*가 찾은 경로가 반드시 최단입니다. 위의 다익스트라 결과와 비용이 정확히 같은지 확인해 보십시오. 대신 펼친 칸은 12.1%로 줄었습니다 — 휴리스틱이 얻는 것이 바로 이 몫입니다.
대각선을 허용하는 순간 맨해튼 거리는 못 쓰게 됩니다. 상하좌우로만 움직이면 |Δx| + |Δy|가 곧 장애물 없는 실제 거리라 딱 맞지만, 대각선 한 걸음(√2 = 1.414)을 맨해튼은 2로 세기 때문입니다. 8방향에서 딱 맞는 h는 옥타일 거리 (√2−1)·min(dx,dy) + max(dx,dy)이며, 대각선으로 갈 수 있는 만큼 가고 남은 만큼 직선으로 가는 거리입니다.
h가 실제 거리에 가까울수록 덜 헤맵니다. h = 0인 다익스트라는 목표가 어느 쪽인지 모르니 사방으로 고르게 퍼지고, h가 정확할수록 목표 쪽으로만 곧게 나아갑니다. 격자에서 «옅게 칠해진 칸»이 그 차이입니다. 벽을 «가로막 + 문 하나»로 두고 휴리스틱을 바꿔 보면, A*도 결국 문을 찾을 때까지는 벽 앞에서 넓게 펼친다는 것이 보입니다 — 휴리스틱은 장애물을 모르기 때문입니다.
대각선은 모서리를 자르지 못합니다. 벽 두 장이 직각으로 맞닿은 자리를 대각선으로 스쳐 지나가면 벽을 뚫은 것처럼 보이므로, 양옆 두 칸이 모두 비어 있을 때만 대각선 이동을 허용했습니다. 게임에서 흔히 쓰는 규칙이며, 이 규칙이 없으면 캐릭터가 벽 모서리를 통과하는 것처럼 그려집니다.

사용 방법

  1. 1격자를 눌러 벽을 세웁니다. «격자를 눌러 바꿀 것»을 출발점·도착점으로 바꾸면 두 점을 옮길 수 있습니다.
  2. 2휴리스틱을 «없음»으로 두면 다익스트라, 맨해튼이나 옥타일로 두면 A*입니다.
  3. 3펼친 칸 수가 얼마나 줄었는지 결과에서 확인합니다.
  4. 4가중치 w를 2~5로 올려 최단이 아닌 답이 나오는 것을 봅니다.
  5. 58방향으로 바꾼 뒤 맨해튼을 그대로 두면 같은 일이 벌어집니다. 옥타일로 바꾸면 다시 최단이 됩니다.

자주 묻는 질문

목표까지 남은 거리의 짐작값 h를 더해 꺼내는 순서를 정하는 것이 다릅니다. 다익스트라는 f = g만 보고 출발점에서 가까운 순서로 사방으로 고르게 퍼지지만, A*는 f = g + h로 목표 쪽을 먼저 봅니다. h = 0으로 두면 A*가 그대로 다익스트라가 되며, 이 계산기도 같은 코드를 h만 바꿔 두 번 돌립니다.

h가 실제 남은 거리를 절대 넘지 않는 것을 말하며, 이때만 A*가 최단 경로를 보장합니다. h를 부풀리면 탐색은 빨라지지만 «조금 돌아가지만 결국 짧은 길»을 먼저 버려 최단이 아닌 답이 나옵니다. 이 계산기에서 가중치 w를 1보다 크게 올리면 그 일이 실제로 일어나는 것을 볼 수 있습니다.

대각선 한 걸음의 실제 비용이 √2 = 1.414인데 맨해튼 거리는 2로 세어 과대평가하기 때문입니다. 실제 거리를 넘어서므로 허용 불가능해지고, 최단이 아닌 경로가 나올 수 있습니다. 8방향에서 딱 맞는 h는 옥타일 거리 (√2−1)·min(dx,dy) + max(dx,dy)이며, 대각선으로 갈 수 있는 만큼 가고 남은 만큼 직선으로 가는 거리입니다.

h에 w를 곱하면 찾은 경로의 비용이 최단의 w배를 넘지 않습니다. w = 2면 최악의 경우에도 두 배 안쪽이라는 뜻이며, 실제로는 훨씬 적게 벌어지는 대신 펼치는 칸이 크게 줄어듭니다. 실시간 게임처럼 «충분히 좋은 길을 빨리»가 필요한 곳에서 일부러 쓰는 기법입니다.

아닙니다. 휴리스틱은 장애물을 모르므로, 목표 쪽으로 곧장 가는 길이 벽에 막혀 있으면 벽 앞에서 넓게 펼칩니다. «가로막 + 문 하나» 버튼으로 만든 격자에서 이것을 볼 수 있습니다. 극단적으로는 다익스트라와 거의 같아지지만, 그렇더라도 최단 경로를 찾는 것은 변하지 않습니다.

이 계산기에서는 막았습니다. 벽 두 장이 직각으로 맞닿은 자리를 대각선으로 스쳐 지나가면 벽을 뚫은 것처럼 보이므로, 양옆 두 칸이 모두 비어 있을 때만 대각선 이동을 허용합니다. 게임에서 흔히 쓰는 규칙입니다.

달라지지 않습니다. f가 같은 칸이 여럿일 때 g가 큰 쪽을, 그것도 같으면 칸 번호가 작은 쪽을 먼저 꺼내도록 정해 두었습니다. 이 순서를 정하지 않으면 최단 경로는 같아도 펼치는 칸 수가 실행마다 흔들려, 이 계산기가 비교하려는 숫자를 믿을 수 없게 됩니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지며 만든 격자는 이 기기에만 남습니다.

알아두면 좋은 점

  • 이동 비용은 직선 1, 대각선 √2로 고정입니다. 칸마다 다른 비용(늪·모래 같은 지형)은 다루지 않습니다.
  • 격자는 한 변 30칸까지 다룹니다. 칸마다 버튼이 하나씩 생겨 그보다 크면 화면에서 다루기 어렵습니다.
  • «펼친 칸»은 열린 목록에서 꺼내 이웃을 살펴본 칸의 수입니다. 구현에 따라 세는 방식이 달라 다른 자료의 숫자와 직접 견주기 어려울 수 있습니다.
  • 가중치를 1보다 크게 두면 결과가 최단이 아닐 수 있습니다. 결과 표의 «h가 허용 가능한가» 행에서 확인하십시오.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.