경로 찾기 알고리즘?


24

나는이 질문을 먼저 stack overflow에 게시했지만 아무도 비디오 게임에 관심이 없다고 생각합니다 ...

모든 유형의 게임에서 사용되는 경로 찾기 알고리즘은 무엇입니까? (어쨌든 캐릭터가 움직이는 모든 유형 중에서) Dijkstra는 많이 사용됩니까? 실제로 어딘가에 도착하는 단계를 추적하지 않기 때문에 그렇지 않을 것입니다. 내가 올바르게 이해하면 가장 가까운 객체 만 결정합니다. 나는 실제로 아무것도 코딩하려고하지 않습니다. pseudocode 또는 페이스트를 붙여 넣으면 괜찮을 것입니다 (Java 및 C ++을 이해할 수 있음). 기본적으로 경로 찾기에 대한 간단한 개요를 찾고 있습니다.

나는 A *가 2D 게임에서 사용하는 알고리즘과 같다는 것을 알고 있습니다. 훌륭하지만 모두 그리드 기반이 아닌 2D 게임은 어떻습니까? Age of Empires 또는 Link 's Awakening과 같은 것들. 이동할 사각형 공간이 없으므로 어떻게해야합니까?

3D 게임은 무엇을합니까? 나는이 http://www.ai-blog.net/archives/000152.html을 읽었습니다.이 주제에 대한 위대한 권위는 있지만 메쉬가 설정되면 실제로 어떻게 설명하지는 않습니다. 경로 찾기가 완료되었습니다. A *가 그들이 사용하는 것이라면, 3D 환경에서 이와 같은 일은 어떻게 이루어 집니까? 그리고 스플라인은 모서리를 둥글게하는 데 정확히 어떻게 작용합니까?


2
이 질문은 SE의 Q & A 형식에 비해 너무 개방적이라고 생각합니다. FAQ
John McDonald

1
언급 한 게임은 맵을 A *의 노드로 분류해야합니다. 공정 아래 그 휴식은 사각형 그리드를 포함하지 않고 it.Check이 VID 할 수있는 많은 방법이있다 youtube.com/watch?v=nGC_kBCoHYc이 좋은 게임은 플레이어들이있어 무엇을 말할 수 있도록한다 실제로 무대 뒤에서
XiaoChuan Yu

1
여기에 많은 질문이 있으므로 실제로 답을 쓸 수는 없지만 Dijkstra는 경로를 반환하며 대부분의 경로 찾기 알고리즘은 다목적입니다. 월드, 2D 또는 3D를 연결된 그래프로 변환하고 경로 찾기 알고리즘을 실행합니다.
Gregory Avery-Weir


1
내가 허락 할게 이 질문은 여기에서 GDSE에 대한 4 개의 근접 투표에 비해 SO에 대해 4 개의 찬성 투표를 받았습니다. 이 사이트의 중재자가 지나치게 공격적이라고 생각합니다. 물론, 질문이 FAQ에 지정된 지침에 어떻 게 진행되는지 알 수 있지만 인용을 피하기 위해 해당 지침이 있습니다 diminishing the usefulness of our site. 이 질문은 이미 3 번이나 좋아되었습니다. 이는 일부 사용자에게 도움이되었다는 증거입니다. 그래서 나는 그것을 폐쇄하고 결국 제거 할 위험에 처한 투표가 훨씬 비생산적이라고 생각합니다.
David Gouveia

답변:


62

한 번에 너무 많은 질문이 있으므로 구체적인 대답을하기는 어렵지만 이러한 몇 가지 주제에 대해서는 논의하기가 어렵습니다. 나는 대답을 두 가지로 나누고 가능한 한 최선을 다해 해결하려고 노력할 것입니다. 나는이 목록들 중 어느 것도 완전 하다고 주장하지는 않지만 , 내가 기억할 수있는 몇 가지 다른 방법들이다.


1 부-길 찾기 알고리즘

