#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. bzoj5216: [Lydsy2017省队十连测]公路建设

    题目思路挺巧妙的. 感觉应该可以数据结构一波,发现n很小可以搞搞事啊.然后又发现给了512mb,顿时萌生大力线段树记录的念头 一开始想的是记录节点的fa,然后发现搞不动啊?? 但其实边肯定最多只有n- ...

  2. SqlServer Function 实例

    ① sql server function 创建 这里使用一个计算年龄精确到分的function作为一个demo, create Function [dbo].[fn_GetAge] ( @BIRTH ...

  3. 迭代器与函数Python学习(四)

    1.1 迭代器: 迭代的工具 1.1.1 什么是迭代: 指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值 while True: print('=====> ...

  4. PHP小常识分享

    PHP 标记 当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?php 和 ?>,这告诉 PHP 开始和停止解析二者之间的代码.此种解析方式使得 PHP 可以被嵌入到各种不同的文 ...

  5. ZBrush中Pinch捏挤笔刷介绍

    随着版本的升级ZBrush®中给我们提供了越来越多的笔刷,对于这款软件来说,笔刷的使用是第一要素,也会一直伴随我们创作.虽然Zbrush中有那么多的笔刷,但是很多朋友会根据自己的习惯来使用,这个并不是 ...

  6. JavaScript中的线程与进程

    定义: 线程分为:单线程和多线程 单线程:一个正在运行的程序(即进行)至少有一个线程,这个线程叫做主线程,只有一个主线程的程序叫做单线程程序,主线程负责执行所有代码的执行(UI展现及刷新.网络请求.本 ...

  7. 使用短信猫读取短信java代码

    短信猫简单配置:https://www.cnblogs.com/Big-Boss/p/9699880.html 测试发送短信代码:https://www.cnblogs.com/Big-Boss/p/ ...

  8. Codeforces Round #493 (Div. 1) B. Roman Digits 打表找规律

    题意: 我们在研究罗马数字.罗马数字只有4个字符,I,V,X,L分别代表1,5,10,100.一个罗马数字的值为该数字包含的字符代表数字的和,而与字符的顺序无关.例如XXXV=35,IXI=12. 现 ...

  9. 谈 instanceof 和 typeof 的实现原理

    typeof: js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息

  10. bootstrap fileinput控件 + django后台上传、回显简单使用

    一.控件下载:https://github.com/kartik-v/bootstrap-fileinput/ 官网:http://plugins.krajee.com/file-input 需要引入 ...