사전 계산 된 길 찾기가 여전히 관련이 있습니까?


12

문맥

Old Lucas Arts (ScummVM 시대) 포인트 앤 클릭 그래픽 어드벤처 게임은 사전 계산 된 길 찾기를 사용했습니다. 기술의 대략적인 개요는 다음과 같습니다.

1 단계

각 방의 바닥은 "워크 박스 (walk box)"로 나뉘어 졌는데, 이것은 네비게이션 메쉬의 노드와 거의 같지만 사다리꼴 모양으로 제한되었습니다. 예 :

 ______ _____ _________ _____
\   A  |  B  |    C    |  D   \
 \_____|     |         |_______\
       |_____|         |
             |_________|

2 단계

오프라인 알고리즘 (예 : Dijkstra 또는 A *)은 각 노드 쌍 사이의 최단 경로를 계산하고 경로 의 첫 번째 단계를 2D 매트릭스에 저장하며 사용 된 시작 및 끝 노드에 의해 각 차원에서 색인화됩니다. 예 : 위의 도보 상자 사용 :

      ___ ___ ___ ___
     | A | B | C | D | <- Start Node
  ___|___|___|___|___|
 | A | A | A | B | C |  ---
 |___|___|___|___|___|     |
 | B | B | B | B | C |     |
 |___|___|___|___|___|     |-- Next node in shortest path
 | C | B | C | C | C |     |   from Start to End
 |___|___|___|___|___|     | 
 | D | B | C | D | D |  ---
 |___|___|___|___|___| 
   ^
   |
End Node

짐작할 수 있듯이, 노드 수가 증가함에 따라 메모리 요구 사항이 빠르게 증가합니다 (N ^ 2). short는 일반적으로 각 항목을 매트릭스에 저장하기에 충분히 크므로 300 개의 노드로 구성된 복잡한 맵을 사용하면 추가 저장이 가능합니다.

300^2 * sizeof(short) = 176 kilobytes

3 단계

반면에, 두 노드 사이의 최단 경로를 계산하는 것은 행렬에 대한 일련의 조회만으로 매우 빠르고 사소한 작업이었습니다. 다음과 같은 것 :

// Find shortest path from Start to End
Path = {Start}
Current = Start
WHILE Current != End
    Current = LookUp[Current, End]
    Path.Add(Current)
ENDWHILE

이 간단한 알고리즘을 적용하여 C에서 A까지의 최단 경로를 찾습니다.

1) Path = { C }, Current = C
2) Path = { C, B }, Current = B
3) Path = { C, B, A }, Current = A, Exit

질문

오늘날의 강력한 하드웨어와 모든 수준 에서이 작업을 수행하는 데 필요한 메모리 요구 사항과 함께이 기술 한 번의 이점은 이제 런타임에 단순히 A *를 수행하여 가중치를 초과한다고 생각합니다.

또한 현재 메모리 조회가 일반 계산보다 느릴 수 있다고 들었습니다. 따라서 사인 및 코사인 조회 테이블을 만드는 것이 더 이상 인기가없는 이유입니다.

그러나 저수준의 하드웨어 효율성에 대한 지식이 아직 충분하지 않다는 점을 인정해야하므로이 기회를 통해 해당 주제에 대해 더 잘 알고있는 사람들의 의견을 묻습니다.

내 엔진에서는 런타임에 그래프에 노드를 동적으로 추가하고 제거하는 기능이 필요했습니다 (이 참조 ). 사전 계산 된 경로로 인해 작업이 더 복잡해 졌으므로 스크랩했습니다 (런타임 A * 솔루션이 이미 완벽하게 실행되고 있음은 말할 것도 없습니다) ). 아직도, 나는 궁금하게 남아 있었다 ...

요컨대, 이 기술은 오늘날 어떤 시나리오에서도 여전히 관련이 있습니까?


2
CPU 예산이 부족한 경우 여전히 관련이 있다고 생각합니다. 그러나 일단 동적 경로를 원하면 더 이상 유용하지 않습니다. Btw 나는 당신이 당신의 A * 알고리즘을 어디서 얻었는지 살펴 보았고 minheap과 다른 트릭을 사용하여 더 최적화 할 수 있습니다. C #에서 A *를 개선하는 몇 가지 반복을 수행했습니다. roy-t.nl/index.php/2011/09/24/… 유용 할 수 있습니다.
Roy T.

1
고마워요, 나는 그것을 북마크에 추가하고 내 응용 프로그램 최적화를 시작할 때 그것을 조사 할 것입니다. 에릭 리퍼 (Eric Lippert)의 솔루션은 약간 깨끗하고 이해하기 쉽기 때문에 몇 가지 사소한 수정으로 거의 사용했습니다.
David Gouveia

1
사전 계산을 수행하기로 결정한 경우 Floyd-Warshall 알고리즘 을 살펴볼 수 있습니다 . Dijkstra / A *를 반복적으로 사용하는 것보다“다음 단계”매트릭스를보다 효율적으로 만듭니다.
amitp