우선, 길 찾기를 구현하는 방법 은 여러 가지가 있지만 모두 최단 경로를 반환하거나 효율적이거나 신뢰할 수있는 것은 아닙니다. 예를 들어 :

  • "예상"하지 않고 한 번에 한 단계 씩 진행하는 기본 방법 :

    • 랜덤 백스텝 -목표 방향으로 한 번에 한 단계 씩 이동 장애물이 발생하면 임의의 방향으로 조금 뒤로 물러서서 다시 시도하여 문제를 해결하십시오. 전혀 신뢰할 수 없으며 다양한 상황에 빠질 것입니다.

    • 장애물 추적 -임의의 백 스텝핑과 비슷하지만 무작위로 뒤로 이동하는 대신 충돌이 발견되면 오른손이 벽에 붙어 있고 만져야하는 것처럼 오브젝트를 추적합니다. 충돌이 없으면 목표 방향으로 계속 움직입니다. 여러 상황에서 다시 한 번 멈출 수 있습니다.

  • 한 번에 전체 경로를 찾는 방법 :

    • 폭 우선 탐색 -한 번에 각 하위 계층을 방문하여 간단한 그래프 순회, 경로가 발견되면 중지합니다. 그래프에 가중치 가 부여 되지 않은 경우 (즉, 각 인접 노드 사이의 거리는 항상 동일 함) 너무 효율적이지 않지만 가장 짧은 경로를 찾습니다. 가중치 그래프의 경우 최단 경로를 반환하지는 않지만 존재하는 경우 항상 경로를 찾습니다.

    • 깊이 우선 검색 -그래프를 탐색하는 다른 방법이지만 레이어별로 가져 오는 대신 알고리즘이 먼저 그래프를 깊이 검색합니다. 이 방법은 검색 깊이가 제한되지 않는 경우, 특히 재귀 적 구현을 ​​사용하는 경우 문제가있을 수 있으며, 이는 스택 오버플로로 이어질 수 있으므로 일반적으로 스택을 사용하여 반복적으로 구현하는 것이 더 안전합니다.

    • 최고 우선 검색 -너비 우선 검색과 유사하지만 가장 유망한 이웃을 먼저 선택하는 휴리스틱을 사용합니다. 반환 된 경로는 가장 짧지 않을 수 있지만 첫 번째 검색보다 실행 속도가 빠릅니다. A *는 Best First Search의 유형입니다.

    • Dijkstra의 방법 -방문부터 방문한 모든 노드까지의 총 비용을 추적하고이를 사용하여 그래프를 순회하는 최상의 순서를 결정합니다. 가중치 그래프와 함께 작동하고 최단 경로를 반환하지만 많은 검색이 필요할 수 있습니다.

    • A * -Dijkstra와 유사하지만 휴리스틱을 사용하여 최선의 결정을 내리기 위해 각 노드가 목표에 얼마나 가까운 지 추정합니다. 이러한 휴리스틱으로 인해 A *는 훨씬 더 적시에 가중치 그래프에서 가장 짧은 경로를 찾습니다.

  • 그런 다음 A * (또는 일반적으로 길 찾기 최적화)의 변형이있어 다음과 같은 특정 상황에보다 빠르게 또는 더 적응할 수 있습니다 ( 관련 답변cstheory.SE포괄적 인 목록 참조 ).

    • LPA * -A *와 유사하지만 그래프를 조금만 변경하면 최상의 경로를 더 빠르게 다시 계산할 수 있습니다
    • D * Lite -LPA *를 기준으로 동일한 기능을 수행하지만 "시작점"은 그래프를 변경하는 동안 마무리를 향해 움직이는 단위라고 가정합니다.
    • HPA * (계층 구조) -서로 다른 추상화 수준에서 여러 계층을 사용하여 검색 속도를 높입니다. 예를 들어, 높은 수준의 계층은 단순히 방을 연결하는 반면, 낮은 수준의 계층은 장애물을 피합니다.
    • IDA * (반복 심화) - 반복 심화를 사용하여 일반 A *에 비해 메모리 사용량을 줄입니다.
    • SMA * (Simplified Memory-Bounded) -사용 가능한 메모리 만 사용하여 검색을 수행합니다.
    • Jump Point Search-언급에 대한 코멘트에서 Eric에게 크레딧을 제공합니다! 균일 한 비용의 그리드 맵 ( link ) 에서 길 찾기 속도를 높 입니다.

2 부-검색 공간 표현

마지막 으로이 질문을 해결하십시오.

나는 A *가 2D 게임에서 사용하는 알고리즘과 같다는 것을 알고 있습니다. 훌륭하지만 모두 그리드 기반이 아닌 2D 게임은 어떻습니까?

여기에 두 가지 큰 오해가 있습니다! 사실로:

  1. A *는 게임이 2D인지 3D인지 상관하지 않으며 두 경우 모두 동일합니다.
  2. A *는 모든 그래프 표현에서 작동 하므로 월드가 그리드인지 아닌지 상관하지 않습니다.

세상이 격자가 될 필요가 없다면, 다른 방법으로 표현할 수 있습니까? 다음은 길 찾기를 위해 월드 공간을 분할하는 방법에 대한 간략한 개요입니다. 이러한 대부분은 2D 및 3D 모두에서 작동합니다.

  • 직사각형 그리드 -그리드의 각 셀이 그래프에서 하나의 노드 인 월드를 규칙적인 정사각형 그리드로 분할하고 두 개의 방해받지 않은 노드 사이의 연결은 모서리입니다.

    여기에 이미지 설명을 입력하십시오

  • Quadtree- 공간을 분할하는 또 다른 방법이지만 규칙적인 크기의 셀 그리드로 분할하는 대신 4로 분할 한 다음 각각 4 개로 재귀 적으로 분할합니다. 세 번째 차원을 추가하면 octree가 됩니다.

    여기에 이미지 설명을 입력하십시오

  • 볼록 다각형 -보행 가능 영역을 상호 연결된 볼록 다각형 메쉬로 분할합니다. 각 다각형은 노드가되고 공유 가장자리는 그래프의 가장자리입니다. 예를 들어 삼각형 일 수도 있고 레벨 애셋을 만들 때 아티스트가 만든 메시 일 수도 있습니다. 네비게이션 메쉬 라고도합니다 . 이 링크를 참조하십시오 . 매우 인기있는 내비게이션 메시 구성 툴셋이 있습니다 : Recast .

    여기에 이미지 설명을 입력하십시오

  • 가시성 포인트 -가장 일반적인 방법은 장애물의 볼록한 정점 바로 바깥에 노드를 배치 한 다음 서로를 있는 각 노드 쌍을 연결하는 것 입니다. 이 링크를 확인하십시오 . 노드는 꼭짓점 일 필요는 없으며 맵에서 디자이너가 수동으로 배치 할 수 있습니다. 이 경우 시스템을 종종 웨이 포인트 그래프 라고합니다 .

    여기에 이미지 설명을 입력하십시오


1
2 개의 링크 : 1) Mikko Mononen 은 경로 검색 작업 Killzone 3을 수행 했으며, MIT 라이센스하에 Recast (navmesh generator) 및 Detour (path find toolkit)의 개발 프로세스를 문서화 한 예를 들어 매우 훌륭한 블로그를 가지고 있습니다. 에서 레크 닝 : Amalur의 왕국 . 2) 점프 포인트 검색 은 그리드 기반 경로 찾기에서 가장 최근에 개발 된 것 중 하나라고 생각합니다.
Eric
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.