C#/Algorithm

경로 찾기 알고리즘 : A Pathfinding* Algorithm

코샵 2023. 6. 14. 11:19
반응형

A* 알고리즘

A* 알고리즘은 경로찾기 알고리즘 중 하나로, 출발지점부터 목적지점까지의 최적 경로를 탐색합니다. 이 알고리즘은 가중치 그래프에서 최단 경로를 찾는 데 사용됩니다. A* 알고리즘은 다음과 같은 특징을 가지고 있습니다.

  • 휴리스틱 함수를 사용하여 최적 경로를 탐색합니다.
  • 경로의 비용을 계산하고, 비용이 가장 적은 경로를 선택합니다.
  • 경로를 찾는 과정에서 이동할 수 있는 모든 경로를 검사합니다.

A* 알고리즘은 C#에서 구현하기 쉽고, 많은 개발자들이 사용하고 있습니다.

A* 알고리즘 구현

A* 알고리즘을 구현하기 위해서는 다음과 같은 단계를 따르면 됩니다.

  1. 출발점과 목적지점을 설정합니다.
  2. 휴리스틱 함수를 구현합니다.
  3. 우선순위 큐를 구현합니다.
  4. A* 알고리즘을 구현합니다.

출발점과 목적지점 설정

출발점과 목적지점을 설정하는 방법은 다양합니다. 가장 간단한 방법은 다음과 같습니다.

// 출발점 설정
Vector2Int start = new Vector2Int(0, 0);

// 목적지점 설정
Vector2Int goal = new Vector2Int(5, 5);

휴리스틱 함수 구현

A* 알고리즘에서는 휴리스틱 함수를 사용하여 최적 경로를 탐색합니다. 휴리스틱 함수는 출발점에서 목적지점까지의 예상 비용을 계산하는 함수입니다. 여기서는 맨하탄 거리를 사용하는 휴리스틱 함수를 구현합니다.

// 맨하탄 거리를 계산하는 휴리스틱 함수
private int Heuristic(Vector2Int a, Vector2Int b)
{
    return Mathf.Abs(a.x - b.x) + Mathf.Abs(a.y - b.y);
}

우선순위 큐 구현

A* 알고리즘에서는 우선순위 큐를 사용하여 경로를 탐색합니다. 우선순위 큐는 비용이 가장 적은 경로를 먼저 검사하도록 하는 자료구조입니다. C#에서는 SortedSet을 사용하여 우선순위 큐를 구현할 수 있습니다.

// 우선순위 큐 구현
SortedSet<PathNode> openSet = new SortedSet<PathNode>();

A* 알고리즘 구현

A* 알고리즘을 구현하는 방법은 다양합니다. 여기서는 다음과 같은 단계를 따릅니다.

  1. 출발점을 우선순위 큐에 추가합니다.
  2. 우선순위 큐에서 비용이 가장 적은 경로를 선택합니다.
  3. 선택한 경로를 폐쇄목록에 추가합니다.
  4. 선택한 경로의 인접한 경로들을 검사합니다.
  5. 인접한 경로들 중에서 폐쇄목록에 없는 경로를 우선순위 큐에 추가합니다.
  6. 목적지점에 도달하면 경로를 반환합니다.
// A* 알고리즘 구현
PathNode startNode = new PathNode(start);
openSet.Add(startNode);

while (openSet.Count > 0)
{
    PathNode currentNode = openSet.First();
    openSet.Remove(currentNode);

    if (currentNode.position == goal)
    {
        return currentNode;
    }

    closedSet.Add(currentNode);

    foreach (Vector2Int neighborPosition in GetNeighborPositions(currentNode.position))
    {
        PathNode neighborNode = new PathNode(neighborPosition, currentNode);
        if (closedSet.Contains(neighborNode))
        {
            continue;
        }

        int newCost = currentNode.cost + 1;
        if (newCost < neighborNode.cost || !openSet.Contains(neighborNode))
        {
            neighborNode.cost = newCost;
            neighborNode.heuristic = Heuristic(neighborNode.position, goal);
            neighborNode.totalCost = neighborNode.cost + neighborNode.heuristic;
            neighborNode.parent = currentNode;

            if (!openSet.Contains(neighborNode))
            {
                openSet.Add(neighborNode);
            }
        }
    }
}

return null;

마치며

이번 글에서는 C#에서 경로찾기 알고리즘을 구현하는 방법과 그에 대한 자세한 설명을 다루었습니다. 위에서 다룬 A* 알고리즘을 사용하면 게임 개발에서 매우 유용하게 사용할 수 있습니다. 이를 참고하여 프로그래밍 실력을 더욱 향상시켜보세요.