[1113 박민수]a star_알고리즘

2,728 views
2,162 views

Published on

A* Algorithm

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,728
On SlideShare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
24
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

[1113 박민수]a star_알고리즘

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

×