19.boost A*算法

  1 #include <iostream>
  2 #include <string>
  3 #include <utility>
  4 #include <vector>
  5 #include <deque>
  6 #include <boost/graph/adjacency_list.hpp>
  7 //A*寻路算法
  8 #include <boost\graph\astar_search.hpp>
  9 using namespace std;
 10 using namespace boost;
 11 
 12 enum { A, B, C, D, E, N };
 13 string Names = "ABCDE";
 14 //定义别名,两个顶点直接连接的边
 15 using Edge = pair<int, int>;
 16 //创建一个图                 边     顶点    有方向   无特性            边的权重是int
 17 using Graph = adjacency_list<listS, vecS, directedS, no_property, property<edge_weight_t, int>>;
 18 
 19 //创建一个图
 20 Graph make_graph()
 21 {
 22     //连接的边
 23     vector<Edge> edges = { {A,B},
 24     {A,C},
 25     {A,D},
 26     {B,E},{C,E},{D,E} };
 27     //边对应的权重
 28     vector<int> weight = { 3,1,4,5,2,6 };
 29 
 30     //创建一个图对象
 31     return Graph(edges.begin(), edges.end(), weight.begin(), N);
 32 }
 33 
 34 //创建一个结构体,用于抛出找到信息
 35 struct found_goal
 36 {
 37 
 38 };
 39 
 40 //A*要到达的目标顶点
 41 template<class vertex>
 42 class astar_my_visitor :public boost::default_astar_visitor
 43 {
 44 public:
 45     //初始化内置地图
 46     astar_my_visitor(vertex goal) :m_goal(goal)
 47     {
 48 
 49     }
 50     //重载examine_vertex方法
 51     template<class Graph>
 52     void examine_vertex(vertex v, Graph &g)
 53     {
 54         //如果与目标顶点一样,则说明找到
 55         if (v == m_goal)
 56         {
 57             //抛出抛出找到信息
 58             throw found_goal();
 59         }
 60     }
 61 private:
 62     //目标顶点
 63     vertex m_goal;
 64 };
 65 
 66 //计算权重寻找最短路径
 67 template<class Graph,class costtype>
 68 class distance_heuristic :public boost::astar_heuristic<Graph, costtype>
 69 {
 70 public:
 71     //类型替换
 72     using Vertex = typename boost::graph_traits<Graph>::vertex_descriptor;
 73 
 74     //初始化
 75     distance_heuristic(Vertex Goal, Graph &graph):Goal_(Goal),graph_(graph)
 76     {
 77 
 78     }
 79 
 80     //重载()运算符 获得目标点到指定点的距离
 81     costtype operator()(Vertex v)
 82     {
 83         return get(vertex_index, graph_, Goal_) - get(vertex_index, graph_, v);
 84     }
 85 
 86 private:
 87     Vertex Goal_;
 88     Graph &graph_;
 89 };
 90 
 91 
 92 void main()
 93 {
 94     //创建图
 95     Graph myg = make_graph();
 96 
 97     //创建简写
 98     using Vertex = boost::graph_traits<Graph>::vertex_descriptor;
 99     using Cost = int;
100 
101     Vertex start = vertex(A, myg);//开始位置
102     Vertex goal = vertex(E, myg);//结束位置
103 
104      //保存走过路径(由后向前)
105     vector<Vertex>parents(boost::num_vertices(myg));
106     //保存长度
107     vector<Cost>distance(boost::num_vertices(myg));
108 
109     try
110     {
111         //求从指定点到终点的路线
112 
113         boost::astar_search_tree(myg,
114             start,
115             distance_heuristic<Graph, Cost>(goal, myg),//传递距离
116 
117            //求出路径,以及路径对应的权重,访问器访问                                 因为重载了()运算符
118             boost::predecessor_map(&parents[0]).distance_map(&distance[0]).visitor(astar_my_visitor<Vertex>(goal))
119         );
120     }
121     //catch信息
122     catch (found_goal fg)
123     {
124         //要到的位置的前一个到达的位置如果是goal(下标是当前点,值是到这个点之前的点)
125         if (parents[goal] == goal)
126         {
127             cout << "无路可走" << endl;
128         }
129         deque<Vertex> route;
130         
131         //顺藤摸瓜
132         for (Vertex v = goal; v != start; v = parents[v])
133         {
134             route.push_front(v);
135         }
136         for (auto i : route)
137         {
138             cout << Names[i] << endl;
139         }
140     }
141 
142     system("pause");
143 }

 

转载于:https://www.cnblogs.com/xiaochi/p/8671740.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值