[1113 박민수]a star_알고리즘
DESCRIPTION
A* AlgorithmTRANSCRIPT
GPG1 – 3.3A* 길찾기 알고리즘의 기초
2010/11/13Devrookie 엠에스박 ( 박민수 )
목차
그래프 순회 복습A* 의 개요A* 의 특징A* 의 적용A* 의 약점Q & A 참고자료
그래프 순회 복습
Depth-First Search( 깊이 우선 탐색 )
1 4 2 3
5
1 5목표
시작도착거리 숫자
그래프 순회 복습
Breadth-First Search( 너비 우선 탐색 )
1 4
5
1 5목표
시작도착거리 숫자
그래프 순회 복습
Dijkstra Algorithm 각 노드사이의 거리를 저장하여 최단거리를
구한다 .
특정 노드까지 거리의 합을 저장하고 다른 경로와 비교하여 노드 이동때 마다 최단거리의 노드를 구한다 .
구해진 경로로 가면 최단거리가 된다 .
그래프 순회 복습
Dijkstra Algorithm
1 5
1 5목표
시작도착거리 숫자
그래프 순회 복습
Best-First Search 휴리스틱에 따라 가장 좋은 경로에 있다고
판단되는 노드로 이동한다 .
방문한 곳은 가지 않는다 .
도착점에 도달하면 알고리즘을 종료한다 .
그래프 순회 복습
Best-First Search
2 3 4
2 5목표
시작도착거리 숫자휴리스틱 (숫자 )
1 5
그래프 순회 복습
Best-First Search 휴리스틱을 기반으로 찾아낸다고 최적의 값이
나오는 것은 아니다 .2 3 4 1 5
거리 : 5 + 4 + 3 + 3 = 15
2 4 1 5
거리 : 3 + 3 + 3 = 9
A* 의 개요
Peter Hart, Nils Nilsson, Bertram Raphael 가 1968 년에 만든 그래프 순회 알고리즘이다 .
Edsger Dijkstra 가 1959 년에 만든 알고리즘의 확장판이다 .
A* 알고리즘은 Best-First 검색을 이용해 시작점에서 도착점까지의 가장 적은 비용을 사용하는 경로를 찾아낸다 .
A* 의 개요
조사하지 않은 노드중에서 가장 효율적이라고 판단되는 노드로 찾는다 .
찾아진 노드가 도착점이면 종료하고아니면 인접한 다른 노드들에서 찾는다 .
조사한 노드들은 Close List 에 담고조사하지 않은 노드들은 Open List 에 담는다 .
A* 의 개요
알고리즘의 시작 Close List 는 비어있다 . Open List 는 시작점만 들어있다 .
알고리즘의 흐름 Open List 에 있는 노드들 중 가장 효율적인 노드를
찾고 도착점인지 비교한다 . 아니라면 그 노드와 인접한 노드가 Close List 에
있으면 무시하고 Open List 에 있으면 그 노드까지의 경로 효율을 다시 계산해 더 효율적이면 갱신한다 .
A* 의 개요
효율적인 노드를 찾는 방법 시작점에서 해당 노드까지 가는 가장 적은
비용▪ CostFromStart
해당 노드에서 도착점까지 가는 가장 적은 비용▪ CostToGoal
이 두 비용의 합이 제일 적은 노드가 효율적이다 .
A* 의 개요
의사코드 Open List : Priority Queue Close List : List
StartNode.Location = StartLocation;StartNode.CostFromStart = 0;StartNode.CostToGoal = PathCostEstimate();StartNode.Parent = NULL;
OpenList.push( StartNode );
A* 의 개요
의사코드while( !OpenList.empty() ) {Node = OpenList.pop(); // 최저의 Cost
if( Node == Goal )return true;else인접한 노드들 추가
CloseList.push( Node );}
return false;
A* 의 개요
의사코드 ( 인접한 노드 추가 )for ( 인접한 노드들 ) {
if(새로운 노드가 CloseList나 OpenList에 있는데 비용이 최저비용 보다 크면 ){
무시한다 . }
}else {
새로운 노드를 초기화 해준다 . 새로운 노드가 CloseList에 있으면 OpenList로 옮긴다 . 새로운 노드가 OpenList에 있으면 갱신해준다 .
if( 새로운 노드가 CloseList와 OpenList에 없으면 ) OpenList에 새로운 노드를 넣어준다 .
}}
A* 의 특징
경로가 존재한다면 하나의 경로를 찾는다 .
경로가 존재하지 않는다면 모든 경로를 찾는다 .
최적의 경로를 찾는다 . ( 비용 계산이 올바르면 )
휴리스틱을 효율적으로 사용한다 .
평균적으로 빠른 성능을 보인다 .
A* 의 적용
노드의 표현 A* 를 게임에 적용하려면 게임의 길을 그래프로
표현해야 한다 .
길을 찾는 유닛에 대해 방향 , 속도등을 고려하고지형의 속성에 대해서도 고려하면 좀 더 지능적인길찾기가 가능하다 .
A* 의 적용
노드의 표현 공간 분할 정사각형 격자 쿼드 트리
볼록 다각형 가시점 일반화된 원통
A* 의 적용
노드의 표현 공간 분할▪ 정사각형 격자▪ 가장 간단한 방법이다 .
▪ 공간을 동일한 크기의 정사각형 격자로 분할한다 .
▪ 검색 위치는 정사각형 중심 혹은 모서리등 적절히 정한다 .
▪ 하나의 정사각형 격자 하나가 한 속성을 나타내게 하는게 좋다 .
A* 의 적용
노드의 표현 공간 분할▪ 쿼드 트리▪ 공간을 서로 다른 크기의 정사각형으로 분할한다 .
▪ 하나의 사각형을 점점 더 작은 사각형으로 분할한다 .
▪ 검색 위치는 정사각형 중심 혹은 모서리등 적절히 정한다 .
▪ 사각형의 크기가 클 수록 ( 상위 노드 일수록 ) 검색이 빠르다 .
A* 의 적용
노드의 표현 공간 분할▪ 볼록 다각형▪ 공간을 볼록 다각형으로 분할한다 .
▪ C-Cell : 각 정점과 가시점을 연결한 선으로 볼록 다각형을 만든다 .
▪ 최대 영역 해체 : 정점들을 연결하고 그 선중 짧은 것을 선택한다 .
▪ 네비게이션 메쉬 : 메쉬에 정보를 기록해 둔다 .
A* 의 적용
노드의 표현 공간 분할▪ 가시점▪ 공간을 분할하지 않고 직접 위치를 결정한다 .
▪ 각 장애물의 볼록 정점과 약간 떨어진 위치를 검색 위치로 한다 .
▪ 각 검색 위치 사이의 평균을 이용해 검색 위치를 더 생성하는 등검색 위치가 많이 잘 배치 될 수록 부드러운 길찾기를 하게
된다 .
A* 의 적용
노드의 표현 공간 분할▪ 일반화된 원통▪ 이웃하는 장애물 사이에 원통을 둔다 .
▪ 이 원통들을 이은 선들의 교점을 검색 위치로 한다 .
A* 의 적용
노드의 표현 공간 분할▪ 모든 곳들의 길을 잘 찾는지 지속적인 테스트가
필요하다 .
▪ 되도록 적은 검색 위치를 두고 모든 곳에 길찾기를 할 수 있게 하는 것이 좋다 .
▪ 이동이 부드럽게 보일 정도는 검색 위치를 두어야 한다 .
A* 의 적용
노드의 표현 이웃한 노드▪ 사각형 격자면 주위의 네칸의 노드들 .▪ 인덱스의 이동으로 쉽게 접근이 가능하다 .
▪ 아니면 선으로 연결된 노드들 .▪ 접근이 쉽게 이웃 정보들을 자료구조에 저장해 놓는게 좋다 .
A* 의 적용
노드의 표현 비용▪ 이동 거리
▪ 걸리는 시간
▪ 소비한 이동력
▪ 소비한 연료
A* 의 적용
노드의 표현 비용 계산▪ 출발 지점과 도착 지점
▪ 유닛의 타입
비용 저장▪ 이웃 정보와 같이 저장해 두는 것이 이상적이다 .
A* 의 적용
노드의 표현 추정▪ 최적의 경로를 찾기 위해서는 비용을 과대평가하지
말 것 .
▪ 맵 상의 최단 거리에 단위 거리당 최소 지형 비용을 적용 .
▪ 검색 속도를 높이기 위해서는 적절한 휴리스틱 가중치를두어야 한다 .
A* 의 적용
노드의 표현 추정
A* 의 적용
노드의 표현 추정
A* 의 약점
A* 도 막 만들고 적용하면 게임에서 사용하기 힘들 수 있다 .
맵의 크기가 크면 Open List, Close List가 커져서 메모리를 많이 사용하게 된다 .
맵의 크기가 크면 A* 를 위해 CPU 가 많이 사용될 것이다 .
A* 의 약점
도달할 수 없는 길을 다 돌아봐야 알 수 있다 . 미리 갈 수 있나 없나를 간단하게 판단하고
있다면 A* 를 계산하는게 효율적이다 .
Q&A
참고자료
GPG1 – 3.3 A* 길찾기 알고리즘의 기초 http://en.wikipedia.org/wiki/A*_search_algorithm – A*
Wikipedia http://www.policyalmanac.org/games/aStarTutorial.htm http://theory.stanford.edu/~amitp/GameProgramming/ http://redcarrot.tistory.com/45 http://sonia-searchalgorithms.blogspot.com/2008_04_01_archive.h
tml http://blog.naver.com/nsunlee?Redirect=Log&logNo=1300487484
00
마무리
The End