#include <iostream>
#include <string>
#include <utility>
#include <vector>
#include <deque>
#include <boost/graph/adjacency_list.hpp>
//A*寻路算法
#include <boost\graph\astar_search.hpp>
using namespace std;
using namespace boost; enum { A, B, C, D, E, N };
string Names = "ABCDE";
//定义别名,两个顶点直接连接的边
using Edge = pair<int, int>;
//创建一个图 边 顶点 有方向 无特性 边的权重是int
using Graph = adjacency_list<listS, vecS, directedS, no_property, property<edge_weight_t, int>>; //创建一个图
Graph make_graph()
{
//连接的边
vector<Edge> edges = { {A,B},
{A,C},
{A,D},
{B,E},{C,E},{D,E} };
//边对应的权重
vector<int> weight = { ,,,,, }; //创建一个图对象
return Graph(edges.begin(), edges.end(), weight.begin(), N);
} //创建一个结构体,用于抛出找到信息
struct found_goal
{ }; //A*要到达的目标顶点
template<class vertex>
class astar_my_visitor :public boost::default_astar_visitor
{
public:
//初始化内置地图
astar_my_visitor(vertex goal) :m_goal(goal)
{ }
//重载examine_vertex方法
template<class Graph>
void examine_vertex(vertex v, Graph &g)
{
//如果与目标顶点一样,则说明找到
if (v == m_goal)
{
//抛出抛出找到信息
throw found_goal();
}
}
private:
//目标顶点
vertex m_goal;
}; //计算权重寻找最短路径
template<class Graph,class costtype>
class distance_heuristic :public boost::astar_heuristic<Graph, costtype>
{
public:
//类型替换
using Vertex = typename boost::graph_traits<Graph>::vertex_descriptor; //初始化
distance_heuristic(Vertex Goal, Graph &graph):Goal_(Goal),graph_(graph)
{ } //重载()运算符 获得目标点到指定点的距离
costtype operator()(Vertex v)
{
return get(vertex_index, graph_, Goal_) - get(vertex_index, graph_, v);
} private:
Vertex Goal_;
Graph &graph_;
}; void main()
{
//创建图
Graph myg = make_graph(); //创建简写
using Vertex = boost::graph_traits<Graph>::vertex_descriptor;
using Cost = int; Vertex start = vertex(A, myg);//开始位置
Vertex goal = vertex(E, myg);//结束位置 //保存走过路径(由后向前)
vector<Vertex>parents(boost::num_vertices(myg));
//保存长度
vector<Cost>distance(boost::num_vertices(myg)); try
{
//求从指定点到终点的路线 boost::astar_search_tree(myg,
start,
distance_heuristic<Graph, Cost>(goal, myg),//传递距离 //求出路径,以及路径对应的权重,访问器访问 因为重载了()运算符
boost::predecessor_map(&parents[]).distance_map(&distance[]).visitor(astar_my_visitor<Vertex>(goal))
);
}
//catch信息
catch (found_goal fg)
{
//要到的位置的前一个到达的位置如果是goal(下标是当前点,值是到这个点之前的点)
if (parents[goal] == goal)
{
cout << "无路可走" << endl;
}
deque<Vertex> route; //顺藤摸瓜
for (Vertex v = goal; v != start; v = parents[v])
{
route.push_front(v);
}
for (auto i : route)
{
cout << Names[i] << endl;
}
} system("pause");
}

19.boost A*算法的更多相关文章

  1. boost字符串算法

    boost::algorithm简介 2007-12-08 16:59 boost::algorithm提供了很多字符串算法,包括: 大小写转换: 去除无效字符: 谓词: 查找: 删除/替换: 切割: ...

  2. boost之算法

    STL里的算法已经很好了,在boost里有几个小的算法 1.BOOST_FOREACH使用方法,定义一个容器里内部类型数据,容器作为参数传递. #include <iostream> #i ...

  3. paper 19 :机器学习算法(简介)

    本来看了一天的分类器方面的代码,乱乱的,索性再把最基础的概念拿过来,现总结一下机器学习的算法吧! 1.机器学习算法简述 按照不同的分类标准,可以把机器学习的算法做不同的分类. 1.1 从机器学习问题角 ...

  4. C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构

    STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...

  5. 19.-哈希算法&注册登录

    一.哈希算法 哈希: 给定明文-计算出一段定长的-不可逆的值 定长输出:不管明文输入多少,哈希都是定长的 不可逆:无法反向计算出对应的明文 雪崩效应:输入改变,输出必然变 md5:32位16进制   ...

  6. Dlib 19.4(算法,压缩,图像处理,机器学习,Meta编程,网络,HTTP服务器)

    Algorithms API Wrappers Bayesian Nets Compression Containers Graph Tools Image Processing Linear Alg ...

  7. 19道常见的JS面试算法题

    最近秋招也做了多多少少的面试题,发现除了基础知识外,算法还是挺重要的.特意整理了一些常见的算法题,添加了自己的理解并实现. 除此之外,建议大家还可以刷刷<剑指offer>.此外,左神在牛客 ...

  8. Adaboost 算法

    一 Boosting 算法的起源 boost 算法系列的起源来自于PAC Learnability(PAC 可学习性).这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的 ...

  9. 浅谈 Adaboost 算法

    http://blog.csdn.net/haidao2009/article/details/7514787 菜鸟最近开始学习machine learning.发现adaboost 挺有趣,就把自己 ...

随机推荐

  1. 剑指offer——05用两个栈实现队列(Python3)

    思路:(转) 代码: # -*- coding:utf-8 -*-class Solution: stack1 = [] stack2 = [] def push(self, node): self. ...

  2. C++中的pair,make_pair学习

    std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型.例如std::pair<int,float> 或者 std::pair<double,do ...

  3. Java NIO(一)概述

    说明 java NIO是从java1.4开始引入的一个新的IO API,它支持面向缓冲区,基于通道的IO操作,它的核心是通道(channel),缓冲区(buffer),选择器(selector) NI ...

  4. DirectUI界面编程(五)WindowImplBase的使用

    上节笔者向大家介绍了Duilib的界面布局并在最后编写了一个仿QQ旋风的界面,但是由于我们屏蔽了系统的标题栏,读者可能已经发现,我们的窗口没办法移动,同样也不能通过拖动来改变窗口的大小. 这就需要我们 ...

  5. J2EE概念汇总

    JVM 是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟 ...

  6. 洛谷T44252 线索_分治线段树_思维题

    分治线段树,其实就是将标记永久化,到最后再统一下传所有标记. 至于先后顺序,可以给每个节点开一个时间戳. 一般地,分治线段树用于离线,只查询一次答案的题目. 本题中,标记要被下传 222 次. Cod ...

  7. 路飞学城Python-Day19(practise)

    # 特性1.继承:2.多态:3.封装 # 1.继承的用处:通过继承就可以解决类与类之间的代码冗余关系 # 2.多态的用处:1.增加了程序的灵活性,以不变应万变,使用者都是同一种形式去调用(func(a ...

  8. [分享]前端javascript插件(均开源)

    记录并分享一些自己使用过的插件,便于以后有相应的功能需要使用可以及时想到. 1:数字插件countUp.js 功能:用于动态显示数字的增加和减少 项目github地址:http://inorganik ...

  9. C IO programming test code

    #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl ...

  10. Vue-给对象新增属性(使用Vue.$set())

    在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的. 根据官方文档定义 ...