A * 길 찾기가 작동하는 방식을 기본적으로 이해하고 싶습니다. 시각화뿐만 아니라 모든 코드 또는 의사 코드 구현이 도움이 될 것입니다.
A * 길 찾기가 작동하는 방식을 기본적으로 이해하고 싶습니다. 시각화뿐만 아니라 모든 코드 또는 의사 코드 구현이 도움이 될 것입니다.
답변:
온라인으로 찾을 수있는 수많은 코드 예제와 A *에 대한 설명이 있습니다. 이 질문에는 유용한 링크가 많은 훌륭한 답변이 많이 있습니다. 내 대답에서는 코드 또는 설명보다 이해하기 쉬운 알고리즘의 그림 예제를 제공하려고합니다.
A *를 이해하려면 먼저 Dijkstra의 알고리즘을 살펴 보는 것이 좋습니다 . Dijkstra의 알고리즘이 검색을 위해 수행 할 단계를 안내해 드리겠습니다.
시작 노드는 A
최단 경로를 찾고 싶습니다 F
. 그래프의 각 가장자리에는 관련된 이동 비용이 있습니다 (가장자리 옆에 검은 색 숫자로 표시됨). 우리의 목표는 목표 노드에 도달 할 때까지 그래프의 각 정점 (또는 노드)에 대한 최소 이동 비용을 평가하는 것입니다.
이것이 우리의 출발점입니다. 검사 할리스트 노드가 있는데,이리스트는 현재 다음과 같습니다 :
{ A(0) }
A
의 비용이 0
있고 다른 모든 노드는 무한대 로 설정됩니다 (일반적인 구현에서는 비슷 int.MAX_VALUE
하거나 유사합니다).
우리는 노드 목록에서 가장 저렴한 비용으로 노드를 가져옵니다 (목록에 포함되어 있기 때문에 A
후보자입니다) 모든 이웃을 방문하십시오. 각 이웃 의 비용 을 다음과 같이 설정 했습니다.
Cost_of_Edge + Cost_of_previous_Node
이전 노드를 추적합니다 (노드 아래에 작은 분홍색 문자로 표시). A
이제는 해결됨 (빨간색)으로 표시되어 다시 방문하지 않습니다. 후보자 목록은 다음과 같습니다.
{ B(2), D(3), C(4) }
다시 한 번, 목록 ( B
) 에서 가장 저렴한 비용으로 노드를 가져 와서 이웃을 평가합니다. 의 경로 D
가의 현재 비용보다 비싸 D
므로이 경로를 무시할 수 있습니다. E
후보 목록에 추가됩니다. 이제 다음과 같습니다.
{ D(3), C(4), E(4) }
검사 할 다음 노드는 이제 D
입니다. C
경로가 기존 비용보다 짧지 않으므로에 대한 연결을 버릴 수 있습니다 . 짧은 경로를 찾았 E
으므로 비용 E
과 이전 노드가 업데이트됩니다. 우리의 목록은 다음과 같습니다 :
{ E(3), C(4) }
이전과 마찬가지로 목록에서 가장 저렴한 비용으로 노드를 검사합니다 E
. E
하나의 미해결 이웃 만 있으며 이는 또한 대상 노드입니다. 대상 노드에 도달하는 비용이로 설정되고 10
이전 노드 가로 설정 됩니다 E
. 후보자 목록은 다음과 같습니다.
{ C(4), F(10) }
다음으로 검사 C
합니다. 에 대한 비용과 이전 노드를 업데이트 할 수 있습니다 F
. 우리의 목록은 이제 F
최저 비용의 노드로 사용 되었으므로 완료되었습니다. 이전 최단 노드를 역 추적하여 경로를 구성 할 수 있습니다.
그래서 왜 A * 알고리즘 대신 Dijkstra를 설명했는지 궁금 할 것입니다 . 글쎄, 유일한 차이점은 후보자를 어떻게 평가 (또는 분류) 하는가에있다. Dijkstra를 사용하면 다음과 같습니다.
Cost_of_Edge + Cost_of_previous_Node
A *를 사용하면 다음과 같습니다.
Cost_of_Edge + Cost_of_previous_Node + Estimated_Cost_to_reach_Target_from(Node)
어디 Estimated_Cost_to_reach_Target_from
일반적이라고 휴리스틱 기능. 목표 노드에 도달하기위한 비용을 추정하는 기능입니다. 좋은 휴리스틱 기능을 사용하면 대상을 찾기 위해 더 적은 수의 노드를 방문해야합니다. Dijkstra의 알고리즘은 사방으로 확장되지만 A *는 (추론 적 덕분에) 대상 방향으로 검색합니다.
휴리스틱에 대한 Amit의 페이지 에는 일반적인 휴리스틱에 대한 좋은 개요가 있습니다.
A * 경로 찾기는 추론을 추가로 사용하는 가장 좋은 유형 검색입니다.
가장 먼저해야 할 일은 검색 영역을 나누는 것입니다. 이 설명에서는 대부분의 2D 게임이 타일 그리드를 사용하고 시각화하기 때문에 맵이 정사각형 타일 그리드입니다. 그러나 검색 영역은 16 진수 그리드 또는 위험과 같은 임의의 모양으로 원하는 방식으로 나눌 수 있습니다. 다양한 맵 위치를 "노드"라고하며이 알고리즘은 트래버스 할 노드가 많고 노드 사이에 연결을 정의 할 때마다 작동합니다.
어쨌든 주어진 시작 타일에서 시작합니다.
시작 타일 주위의 8 개 타일은 a) 현재 타일에서 다음 타일로 이동하는 비용 (일반적으로 수평 또는 수직 이동의 경우 1, 대각선 이동의 경우 sqrt (2))에 따라 "점수"로 표시됩니다.
그런 다음 각 타일에는 추가 "휴리스틱"점수가 할당됩니다. 즉, 각 타일로 이동할 상대적 가치의 근사치입니다. 다른 휴리스틱이 사용되는데, 가장 단순한 것은 주어진 타일의 중심과 끝 타일 사이의 직선 거리입니다.
그런 다음 현재 타일이 "닫히고"에이전트가 열려 있고 이동 점수가 가장 낮고 휴리스틱 점수가 가장 낮은 인접 타일로 이동합니다.
이 프로세스는 목표 노드에 도달하거나 더 이상 열린 노드가 없을 때까지 반복됩니다 (에이전트가 차단됨을 의미).
이러한 단계를 설명하는 다이어그램은이 초보자 용 자습서를 참조하십시오 .
휴리스틱을 개선 할 때 주로 개선 할 수있는 부분이 있습니다.
지형 차이, 거칠기, 가파른 정도 등을 고려
효율적인 경로가 아닌 맵의 영역을 차단하기 위해 그리드를 가로 질러 "스위프"를 수행하는 것도 유용합니다. 스위프 테스트가 없으면 에이전트는 먼저 U에 들어가서 돌아 서서 U의 가장자리를 돌아 다니게됩니다. "실제"지능형 에이전트는 U 자형 트랩을 인식하고 간단히 피합니다. 청소는 이것을 시뮬레이션하는 데 도움이 될 수 있습니다.
최고는 아니지만 몇 년 전 C ++에서 A *를 사용한 구현 입니다.
전체 알고리즘을 설명하는 것보다 리소스를 알려주는 것이 좋습니다. 또한, 위키 기사를 읽으면서 데모를 가지고 플레이하고 어떻게 작동하는지 시각화 할 수 있는지 확인하십시오. 특정 질문이 있으면 의견을 남겨주십시오.
경로 찾기 에 대한 ActiveTut의 기사가 유용 할 수 있습니다. 그것은 A *와 Dijkstra의 알고리즘과 그 차이점을 모두 다룹니다. Flash 개발자를 대상으로하지만 Flash를 사용하지 않더라도 이론에 대한 통찰력을 제공해야합니다.
A *와 Dijkstra의 알고리즘을 다룰 때 시각화해야 할 중요한 것은 A *가 지시된다는 것입니다. 어떤 방향으로 볼 것인지 "추측"하여 특정 지점까지의 최단 경로를 찾습니다. Dijkstra의 알고리즘은 / every / 지점까지의 최단 경로를 찾습니다.
따라서 첫 번째 진술처럼 A *는 그래프 탐색 알고리즘의 핵심입니다. 일반적으로 게임에서 우리는 타일 또는 다른 세계 지오메트리를 그래프로 사용하지만 다른 것에는 A *를 사용할 수 있습니다. 그래프 탐색을위한 두 가지 ur 알고리즘은 깊이 우선 검색과 너비 우선 검색입니다. DFS에서는 현재 노드의 형제를보기 전에 항상 현재 분기를 완전히 탐색하고 BFS에서는 항상 형제를 먼저보고 자식을 봅니다. A *는 원하는 목표에 가까워 질 때 지점 (DFS와 같이)을 탐색하는 지점 사이에서 중간 지점을 찾으려고 시도하지만 지점에서 더 나은 결과를 얻을 수있는 경우 형제를 중지하고 때로는 시도합니다. 실제 수학은 다음에 탐색 할 수있는 노드 목록을 유지하여 각 노드에 "좋은 점"이있는 것입니다. 점수는 목표와 얼마나 가까운 지 (어떤 종류의 추상적 의미로) 표시하며 점수가 낮을수록 좋습니다 (0은 목표를 찾았 음을 의미합니다). 점수의 최소값과 루트에서 떨어진 노드 수 (일반적으로 현재 구성 또는 경로 찾기의 현재 위치)를 찾아 다음에 사용할 것을 선택합니다. 노드를 탐색 할 때마다 모든 하위 항목을이 목록에 추가 한 다음 가장 새로운 하위 항목을 선택하십시오.
추상 수준에서 A *는 다음과 같이 작동합니다.