A*算法的目的是找到一条从起始状态到最终状态的最短路径。

在A*算法中,需要在每个点计算启发函数:f(S) = g(S) + h(S),其中g(S)是从起点到S点的距离,h(S)是对从S点到终点的最短距离的估计值。

如果把g(S)当作深度,又令h(S) = 0,则A*算法就变成了BFS。

A*算法对BFS的改进在于把BFS所用到的队列改成按启发函数值排列的优先队列。

假设从状态S抵达终点的最短距离为H(S),那么启发函数中的h(S)必须满足h(S)<= H(S)。在此基础上,h和实际的距离越接近,需要计算的节点就越少,效果就越好。如果h(S) = 0,此时A*算法就变成了BFS,效果最差。

在解8数字谜题时,如果按照BFS的思路,我们每次扩展四个节点,分别是空格上移、下移、左移和右移(当然,大多数节点是无法完全扩展这四个方向的),一层层搜索之后,若发现了目标状态,则从目标状态节点开始向父节点回溯,由此就可以得到一个步数最少的解法了。但是BFS是盲目的,因此在搜索过程中它搜索了很多“意义不大”的节点。于是我们开始设计一个加入了一定启发信息的A*算法(其思路类似于分支限界),代码如下(参见P223 2.5.4.6小节):

A*()
{// open表,用优先队列实现,用来保存待扩展的节点(改进自BFS中的队列)。PriorityQueue open;// closed表,用HASH表或者其他能够高效检索的数据结构实现,用来保存已经扩展过的节点(可以考察一个状态是否已经被产生过)。SymbolTable closed;open.Add(起始节点);while(!PriorityQueueEmpty(open)){// 从open表中弹出一个最优的待扩展节点S = PriorityQueueDeleteMax(open)); closed.Insert(S);// 如果S就是目标状态则结束if(S == GOAL){return OVER;}// 尝试扩展S的所有子节点while(childS = S.nextChild()){// 如果当前节点尚未被产生过if(!closed.isInclude(childS)){// 则将这个节点添加到open表中PriorityQueueInsert(open,childS);}}}
}

  

转载于:https://www.cnblogs.com/laifeiyao/p/3475098.html

A*算法与8数字谜题(参见《算法》P226习题2.5.32)相关推荐

  1. 【红外】数字细节增强算法的缘由效果如何评价效果(我对FLIR算法文档详解)

    创作时间: 2018-11-26 提前声明:本文属本人原创,版权所有,禁止转载. 标题: 数字细节增强算法的缘由与效果 DDE( digitial detail enhancement ) 目录: 0 ...

  2. ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能

    ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...

  3. ML之SVM:基于SVM(支持向量机)之SVC算法对手写数字图片识别进行预测

    ML之SVM:基于SVM(支持向量机)之SVC算法对手写数字图片识别进行预测 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 X_train = ss.fit_transform(X ...

  4. JavaScript实现使用二元运算符将两个数字相加fullAdder算法(附完整源码)

    JavaScript实现使用二元运算符将两个数字相加fullAdder算法(附完整源码) getBit.js完整源代码 fullAdder.js完整源代码 getBit.js完整源代码 export ...

  5. C++找到一个大于或等于n且为2的幂的数字p的算法实现(附完整源码)

    C++找到一个大于或等于n且为2的幂的数字p的算法实现 C++找到一个大于或等于n且为2的幂的数字p的算法实现完整源码(定义,实现,main函数测试) C++找到一个大于或等于n且为2的幂的数字p的算 ...

  6. 计算机控制pid控制实验,计算机控制实验三数字PID调节器算法的研究

    计算机控制技术实验报告 学院:********** 班级:********** 姓名:****** 学号:**********实验三 数字PID调节器算法的研究 实验项目名称:数字PID调节器算法的研 ...

  7. 基于多相滤波器的数字信道化算法详解(Python, Verilog代码已开源)

    基于多相滤波器的数字信道化算法详解 推导过程 总结 仿真 本文详细介绍了基于多相滤波器的数字信道化算法的推导过程, 如果您在阅读的过程中发现算法推导过程中有任何错误, 请不吝指出. 此外, 进入我的G ...

  8. 数字绕圈算法 JS 实现

    这是一道某公司的算法题,我们姑且称之为"数字绕圈算法". 题目:给定一个数字N,以此生成一个N^2的二维矩阵,以某个方向为基准从1开始填充数字.假设数字5那么开始绕圈,最终的结果显 ...

  9. 视频教程-数字图像处理实战-算法基础

    数字图像处理实战 河海大学计算机硕士毕业,现就职于南京华为研究所,从事嵌入式软件开发工作.热爱模式识别及机器学习算法. 金圣韬 ¥70.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+ ...

最新文章

  1. Zabbix(六):项目实战之--自动发现nginx调度器及后端web服务集群、自定义参数监控...
  2. Windows轻松实现linux shell环境:gitforwindows
  3. 从放弃到入门-Yaf(框架生成)
  4. Hibernate配置(2)
  5. 不用任何软件,让电脑不中***
  6. boost::python模块实现使用原始指针访问数据的示例
  7. java算法2_二分查找法
  8. Cloud for Customer的mobile setting前台实现
  9. python list index方法,Python List.index()方法
  10. C/C++fflush(stdout)循环打印输出避免缓存区错误
  11. python常用运维脚本实例-经典!Python运维中常用的几十个Python运维脚本
  12. 银行自助填表方案介绍
  13. java bartender_BarTender Web Print Server可用的打印方法
  14. 「学习笔记」CSS基础(2)
  15. 体系结构学习11-VLIW处理器
  16. 如何设置小程序背景图片大小
  17. [保姆级教程]解决Centos 8下无法更新的问题 (附无痕迁徙到Rocky Linux的方法)
  18. AFN TTP状态 412 - 前置条件失败
  19. 2021-05-26 使用Android Studio创建手机模拟器
  20. 手拉手微商俱乐部 微信营销实战课程开讲啦

热门文章

  1. QT的安装------QT
  2. 将数字转化为字符串的两种方法
  3. 2018达内Web前端开发视频教程
  4. font-size:字号大小
  5. 员工格言[付总提供]
  6. ppt文件太大如何压缩变小?
  7. python多条曲线拟合成一条
  8. 今后,若你的公众号还按老方式发广告,罚款高的可达百万。有公众号已经被惩处了。
  9. idea的git报错You have not concluded your merge
  10. 模型检测--工具PRISM