A*算法 puzzle8数码
A*算法 puzzle8数码
一、 算法的理解
A算法,从框架上看和深度以及宽度优先搜索之间有异曲同工之妙。为解决宽度优先搜索、深度优先搜索的盲目搜索问题(在实现过程中表现形式为节点的优先级只与深度有关),A算法采用启发式搜索,简单的来说就是先“判断一下目标的可能性”,选择容易到达目标的节点优先搜索。由此引入估价函数,对节点的“可能性”就行评估,每个节点的评估值可以作为其优先级(越可能到达目标的节点优先级越高,与深度、宽度优先搜索区别最大的地方)。
接下来就是估价函数的问题。算法的估价函数可表示为f(n) = g(n) + h(n), g(n) 表示开始节点到节点n 的实际路径代价,而h(n) 表示节点n 到目标节点的最小路径代价的估计值,那么f(n) 就表示从开始节点到目标节点且经过节点n 的最小代价解的估计代价。在本次的8数码实验中,以曼哈顿距离作为估计值:例如:这种情形 下,于目标 比对,在忽略3、1的影响下,6需要移动三步;2,3不需要移动;5需要向右移动一步;同理类推一共需要移动heuristics=3+0+0+1+1+3+1+1=10。节点的优先级为:priority = new_cost + newpuzzle8.heuristics,new_cost为已经走的步数,newpuzzle8.heuristics还需代价的估计值。当然priority的值越小,节点的优先级越高。
def Astar(puzzle8,came_from):frontier=PriorityQueue()cost_so_far={}frontier.enqueue(puzzle8,0)cost_so_far[puzzle8.ToString()]=puzzle8.costcame_from[puzzle8]=Nonewhile not frontier.is_empty():puzzle8=frontier.dequeue()if puzzle8.isGoal():return puzzle8else:moves=puzzle8.getAllMoves()for move in moves:newpuzzle8=puzzle8.clone()newpuzzle8.move(*move)new_cost=newpuzzle8.costif cost_so_far.get(newpuzzle8.ToString())==None or new_cost<cost_so_far[newpuzzle8.ToString()]:cost_so_far[newpuzzle8.ToString()]=new_costPriority=new_cost+newpuzzle8.heuristicsfrontier.enqueue(newpuzzle8,Priority)came_from[newpuzzle8.ToString()]=puzzle8return None
阶段总结
A算法是一种启发式搜索,关键是找到一个好的启发式策略,也就是一个比较好的估价函数。如果能在BFS搜索算法中利用估价函数对队列中的节点进行排序的话,该搜索方式为A算法。在将A*算法应用到8数码问题时,有许多小技巧值得学习:将一个节点的状态用tostring方法转换成字符串记录;用曼哈顿距离作为估价函数。
A*算法 puzzle8数码相关推荐
- 人工智能算法之三数码
最近老师让用程序解决八数码问题,当时注意到可以从中抽取出来的简单模型--三数码,就是4个格子三个数,然后用C++写了一个求解可达不可达且可达的话求出最少步长的简单算法: /* 三数码问题求解 */ / ...
- 基于K-means算法的数码迷彩生成——python实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.数码迷彩 二.K-means算法提取主色 三.python算法实现 1.在IDE中导入需要的库 2.K-means ...
- 人工智能----A*(星)算法之八数码问题
文章目录 前言 一.什么是将牌? 初始状态 目标状态 二.编程步骤 1.状态空间图的定义 2.各种操作的定义 3.A*算法框架的定义 三.3种算法的完整代码 1.将牌算法 2.曼哈顿算法 3.广度优先 ...
- 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)
前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...
- bbp公式求圆周率、python_【并行计算】六种方法计算圆周率
计算π的历史 圆周率π可能是科学界内外最广为人知的自然常数了.早在公元5世纪时,南朝宋数学家祖冲之用割圆法将圆周率计算到小数点后7位数字.大约同一时间,印度的数学家也将圆周率计算到了小数点后5位.历史 ...
- 人工智能 水壶问题 python解法
人工智能 水壶问题 python解法 系列文章 人工智能 倒啤酒问题 python解法 人工智能 水壶问题 python解法 A*算法之八数码问题 python解法 A*算法之野人传教士问题 pyth ...
- 基于 STM32 的新型激光测距控制系统的设计
基于 STM32 的新型激光测距控制系统的设计 基于 STM32 的新型激光测距控制系统的设计 闵小 (陕西理工大学(物理与电信工程学院)电子专业1502班,陕西 汉中 723003) 指导老师:韩团 ...
- 孙子定理 中国剩余定理
孙子定理 摘自:百度百科 目录 定义 解释 解法 数学公式 中国剩余定理 案例 展开 编辑本段 定义 中国古代求解一次同余式组(见同余)的方法.是数论中一个重要定理.又称中国剩余定理. 内容 编辑本段 ...
- 人工智能 遗传算法 计算函数极值问题
人工智能 遗传算法 计算函数极值问题 系列文章 人工智能 倒啤酒问题 python解法 人工智能 水壶问题 python解法 A*算法之八数码问题 python解法 A*算法之野人传教士问题 pyth ...
最新文章
- 学术干货:看清华教授如何将深度学习引入音频信号处理
- 谈谈java面向对象之抽象,手把手带你搞定java面试之面向对象
- How to setup SLF4J and LOGBack in a web app - fast--转载
- OS_CORE.C(11)
- lua运行外部程序_LTUI v2.2 发布, 一个基于lua的跨平台字符终端UI界面库
- dotnet中的counter
- 单片机拼字程序怎么做_餐饮怎么用微信小程序?餐饮行业怎么做小程序
- bzoj2300 [HAOI2011]防线修建 离线凸包
- Docker 容器安装vim
- 图:试图播放的文件扩展名与文件格式不匹配。播放该文件可能会导致意外行为...的解决办法
- 黑莓手机安装linux,Ubuntu下善用黑莓(备份,同步,装卸备份应用程序)
- 关于中国互联网的国际出口-转载
- JAVA打开PDF文件
- ubuntu | 用crossover安装-微信和企业微信
- AI 人工智能 探索 (九)
- mysql数据模型三要素_2.3.1 逻辑数据模型概述
- Eagle PCB软件
- 海量智库第5期|Vastbase G100核心技术介绍之「SQL by pass技术」
- 使用Apache Solr对数据库建立索引(包括处理CLOB、CLOB)(转)
- nyoj 1036非洲小孩
热门文章
- php 怎么生成本地连接地址,电脑如何创建本地连接?电脑创建本地连接的操作方法...
- Python玩转金融时间序列之ARCH与GARCH模型
- the desired address is beyond limit for this PLC
- c语言putpixel函数普通写法,C语言标准函数库5
- 计算机程序设计的优缺点,事件驱动编程的概念与优缺点分析
- 白帽SEO是什么?与黑帽SEO有什么区别?
- 日语零基础,为什么有人可以学半年过N1?
- php unicode转文字,unicode如何转汉字
- 无法访问计算机0x80070035,win10 1809 无法访问网络共享 0x80070035
- Pyecharts项目实战:去长沙旅游有哪些好玩的?