비용 기반 그래프 탐색

796 views

Published on

http://wawworld.me

changhoonpark@gmail.com

Published in: Education, Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
796
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

비용 기반 그래프 탐색

  1. 1. 게임 인공지능 GameAI 그래프 탐색 알고리즘 By Changhoon Park http://changhoonpark.wordpress.com Last Update : 2011. 08. 2811년 9월 19일 월요일
  2. 2. 경로: 1 - 2 - 3 경로: 1 - 5 - 4 - 3 2 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  3. 3. 3 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  4. 4. if (TotalCostToThisNode[t] > TotalCostToThisNode[n] + EdgeCost(n-to-t)) { TotalCostToThisNode[t] = TotalCostToThisNode[n] + EdgeCost(n-to-t)); Parent(t) = n; } 4 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  5. 5. 5 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  6. 6. NextClosestNode = 3.1 3 T 2 0.8 1.9 3.7 5 S pq.insert(m_iSource); 3.0 4 2.9 1.1 6 1 1.0 1 2 3 4 5 6 SPT SF 0-0 0-0 0-0 0-0 0-0 0-0 CTN 0.0 0.0 0.0 0.0 0.0 0.0 IPQ 5 6 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  7. 7. NextClosestNode = 5 3.1 3 T 2 0.8 1.9 3.7 1] int NextClosestNode = pq.Pop(); 5 S 2] m_ShortestPathTree[5] = m_SearchFrontier[5]; 3.0 4 2.9 3] if (NextClosestNode == m_iTarget) return 1.1 6 1 1.0 1 2 3 4 5 6 SPT 0-0 SF 0-0 0-0 0-0 0-0 0-0 0-0 CTN 0.0 0.0 0.0 0.0 0.0 0.0 IPQ 5 7 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  8. 8. NextClosestNode = 5 3.1 3 T 2 for (const Edge* pE=ConstEdgeItr.begin(); 0.8 !ConstEdgeItr.end(); pE=ConstEdgeItr.next()) 1.9 3.7 5 { S double NewCost = m_CostToThisNode[NextClosestNode] + pE->Cost(); 3.0 4 2.9 if (m_SearchFrontier[pE()->To()] == 0) 1.1 { 6 m_CostToThisNode[pE()->To()] = NewCost; 1 1.0 pq.insert(pE()->To()); m_SearchFrontier[pE()->To()] = pE(); } else if ( (NewCost < m_CostToThisNode[pE()->To()]) && 1 2 3 4 5 6 (m_ShortestPathTree[pE()->To()] == 0) ) { SPT 0-0 m_CostToThisNode[pE()->To()] = NewCost; SF 0-0 5-2 0-0 0-0 0-0 5-6 pq.ChangePriority(pE()->To()); CTN 0.0 1.9 0.0 0.0 0.0 3.0 m_SearchFrontier[pE()->To()] = pE(); } IPQ 2 6 } 8 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  9. 9. NextClosestNode = 2 3.1 3 T 2 0.8 1.9 3.7 5 S 3.0 4 2.9 1.1 6 int NextClosestNode = pq.Pop(); 1 1.0 m_ShortestPathTree[2] = m_SearchFrontier[2]; if (NextClosestNode == m_iTarget) return 1 2 3 4 5 6 SPT 5-2 0-0 SF 0-0 5-2 0-0 0-0 0-0 5-6 CTN 0.0 1.9 0.0 0.0 0.0 3.0 IPQ 2 6 9 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  10. 10. NextClosestNode = 2 3.1 3 T 2 for (const Edge* pE=ConstEdgeItr.begin(); 0.8 !ConstEdgeItr.end(); pE=ConstEdgeItr.next()) 1.9 3.7 5 { S double NewCost = m_CostToThisNode[NextClosestNode] + pE->Cost(); 3.0 4 2.9 if (m_SearchFrontier[pE()->To()] == 0) 1.1 { 6 m_CostToThisNode[pE()->To()] = NewCost; 1 1.0 pq.insert(pE()->To()); m_SearchFrontier[pE()->To()] = pE(); } else if ( (NewCost < m_CostToThisNode[pE()->To()]) && 1 2 3 4 5 6 (m_ShortestPathTree[pE()->To()] == 0) ) { SPT 5-2 0-0 m_CostToThisNode[pE()->To()] = NewCost; SF 0-0 5-2 2-3 0-0 0-0 5-6 pq.ChangePriority(pE()->To()); CTN 0.0 1.9 5.0 0.0 0.0 3.0 m_SearchFrontier[pE()->To()] = pE(); } IPQ 3 6 } 10 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  11. 11. NextClosestNode = 6 3.1 3 T 2 0.8 1.9 3.7 5 S 3.0 4 2.9 1.1 6 int NextClosestNode = pq.Pop(); 1 1.0 m_ShortestPathTree[6] = m_SearchFrontier[6]; if (NextClosestNode == m_iTarget) return 1 2 3 4 5 6 SPT 5-2 0-0 5-6 SF 0-0 5-2 2-3 0-0 0-0 5-6 CTN 0.0 1.9 5.0 0.0 0.0 3.0 IPQ 3 6 11 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  12. 12. NextClosestNode = 6 3.1 3 T 2 for (const Edge* pE=ConstEdgeItr.begin(); 0.8 !ConstEdgeItr.end(); pE=ConstEdgeItr.next()) 1.9 3.7 5 { S double NewCost = m_CostToThisNode[NextClosestNode] + pE->Cost(); 3.0 4 2.9 if (m_SearchFrontier[pE()->To()] == 0) 1.1 { 6 m_CostToThisNode[pE()->To()] = NewCost; 1 1.0 pq.insert(pE()->To()); m_SearchFrontier[pE()->To()] = pE(); } else if ( (NewCost < m_CostToThisNode[pE()->To()]) && 1 2 3 4 5 6 (m_ShortestPathTree[pE()->To()] == 0) ) { SPT 5-2 0-0 5-6 m_CostToThisNode[pE()->To()] = NewCost; SF 0-0 5-2 2-3 6-4 0-0 5-6 pq.ChangePriority(pE()->To()); CTN 0.0 1.9 5.0 4.4 0.0 3.0 m_SearchFrontier[pE()->To()] = pE(); } IPQ 3 4 } 12 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  13. 13. NextClosestNode = 4 3.1 3 T 2 0.8 1.9 3.7 5 S 3.0 4 2.9 1.1 6 int NextClosestNode = pq.Pop(); 1 1.0 m_ShortestPathTree[4] = m_SearchFrontier[4]; if (NextClosestNode == m_iTarget) return 1 2 3 4 5 6 SPT 5-2 6-4 0-0 5-6 SF 0-0 5-2 2-3 6-4 0-0 5-6 CTN 0.0 1.9 5.0 4.4 0.0 3.0 IPQ 3 4 13 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  14. 14. NextClosestNode = 4 3.1 3 T 2 for (const Edge* pE=ConstEdgeItr.begin(); 0.8 !ConstEdgeItr.end(); pE=ConstEdgeItr.next()) 1.9 3.7 5 { S double NewCost = m_CostToThisNode[NextClosestNode] + pE->Cost(); 3.0 4 2.9 if (m_SearchFrontier[pE()->To()] == 0) 1.1 { 6 m_CostToThisNode[pE()->To()] = NewCost; 1 1.0 pq.insert(pE()->To()); m_SearchFrontier[pE()->To()] = pE(); } else if ( (NewCost < m_CostToThisNode[pE()->To()]) && 1 2 3 4 5 6 (m_ShortestPathTree[pE()->To()] == 0) ) { SPT 5-2 6-4 0-0 5-6 m_CostToThisNode[pE()->To()] = NewCost; SF 0-0 5-2 2-3 6-4 0-0 5-6 pq.ChangePriority(pE()->To()); CTN 0.0 1.9 5.0 4.4 0.0 3.0 m_SearchFrontier[pE()->To()] = pE(); } IPQ 3 } 14 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  15. 15. NextClosestNode = 3 3.1 3 T 2 0.8 1.9 3.7 5 S 3.0 4 2.9 1.1 6 int NextClosestNode = pq.Pop(); 1 1.0 m_ShortestPathTree[4] = m_SearchFrontier[4]; if (NextClosestNode == m_iTarget) return 1 2 3 4 5 6 SPT 5-2 2-3 6-4 0-0 5-6 SF 0-0 5-2 2-3 6-4 0-0 5-6 CTN 0.0 1.9 5.0 4.4 0.0 3.0 IPQ 3 15 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  16. 16. template <class graph_type > class Graph_SearchDijkstra { private: typedef typename graph_type::EdgeType Edge; typedef typename graph_type::NodeType Node; private: const graph_type & m_Graph; std::vector<const Edge*> m_ShortestPathTree; std::vector<double> m_CostToThisNode; std::vector<const Edge*> m_SearchFrontier; int m_iSource; int m_iTarget; void Search(); 16 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  17. 17. public: Graph_SearchDijkstra(const graph_type& graph, int source, int target = -1) :m_Graph(graph), m_ShortestPathTree(graph.NumNodes()), m_SearchFrontier(graph.NumNodes()), m_CostToThisNode(graph.NumNodes()), m_iSource(source), m_iTarget(target) { Search(); } std::vector<const Edge*> GetAllPaths()const; std::list<int> GetPathToTarget()const; double GetCostToTarget()const; }; 17 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  18. 18. template <class graph_type> void Graph_SearchDijkstra<graph_type>::Search() { IndexedPriorityQLow<double> pq(m_CostToThisNode, m_Graph.NumNodes()); pq.insert(m_iSource); while(!pq.empty()) { int NextClosestNode = pq.Pop(); m_ShortestPathTree[NextClosestNode] = m_SearchFrontier[NextClosestNode]; if (NextClosestNode == m_iTarget) return; 18 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  19. 19. graph_type::ConstEdgeIterator ConstEdgeItr(m_Graph, NextClosestNode); for (const Edge* pE=ConstEdgeItr.begin(); !ConstEdgeItr.end(); pE=ConstEdgeItr.next()) { double NewCost = m_CostToThisNode[NextClosestNode] + pE->Cost(); if (m_SearchFrontier[pE->To()] == 0) { m_CostToThisNode[pE->To()] = NewCost; pq.insert(pE->To()); m_SearchFrontier[pE->To()] = pE; } 19 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  20. 20. else if ( (NewCost < m_CostToThisNode[pE->To()]) && (m_ShortestPathTree[pE->To()] == 0) ) { m_CostToThisNode[pE->To()] = NewCost; pq.ChangePriority(pE->To()); m_SearchFrontier[pE->To()] = pE; } } } } 20 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  21. 21. 21 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  22. 22. 22 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  23. 23. template <class graph_type, class heuristic> class Graph_SearchAStar { private: typedef typename graph_type::EdgeType Edge; private: const graph_type& m_Graph; std::vector<double> m_GCosts; std::vector<double> m_FCosts; std::vector<const Edge*> m_ShortestPathTree; std::vector<const Edge*> m_SearchFrontier; int m_iSource; int m_iTarget; 23 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  24. 24. public: Graph_SearchAStar(graph_type& graph, int source, int target) :m_Graph(graph), m_ShortestPathTree(graph.NumNodes()), m_SearchFrontier(graph.NumNodes()), m_GCosts(graph.NumNodes(), 0.0), m_FCosts(graph.NumNodes(), 0.0), m_iSource(source), m_iTarget(target) { Search(); } std::vector<const Edge*> GetSPT()const; std::list<int> GetPathToTarget()const; double GetCostToTarget()const; }; 24 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  25. 25. static double Calculate(const graph_type& G, int nd1, int nd2); =================================================================== class Heuristic_Euclid { public: Heuristic_Euclid(){} template <class graph_type> static double Calculate(const graph_type& G, int nd1, int nd2) { return Vec2DDistance(G.GetNode(nd1).Position, G.GetNode(nd2).Position); } }; 25 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  26. 26. template <class graph_type, class heuristic> void Graph_SearchAStar<graph_type, heuristic>::Search() { IndexedPriorityQLow<double> pq(m_FCosts, m_Graph.NumNodes()); pq.insert(m_iSource); while(!pq.empty()) { int NextClosestNode = pq.Pop(); m_ShortestPathTree[NextClosestNode] = m_SearchFrontier[NextClosestNode]; if (NextClosestNode == m_iTarget) return; graph_type::ConstEdgeIterator ConstEdgeItr(m_Graph, NextClosestNode); 26 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  27. 27. for (const Edge* pE=ConstEdgeItr.begin(); !ConstEdgeItr.end(); pE=ConstEdgeItr.next()) { double HCost = heuristic::Calculate(m_Graph, m_iTarget, pE->To()); double GCost = m_GCosts[NextClosestNode] + pE->Cost(); if (m_SearchFrontier[pE->To()] == NULL) { m_FCosts[pE->T()] = GCost + HCost; m_GCosts[pE->To()] = GCost; pq.insert(pE->To()); m_SearchFrontier[pE->To()] = pE; } 27 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  28. 28. else if ((GCost < m_GCosts[pE->To()]) && (m_ShortestPathTree[pE->To()]==NULL)) { m_FCosts[pE->To()] = GCost + HCost; m_GCosts[pE->To()] = GCost; pq.ChangePriority(pE->To()); m_SearchFrontier[pE->To()] = pE; } } } } 28 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일
  29. 29. 29 그래프 탐색 알고리즘 무정보 그래프 탐색 에지완화 비용 기반 그래프 탐색 Dijkstra 알고리즘 A* By Changhoon Park http://changhoonpark.wordpress.com11년 9월 19일 월요일

×