BFS寻路算法的实现
关于BFS的相关知识由于水平有限就不多说了,感兴趣的可以自己去wiki或者其他地方查阅资料。
这里大概说一下BFS寻路的思路,或者个人对BFS的理解:
大家知道Astar的一个显著特点是带有启发函数,换句话说,Astar尝试以人的思维来去寻找一段路径。而BFS则没有这种聪明劲,他看起来更中规中矩,老实巴交,更像是机器人的风格。
简单的说,BFS为了找到一条路径,他从起点开始,然后是身边的邻居,然后是邻居的邻居,一个一个的搜查,直到搜到终点(寻路成功),或者把整个地图搜索完(除非最后一个点就是终点,否则寻路失败)。
可能乍看上去BFS真的比较笨,但是他也并没有笨的不着边际,因为他最多把整个地图都搜一遍,这样,对于一张有限的地图,他寻找一段路径所花的时间也是相对的有一个上限。
但Astar则不同,Astar虽然看起来带有聪明劲,但是这种聪明只是一种自作聪明,有时候,对于一些设计特殊的地图,Astar要为自己的聪明付出很大的代价。比如带有半岛的地图。
总体上看,Astar在障碍越少的情况下寻路越快,而BFS则比较平缓,不管障碍多少,他快慢幅度并不大。
废话不多说,下面用代码来说明BFS的思路:
.public function tryFindPath(sx:int, sy:int, ex:int, ey:int):Boolean
.{
. var start:uint = getTimer();
.
. _startNode = _mapData.setStartNode(sx,sy);
. _endNode = _mapData.setEndNode(ex,ey);
.
. if(_startNode == _endNode) return false;
. if(!_endNode.walkable) return false;
.
. var i:uint=;
. _startNode.f = i;
. var queue:MinHeap = new MinHeap();
. queue.Enqueue(_startNode);
. var neighbor:Node;
. var testedNodes:Dictionary = new Dictionary();
.
. while(queue.size>)
. {
. var testNode:Node = queue.Dequeue() as Node;
. i++;
. var x:int,y:int;
. for(var dx:int=-;dx<=;++dx)
. {
. x = testNode.x + dx;
. for(var dy:int=-;dy<=;++dy)
. {
. y = testNode.y+dy;
. neighbor = _mapData.getNode(x,y);
. if(!neighbor) continue;
. if(!neighbor.walkable) continue;
. if(testedNodes[neighbor]) continue;
. testedNodes[neighbor] = true;
. neighbor.parent = testNode;
. neighbor.f = i;
. if(neighbor == _endNode)
. {
. return true;
. }
.
. queue.Enqueue(neighbor);
. }
. }
. }
. return false;
.}
这里并没有给出全部相关的源码,该方法只展示一个思路:
_mapData是对一个二维网格地图数据做了一个封装,包括设置起始点,终点,根据索引获取节点等。
Node是一个节点对象,他有xy的属性和一个f属性,跟Astar的代价属性类似。
queue是一个最小堆,他保证f值越小的Node对象越靠近队列的顶部。
testedNodes用来记录节点是否被搜寻过。
其寻路过程为:
1,将起点放入队列;
2,弹出队列中的最小代价的节点,搜寻他周围的有效节点(即存在,可走,而且没有被检查过),设置代价值,和父节点,如果这个节点就是终点,那么寻路成功,否则将此节点放入队列,在检查下一个邻居节点,如果所有的邻居节点都不是终点则进入3;
3,如果队列空了,那么说明所有的节点都检查过了,没有找到终点,否则继续2。
BFS的这种平缓特性在有些时候看起来似乎可以弥补Astar的缺陷,比如我们想在长程情况下采用BFS而短程的时候用Astar,但是这并不总是合适的,因为Astar并不是因为路程长才耗时,而是因为地形复杂,而地形复杂又没有一个可以衡量的指标,只能人为的去判断,所以最多我们通过人为的配置来选择寻路的方式。
BFS寻路算法的实现的更多相关文章
- A*寻路算法的实现
原理:http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html 算法理论请到原理这个传送门,代码中的注释,已经比较详细,所以我不会讲 ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
- BFS寻路的AS3实现
关于BFS的相关知识由于水平有限就不多说了,感兴趣的可以自己去wiki或者其他地方查阅资料. 这里大概说一下BFS寻路的思路,或者个人对BFS的理解: 大家知道Astar的一个显著特点是带有启发函数, ...
- Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...
- java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现
java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...
- SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)
在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...
- 详解Linux内核红黑树算法的实现
转自:https://blog.csdn.net/npy_lp/article/details/7420689 内核源码:linux-2.6.38.8.tar.bz2 关于二叉查找树的概念请参考博文& ...
- 详细MATLAB 中BP神经网络算法的实现
MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤 这里 ...
- Python学习(三) 八大排序算法的实现(下)
本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...
随机推荐
- 将Android Studio工程导入到Eclipse中
1.前言 studio项目中src/main/java目录里面的代码对应的是eclispe项目中的src目录中的代码. 而studio中src目录里面包括整个项目的所有代码包括资源文件和xml. 2. ...
- Java 基础-运算符
Java运算符 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 运算符优先级 1. 算术运算符 运算符 运算 范例 结果 + 正号 +3 3 - 负号 b=4;-b -4 + 加 5+5 1 ...
- [POJ2777]Count Color(线段树)
题目链接:http://poj.org/problem?id=2777 给你一个长为L想线段,向上面染色,颜色不超过30种,一共有O次操作,操作有两种: C a b c 在[a,b]上染上c颜色 P ...
- leetcode:Number of 1 Bits
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...
- svn备份脚 本
一直用这套脚本备份,脚本主体虽不是原创,但是从网上得到后因为不能运行也进行了些修改,前两天看到有人问关于SVN备份的问题,今天又把脚本整理了一下,解决了不能循环备份多个配置库的问题.希望对大家有所帮助 ...
- BOM浏览器对象
BOM 浏览器对象 一.浏览器本身就自己有一些对象,不用创建就可以使用 window(当前浏览器窗体) 属性: status opener closed parent top 方法: alert(); ...
- POJ 3692 Kindergarten (补图是二分图的最大团问题)
题意 幼稚园里有m个男孩和n个女孩(m.n范围都是[1,200]),男孩之间相互认识,女孩之间也相互认识,另外有部分男孩和女孩也认识.现在要举办一个活动,选取一些同学,要求所有选取的同学之间两两相互认 ...
- 【自动化测试】Selenium excel操作
http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html http://blog.csdn.net/five3/article/det ...
- 【解题报告】[动态规划] RQNOJ PID106 / 最大加权矩形
原题地址:http://www.rqnoj.cn/problem/106 解题思路: 一维的情况下求最大字串和的状态转移方程是:s[i]=max{s[i-1]+a[i],a[i]} 二维的情况下,只要 ...
- 【转】gcc中-pthread和-lpthread的区别
原文网址:http://chaoslawful.iteye.com/blog/568602 用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以便使用thread-safe的库及 ...