@amitp 팁을 주셔서 감사합니다. 이러한 대안에 대해 항상 알고있는 것이 좋습니다! 대부분의 경우 사전 계산이 오프라인으로 수행되기 때문에보다 효율적으로 얻을 수있는 이점은 많지 않습니다. 정말로 참을성이 없다면 :-)
David Gouveia

Floyd-Warshall도 Dijkstra의 알고리즘보다 구현하기가 훨씬 간단하지만 Dijkstra를 구현하지 않은 경우 살펴볼 가치가 있습니다. :)
amitp

답변:


3

내 엔진에서는 런타임에 그래프에 노드를 동적으로 추가 및 제거 할 수있는 기능이 필요했습니다 (이 참조). 사전 계산 된 경로로 인해 작업이 더 복잡 해져서 폐기했습니다 (런타임 A * 솔루션이 이미 완벽하게 실행되고 있음은 말할 것도 없습니다) ). 아직도, 나는 궁금하게 남아 있었다 ...

요컨대,이 기술은 오늘날 어떤 시나리오에서도 여전히 관련이 있습니까?

그러한 기술을 사용하면 아무런 이점이 없습니다.

그래프의 유연성이 부족합니다 (다른 LOD를 가질 수 있으며 특정 모양 일 필요는 없습니다 ...). 또한 엔진의 모든 사용자는 그래프가 무엇이며 그래프를 사용하는 방법을 알고 있습니다. 따라서 추가 기능을 추가하려면 완전히 새로운 상황을 사용하여 확장을 구현하는 방법을 배워야합니다.

언급했듯이 끔찍하게 확장되는 것처럼 보입니다. 또한 그래프가 현금에 적합하고 모든 경로 결과를 연속적으로 실행하면 IO 시간이 실제로 줄어 듭니다. 구현이 캐시에 비해 너무 커질 것 같습니다.

또한 현재 메모리 조회가 일반 계산보다 느릴 수 있다고 들었습니다. 따라서 사인 및 코사인 조회 테이블을 만드는 것이 더 이상 인기가없는 이유입니다.

캐시에 모든 프로그램과 필요한 메모리를 모두 넣을 수 없다면 프로세서를 병목에 넣기 전에 메모리를 넣거나 빼낼 때 병목이 생길 것입니다.

오늘날의 강력한 하드웨어와 모든 수준 에서이 작업을 수행하는 데 필요한 메모리 요구 사항과 함께이 기술 한 번의 이점은 이제 런타임에 단순히 A *를 수행하여 가중치를 초과한다고 생각합니다

또한 많은 게임에는 AI 업데이트를위한 별도의 루프가 있습니다. 그가 내 프로젝트를 설정하는 방법은 60hz에서 사용자 입력에 대한 업데이트 루프가 있고 AI는 20hz에 불과하며 게임은 가능한 한 빨리 그리는 것입니다.

또한 부수적으로 나는 재미를 위해 GBA 프로그래밍을했는데 현대 장치를 사용하는 데 전혀 아무런 영향을 미치지 않았습니다. GBA의 경우 모든 것이 프로세서의 작업 부하를 최소화하는 것과 관련이있었습니다. 또한 대부분의 고급 언어 C # 및 Java (C ++ 또는 C는 아님)가 수많은 최적화를 수행한다는 사실을 알아야합니다. 코드 최적화는 가능한 한 적은 메모리에 액세스하는 것 외에는 할 일이 많지 않으며 캐시에서 충돌하여 새 메모리를 가져 오기 전에 가능한 한 많은 계산을 수행하는 경우 한 번만 수행하십시오.

편집 : 또한 제목에 대답하려면 그렇습니다. 자주 사용하는 경로를 사전 계산하는 것은 훌륭한 아이디어이며 게임 루프 외부의 어느 곳에서나 A *로 수행 할 수 있습니다. 예를 들어, RTS의 자원을 기반으로 자원을 수집하여 퇴사 또는 복귀를 원할 때마다 모임이 재 계산 될 필요가 없습니다.


편집에 대해, 나는 자주 사용되는 경로를 사전 계산하는 것에 대해 이야기하는 것이 아니라 가능한 모든 단일 경로 를 사전 계산하는 개요에 대해 엄격하게 이야기했습니다 . 또한 대부분의 답변이 사전 계산 된 경로 찾기를 사용하는 방법에 대해 약간 혼란 스럽지만 결국에는 그것이 훌륭한 아이디어라고 말했습니다. 그렇다면 GBA와 같은 CPU 제한 환경에서 유용합니까?
David Gouveia

1
내 나쁜 나는 문맥에서 벗어난 당신의 제목에 대한 대답이 그렇다는 것을 지적하려고 노력했습니다. 귀하의 질문에 설명 된 특정 알고리즘과 관련된 대답은 아니오입니다. 따라서 짧은 사전 계산에서 가능한 모든 경로는 나쁜 생각이지만 자주 사용되는 몇 가지 경로를 사전 계산하는 것이 좋습니다.
ClassicThunder

2
@ClassicThunder : 몇몇 랜드 마크 에서 모든 경로를 사전 계산하는이 기법 은 종종 ALT : 랜드 마크 및 삼각형 비 균일
Pieter Geerkens
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.