5장 그래프의 비밀 (Programming Game AI by Example)

6,160 views

Published on

Programming Game AI by Example
Chapter.5

아꿈사 스터디 http://cafe.naver.com/architect1
실용적 예제로 본 게임인공지능 프로그래밍하기

Published in: Technology
0 Comments
12 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,160
On SlideShare
0
From Embeds
0
Number of Embeds
1,242
Actions
Shares
0
Downloads
0
Comments
0
Likes
12
Embeds 0
No embeds

No notes for slide

5장 그래프의 비밀 (Programming Game AI by Example)

  1. 1. Programming Game AI by Example<br />5. 그래프의 비밀<br />아키텍트를 꿈꾸는 사람들(http://cafe.naver.com/architect1)<br />현수명 (http://soomong.tistory.com)<br />
  2. 2. 그래프<br /><ul><li> 그래프, 트리
  3. 3. 그래프 클래스 구현하기</li></ul>그래프 탐색 알고리즘<br /><ul><li>무정보 그래프 탐색
  4. 4. 깊이 우선 탐색
  5. 5. 너비 우선 탐색
  6. 6. 비용 기반 그래프 탐색
  7. 7. Dijkstra Algorithm
  8. 8. Dijkstra Algorithm A*</li></li></ul><li>그래프<br /><ul><li> 그래프, 트리
  9. 9. 그래프 클래스 구현하기</li></ul>그래프 탐색 알고리즘<br /><ul><li>무정보 그래프 탐색
  10. 10. 깊이 우선 탐색
  11. 11. 너비 우선 탐색
  12. 12. 비용 기반 그래프 탐색
  13. 13. Dijkstra Algorithm
  14. 14. Dijkstra Algorithm A*</li></li></ul><li>Graph<br />그래프의 정의<br />
  15. 15. 이산수학 Example 5.2<br />Graph<br />Node<br />a3<br />Edge ( Arc )<br />g(aX)<br />함수<br />2<br />a2<br />a4<br />a1<br />a6<br />a5<br />1<br />3<br />4<br />5<br />5개의 Node와 6개의 Edge<br />
  16. 16. 이산수학 Definition<br />Graph<br />그래프는 순서쌍 (N, A, g)이다<br />N : Node 들의 집합. (공집합 안됨)<br />A : Arc 들의 집합. (공집합 허용,유한개)<br />g : Arc a 의 끝점이라고 하는 비순서쌍 x-y 가 <br />각각의 arc a 로 사상하는 함수<br />
  17. 17. 이산수학 Definition<br />트리Tree<br />트리는root 라고 지정된 노드를 갖는<br />비순환(acyclic), 연결(connected) 그래프이다<br />r<br />r<br />
  18. 18. Dense vs Sparse Graph<br />밀집한 vs성긴 그래프<br />
  19. 19. Digraph<br />방향성 그래프<br />
  20. 20. 이산수학 Example 5.4<br />a5<br />a1<br />a2<br />a3<br />2<br />4<br />1<br />a4<br />3<br />g(a3) = (1,3)<br />g(a4) = (3,1)<br />g(a1) = (1,2)<br />
  21. 21. Game AI Graph<br />게임 AI 에서의 그래프<br />Navigation Graph<br />
  22. 22. Game AI Graph<br />게임 AI 에서의 그래프<br />State Graph<br />Dependency Graph<br />
  23. 23. 그래프<br /><ul><li> 그래프, 트리
  24. 24. 그래프 클래스 구현하기</li></ul>그래프 탐색 알고리즘<br /><ul><li>무정보 그래프 탐색
  25. 25. 깊이 우선 탐색
  26. 26. 너비 우선 탐색
  27. 27. 비용 기반 그래프 탐색
  28. 28. Dijkstra Algorithm
  29. 29. Dijkstra Algorithm A*</li></li></ul><li>그래프 클래스 구현하기<br />Adjacency Matrix<br />인접행렬<br />Adjacency List<br />인접리스트<br />
  30. 30. 이산수학<br />그래프에 대한 컴퓨터 표현방식<br />인접 행렬<br />adjacency matrix<br />]<br />A = [<br />1<br />1 1 - 1<br />1 - 1 -<br />- 1 - 1<br />1 - 1 -<br />2<br />3<br />4<br />행렬 원소 (1,1) 의 값 1 은 <br />노드1 에서의 루프를 나타낸다<br />모든 무방향성 그래프의 인접행렬은 대칭적이다.<br />
  31. 31. 이산수학<br />그래프에 대한 컴퓨터 표현방식<br />인접 리스트<br />adjacency list<br />즉 Linked list<br />1<br />1<br />2<br />4 •<br />1<br />1<br />3 •<br />2<br />2<br />3<br />3<br />4<br />4 •<br />2<br />4<br />1<br />3<br />3 •<br />4<br />
  32. 32.
  33. 33.
  34. 34.
  35. 35.
  36. 36. 그래프<br /><ul><li> 그래프, 트리
  37. 37. 그래프 클래스 구현하기</li></ul>그래프 탐색 알고리즘<br /><ul><li>무정보 그래프 탐색
  38. 38. 깊이 우선 탐색
  39. 39. 너비 우선 탐색
  40. 40. 비용 기반 그래프 탐색
  41. 41. Dijkstra Algorithm
  42. 42. Dijkstra Algorithm A*</li></li></ul><li>WARNING!<br />Beware! <br />Search algorithms have the ability to create in the average human<br />brain terrible amounts of frustration and confusion, leading to headaches,<br />nausea, and sleep deprivation. <br />Spontaneous and excessive howling is not uncommon. <br />Please be aware these symptoms are commonplace in the early<br />stages of the learning curve and are not generally cause for concern. <br />Normal service is usually resumed within a reasonable length of time. <br />(If symptoms persist, however, stay clear of busy roads, razor blades, and<br />loaded weapons. Seek medical advice at the earliest opportunity.)<br />경고! <br />탐색 알고리즘은 수많은 좌절과 혼동으로, 두통, 메스꺼움, 수면 결핍을 통하여 보통 사람의 두뇌로 생성될 수 있다. <br />자발적이고 과도한 울부짖음은 보통이다.<br />이러한 증상은 배우는 초기 단계에서 동반되는 것으로 일반적으로 관심을 끌지 못함에 유의한다.<br />보통의 서비스는 대개 합리적인 시간 내에 재개된다. <br />( 그러나 증상이 계속 된다면, 복잡한 도로, 레이저날, 장착된 무기를 제거하고, 기회가 있을 때 빨리 의사를 찾아간다)<br />
  43. 43. 그래프<br /><ul><li> 그래프, 트리
  44. 44. 그래프 클래스 구현하기</li></ul>그래프 탐색 알고리즘<br /><ul><li>무정보 그래프 탐색
  45. 45. 깊이 우선 탐색
  46. 46. 너비 우선 탐색
  47. 47. 비용 기반 그래프 탐색
  48. 48. Dijkstra Algorithm
  49. 49. Dijkstra Algorithm A*</li></li></ul><li>Depth First Search<br />깊이 우선 탐색<br />그래프를 가능한 깊게 이동하여 탐색한다.<br /> - 막다른 곳에 도달하면 더 얕은 노드로 되돌아간다.<br />깊이 탐색 Algorithm<br />Stack<br /> LIFO <br />
  50. 50. Depth First Search<br />깊이 우선 탐색<br />
  51. 51. Depth First Search<br />깊이 우선 탐색<br />
  52. 52. Depth First Search<br />깊이 우선 탐색<br />
  53. 53. Depth First Search<br />깊이 우선 탐색<br />
  54. 54. 5 에서 3 찾아가기<br />Depth First Search<br />깊이 우선 탐색<br />
  55. 55. Depth First Search<br />깊이 우선 탐색<br />
  56. 56. Depth First Search<br />깊이 우선 탐색<br />
  57. 57. Depth First Search<br />깊이 우선 탐색<br />
  58. 58. Found!!<br />Depth First Search<br />깊이 우선 탐색<br />
  59. 59. Depth First Search<br />깊이 우선 탐색<br />5 – 2 – 1 -3<br />
  60. 60. Depth First Search<br />깊이 우선 탐색<br />
  61. 61. 그래프<br /><ul><li> 그래프, 트리
  62. 62. 그래프 클래스 구현하기</li></ul>그래프 탐색 알고리즘<br /><ul><li>무정보 그래프 탐색
  63. 63. 깊이 우선 탐색
  64. 64. 너비 우선 탐색
  65. 65. 비용 기반 그래프 탐색
  66. 66. Dijkstra Algorithm
  67. 67. Dijkstra Algorithm A*</li></li></ul><li>Breadth First Search<br />너비 우선 탐색<br />시작노드에서 인접한 각 노드들를 검사하고<br />목표노드를 찾을때까지 시작 노드에서 <br /> - 하나의 에지만큼 떨어진 노드<br /> - 두개의 에지만큼 떨어진 노드<br /> - 세개의 에지만큼 떨어진 노드 등을 탐색한다.<br />즉 이렇게 찾은 경로는 가장 적은 에지를 포함하도록 보장된다.<br />너비 탐색 Algorithm<br />Queue<br /> FIFO<br />
  68. 68. Breadth First Search<br />너비 우선 탐색<br />
  69. 69. 5 에서 3 찾아가기<br />Breadth First Search<br />너비 우선 탐색<br />
  70. 70. Breadth First Search<br />너비 우선 탐색<br />
  71. 71. Breadth First Search<br />너비 우선 탐색<br />
  72. 72. Breadth First Search<br />너비 우선 탐색<br />
  73. 73. Breadth First Search<br />너비 우선 탐색<br />
  74. 74. Found!!<br />Breadth First Search<br />너비 우선 탐색<br />
  75. 75. Breadth First Search<br />너비 우선 탐색<br />5 – 4 – 3<br />
  76. 76. Breadth First Search<br />너비 우선 탐색<br />
  77. 77. 그래프<br /><ul><li> 그래프, 트리
  78. 78. 그래프 클래스 구현하기</li></ul>그래프 탐색 알고리즘<br /><ul><li>무정보 그래프 탐색
  79. 79. 깊이 우선 탐색
  80. 80. 너비 우선 탐색
  81. 81. 비용 기반 그래프 탐색
  82. 82. Dijkstra Algorithm
  83. 83. Dijkstra Algorithm A*</li></li></ul><li>비용 기반 그래프 탐색<br />경로 1-5-4-3 은 <br />더 많은 에지를 포함하지만<br />경로 1-2-3 보다 짧을수있다<br />
  84. 84. Edge relaxation<br />에지 완화<br />시작 노드에서 목표까지의 경로에 있는 다른 노드들까지<br />“지금까지 발견된 가장 좋은 경로 에 대한 정보” 를 수집한다.<br />이 정보는 새로운 에지가 검사되면 갱신된다.<br />경로가 기존의 최상 경로 대신 새롭게 검사되는 에지를 사용함으로써 <br />더 짧아진다고 추론되면, 그 에지가 추가되고 경로가 갱신된다.<br />노드4 의 시작을 3에서 5로 변경하면<br />경로도 변경된다.<br />
  85. 85. Edge relaxation<br />if (TotalCostToThisNode[t] > TotalCostToThisNode[n] + EdgeCost(n-to-t))<br />{<br />TotalCostToThisNode[t] = TotalCostToThisNode[n] + EdgeCost(n-to-t));<br /> Parent(t) = n;<br />}<br />신축적으로 확장되는 일련의 고무줄이<br />덜 팽팽해지는 방법과 유사<br />
  86. 86. Shortest Path Tree<br />최단경로트리<br /> 어떤 노드에서 시작노드까지 최단 경로를 나타내는 G 의 부트리<br />
  87. 87. 그래프<br /><ul><li> 그래프, 트리
  88. 88. 그래프 클래스 구현하기</li></ul>그래프 탐색 알고리즘<br /><ul><li>무정보 그래프 탐색
  89. 89. 깊이 우선 탐색
  90. 90. 너비 우선 탐색
  91. 91. 비용 기반 그래프 탐색
  92. 92. Dijkstra Algorithm
  93. 93. Dijkstra Algorithm A*</li></li></ul><li>Dikjstra’s Algorithm<br />“컴퓨터가 생각할수있는가에 대한 질문은<br /> 잠수함이 헤엄칠수 있는가의 질문과 같다”<br />가중그래프에서 최단 경로를 찾는 알고리즘<br /> - Shortest Path Tree 에 시작 노드를 추가<br /> - 시작노드에서 아직 SPT 에 존재하지 않는 노드에 대해서<br />그 둘사이의 최단경로를 가지는 에지를 추가<br /> - 한번에 하나의 에지를 추가하여 최단경로트리를 구축<br />SPTAlgorithm<br />PriorityQueue<br />
  94. 94. Dikjstra’s Algorithm<br />노드 5 에서 3 으로 가는 경로 찾기<br />1. 노드 5 를 SPT 에 추가<br />2. 노드 5 에서 나가는 에지 5-2,5-6 을SearchFrontier에 추가<br />3. 노드5 -> 노드2 가기위한 비용 1.9 와<br /> 노드5 -> 노드6 가기위한 비용 3.0 을 비교하고<br />더 비용이 낮은 노드 2가 결정<br />
  95. 95. Dikjstra’s Algorithm<br />노드 5 에서 3 으로 가는 경로 찾기<br />4. 결정된 노드 2 가 SPT 에 추가되고 <br />노드 2 에서 나가는 에지 2-3도 SearchFrontier에 추가<br />5. 노드5 -> 노드3 가기위한 비용 1.9 + 3.1 = 5.0 과<br /> 노드5 -> 노드6 가기위한 비용 3.0 비교한뒤 <br />더 짧은 노드6 이 결정<br />
  96. 96. Dikjstra’s Algorithm<br />노드 5 에서 3 으로 가는 경로 찾기<br />6. 결정된 노드 6 이 SPT 에 추가되고 <br />노드 6 에서 나가는 에지 6-4도 SearchFrontier에 추가<br />7. 노드5 -> 노드3 가기위한 비용 1.9 + 3.1 = 5.0 과<br /> 노드5 -> 노드4 가기위한 비용 3.0 + 1.1 = 4.1 을 비교한뒤 <br />더 짧은 노드4 이 결정<br />
  97. 97. Dikjstra’s Algorithm<br />노드 5 에서 3 으로 가는 경로 찾기<br />Edge relaxation<br />에지 완화<br />8. 결정된 노드 4 가 SPT 에 추가되고 노드 4 에서 나가는 <br />에지 4-3도 SearchFrontier에 추가되면 좋겠지만 추가 안됨<br />이유는 노드 3까지 가능한 경로를 둘다 검사하여 짧은노드만을<br />선택하기 때문. 2-3 은 SF 에 있지만 4-3 은 SF 에 들어가지 않음<br />9. 노드5 -> 노드3 가기위한 비용 1.9 + 3.1 = 5.0 과<br /> 노드5 -> 노드3 가기위한 비용 3.0 + 1.1 + 3.7= 7.8 을 비교한뒤 <br />더 짧은 노드 3 이 결정 (5-2-3 의 노드3)<br />
  98. 98. Dikjstra’s Algorithm<br />노드 5 에서 3 으로 가는 경로 찾기<br />10. 결정된 노드 3 이 Target 노드이므로 종료<br />최단경로 : 5 – 2 -3<br />비용 : 1.9 + 3.1 = 5.0<br /> - 노드 1 은 노드1로 도달할수있는 에지가 없으므로 <br />고려대상이 안된다<br />
  99. 99. Dikjstra’s Algorithm<br />
  100. 100. Dikjstra’s Algorithm<br />PriorityQueue<br /> 큐의 원소들이 우선순위로 <br />정렬되도록 해주는 큐 <br />
  101. 101. Dikjstra’s Algorithm<br />IndexPriorityQueue<br />Index 와 실제정보를 따로 관리<br /><= 과 >= 연산자의 <br />정확한 동작을 위해 <br />노드를 저장하는것이 아니라<br />노드의 Index 를 저장<br />
  102. 102. Dikjstra’s Algorithm<br />5 에서 3 찾아가기<br />
  103. 103. Dikjstra’s Algorithm<br />
  104. 104. Dikjstra’s Algorithm<br />
  105. 105. Dikjstra’s Algorithm<br />
  106. 106. Dikjstra’s Algorithm<br />
  107. 107. Dikjstra’s Algorithm<br />Found!!<br />
  108. 108. Dikjstra’s Algorithm<br />
  109. 109. 그래프<br /><ul><li> 그래프, 트리
  110. 110. 그래프 클래스 구현하기</li></ul>그래프 탐색 알고리즘<br /><ul><li>무정보 그래프 탐색
  111. 111. 깊이 우선 탐색
  112. 112. 너비 우선 탐색
  113. 113. 비용 기반 그래프 탐색
  114. 114. Dijkstra Algorithm
  115. 115. Dijkstra Algorithm A*</li></li></ul><li>Dikjstra’s Algorithm : A*<br />Heuristic<br />각 노드에서 목표까지의 비용을 추정<br />추정한 값을 토대로 경로를 계산하는 알고리즘<br />A* Algorithm<br />Euclidean 거리<br />ㅡ맨하탄 거리<br />ㅡ맨하탄 거리 >ㅡ Euclidean<br />ㅡ맨하탄 거리<br />
  116. 116. Dikjstra : A*<br />
  117. 117. Dikjstra : A*<br />F = G + H<br /> F = 실제비용 + 추정비용<br />
  118. 118. Dikjstra : A*<br />
  119. 119. Dikjstra : A*<br />
  120. 120. Practice makes Perfect<br /> 연습이 완벽하게 만든다<br />감사합니다<br />

×