A* 算法实现及代码下载(多种方式实现,加路径修正)

本文介绍了A*算法的原理和实现细节,并提供了多种实现方式,包括从txt读取地图、命令行显示和MFC界面演示。还提供了源代码下载链接,包括基于txt的调试版本、exe演示程序和VS2010工程,帮助读者理解和应用A*算法。
摘要由CSDN通过智能技术生成

A*算法的介绍在下面这篇文章中说的很详细了,就不在这阐述了,这篇文章主要是介绍自己的一些理解,一些重点的解释,和效果展示。同样给出了代码编写的思路。代码会给下载链接。


A*算法可参考文章(介绍的很好):http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html


代码已上传:


1)从txt文本读取地图命令窗口显示,方便算法调试:

http://download.csdn.net/detail/lmnxjf/5362983(免积分)

2) 演示程序下载,即代码编译后的exe文件,直观显示效果,鼠标拖动绘制地图:http://download.csdn.net/detail/lmnxjf/5363017(免积分)

3) 为2)整个工程的代码,vs2010下编写,将A*算法封装为类,同时可以熟悉windows的画笔和画刷的使用:http://download.csdn.net/detail/lmnxjf/5363039(2积分)

以前做的一些画笔画刷程序

1) 俄罗斯方块免积分下载:

http://download.csdn.net/detail/lmnxjf/5332451(免积分)  

相应的博文:http://blog.csdn.net/lmnxjf/article/details/8886537

csdn上传后就不能再对资源进行修改了,所以第三个会要积分下载。


二  A* 算法的实现


A*算法是一种静态路网中求解最短路最有效的方法。公式表示为:f(n)=g(n)+h(n)

n f(n) 是从初始点经由节点n到目标点的估价函数,

n g(n) 是在状态空间中从初始节点到n节点的实际代价,

n h(n) 是从n到目标节点最佳路径的估计代价。

其实A*算法是一种最好优先的

此为用C#写的A*算法代码 using System; using System.Collections.Generic; using System.Text; using System.Drawing; namespace EtSoft.AStarLib { public class AStar { private StarNodeCollection openList = new StarNodeCollection(); private StarNodeCollection closeList = new StarNodeCollection(); public StarNode currentNode = null; #region 构造函数 /// <summary> /// 使用指定的地图对象、起点和终点初始化A星算法 /// </summary> /// <param name="map">地图对象</param> public AStar(Map map) { this.map = map; } /// <summary> /// /// </summary> /// <param name="map">地图对象</param> /// <param name="start">起点坐标</param> /// <param name="end">终点坐标</param> public AStar(Map map, Point start, Point end) : this(map) { this.start = new StarNode(start); this.end = new StarNode(end); openList.Add(new StarNode(start)); //AddStartNodeToOpenList(this.start); } /// <summary> /// /// </summary> /// <param name="map">地图对象</param> /// <param name="startX">起点X坐标</param> /// <param name="startY">起点Y坐标</param> /// <param name="endX">终点X坐标</param> /// <param name="endY">终点Y坐标</param> public AStar(Map map, int startX, int startY, int endX, int endY) : this(map, new Point(startX, startY), new Point(endX, endY)) { } #endregion #region 属性 protected Map map; /// <summary> /// 地图数据 /// </summary> public Map Map { get { return map; } set { map = value; } } private StarNode start = null; /// <summary> /// 起点坐标,如果没有设置起点,返回null /// </summary> public StarNode Start { get { return start; } set { start = value; openList.Clear(); openList.Add(start); //AddNodeToOpenList(start); } } private StarNode end = null; /// <summary> /// 终点坐标,如果没有设置终点,返回null /// </summary> public StarNode End { get { return end; } set { end = value; } } private StarNodeCollection path; /// <summary> /// 返回路径节点集合,没有路径则返回null /// </summary> public StarNodeCollection Path { get { return path; } } private bool allDirection = false; /// <summary> /// true,允许八方向寻路 /// </summary> public bool AllDirection { get { return allDirection; } set { allDirection = value; } } #endregion /// <summary> /// 开始寻路 /// </summary> public void StartSearchPath() { if (start == null) throw new InvalidNodeException(InvalidNodeTypes.NoStart); if (end == null) throw new InvalidNodeException(InvalidNodeTypes.NoEnd); path = null; openList.Clear(); closeList.Clear(); currentNode = start; SearchPath(currentNode); } //寻路递归,受保护的虚方法,允许在子类重写寻路算法 protected virtual void SearchPath(StarNode starNode) { //currentNode = starNode; openList.Remove(starNode); closeList.Add(starNode); AddNodeToOpenList(); if (closeList.Contains(end)) { //如果终点在关闭列表中,找到路径 StarNode node=starNode.Parent; path = new StarNodeCollection(); do { path.Add(node); node = node.Parent; } while (node != null && !node.Equals(start)); path.Reverse(); return; } else if (openList.Count == 0) { //终点不在关闭列表,开放列表已空,没有可通行的路径 return; } currentNode = GetNextNode(); //迭代过程 SearchPath(currentNode); } /// <summary> /// 获得当前节点的下一个最佳节点 /// </summary> /// <returns></returns> public StarNode GetNextNode() { openList.SortByF(); return openList[0]; } /// <summary> /// 把当前点周围可通过的点入到开放列表中 /// </summary>
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值