그래프/트리의 탐색 알고리즘으로 길찾기 알고리즘이다. 게임에서 많이 사용되며 다익스트라의 확장판, BFS의 가지치기 알고리즘이라 생각하면 된다. 따라서 휴리스틱 알고리즘이기도 하다.
h(x)가 휴리스틱 함수이기 때문에 해당 함수를 어떻게 설계하냐에 따라 알고리즘의 성능이 달라진다. 대표적으로 맨해튼 거리 함수와 유클리디안 거리 함수가 있다.
A에서 B로 이동
A주변 노드의 f(n)을 계산 후 가장 작은 노드를 다음 탐색 노드로 선정
B에 도달할 때까지 반복
B에 도달했다면, 최소 비용 경로를 역추적하여 결과를 얻음
while (OpenNodes.Num() != 0) {
OpenNodes.StableSort([](const AGridNode& node1, const AGridNode& node2) {return node2 > node1;}); //기존 순서를 유지하며 정렬
CurrentNode = OpenNodes.Pop();
if (CurrentNode == GoalNode) break; //목적지를 찾아 종료
TArray<AGridNode*> ChildNodes = Grid->GetValidNeighbors(CurrentNode); //주변 노드들을 자식노드로 들고옴
for (auto& ChildNode : ChildNodes) {
int currentcost = CurrentNode->cost + CostNodes(CurrentNode, ChildNode); //비용 계산
if (OpenNodes.Contains(ChildNode)) { //해당 노드가 열린 목록에 있다면
if (ChildNode->cost <= currentcost) continue; //이전에 계산한 비용이 방금 계산한 비용보다 작다면 아래 내용을 수행할 필요가 없음
}
else if (ClosedNodes.Contains(ChildNode)) { //해당 노드가 닫힌 목록에 있다면 무시
continue;
}
else {
OpenNodes.Add(ChildNode);
SetOpenNode(ChildNode);
TotalOpenNodes++;
ChildNode->heuristic = Heuristic(ChildNode); //휴리스틱값을 계산
}
ChildNode->cost = currentcost;
ChildNode->parent = CurrentNode;
}
ClosedNodes.Add(CurrentNode);//현재노드는 탐색이 종료된 노드로 간주
ExploredNodes++;
SetClosedNode(CurrentNode);
}
A*알고리즘
은 대표적으로 다익스트라
와 많이 비교되곤 한다. 다익스트라
와 A*
의 차이점은 휴리스틱 함수의 사용 유무이다.