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数码相关推荐

  1. 人工智能算法之三数码

    最近老师让用程序解决八数码问题,当时注意到可以从中抽取出来的简单模型--三数码,就是4个格子三个数,然后用C++写了一个求解可达不可达且可达的话求出最少步长的简单算法: /* 三数码问题求解 */ / ...

  2. 基于K-means算法的数码迷彩生成——python实现

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.数码迷彩 二.K-means算法提取主色 三.python算法实现 1.在IDE中导入需要的库 2.K-means ...

  3. 人工智能----A*(星)算法之八数码问题

    文章目录 前言 一.什么是将牌? 初始状态 目标状态 二.编程步骤 1.状态空间图的定义 2.各种操作的定义 3.A*算法框架的定义 三.3种算法的完整代码 1.将牌算法 2.曼哈顿算法 3.广度优先 ...

  4. 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)

    前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...

  5. bbp公式求圆周率、python_【并行计算】六种方法计算圆周率

    计算π的历史 圆周率π可能是科学界内外最广为人知的自然常数了.早在公元5世纪时,南朝宋数学家祖冲之用割圆法将圆周率计算到小数点后7位数字.大约同一时间,印度的数学家也将圆周率计算到了小数点后5位.历史 ...

  6. 人工智能 水壶问题 python解法

    人工智能 水壶问题 python解法 系列文章 人工智能 倒啤酒问题 python解法 人工智能 水壶问题 python解法 A*算法之八数码问题 python解法 A*算法之野人传教士问题 pyth ...

  7. 基于 STM32 的新型激光测距控制系统的设计

    基于 STM32 的新型激光测距控制系统的设计 基于 STM32 的新型激光测距控制系统的设计 闵小 (陕西理工大学(物理与电信工程学院)电子专业1502班,陕西 汉中 723003) 指导老师:韩团 ...

  8. 孙子定理 中国剩余定理

    孙子定理 摘自:百度百科 目录 定义 解释 解法 数学公式 中国剩余定理 案例 展开 编辑本段 定义 中国古代求解一次同余式组(见同余)的方法.是数论中一个重要定理.又称中国剩余定理. 内容 编辑本段 ...

  9. 人工智能 遗传算法 计算函数极值问题

    人工智能 遗传算法 计算函数极值问题 系列文章 人工智能 倒啤酒问题 python解法 人工智能 水壶问题 python解法 A*算法之八数码问题 python解法 A*算法之野人传教士问题 pyth ...

最新文章

  1. 学术干货:看清华教授如何将深度学习引入音频信号处理
  2. 谈谈java面向对象之抽象,手把手带你搞定java面试之面向对象
  3. How to setup SLF4J and LOGBack in a web app - fast--转载
  4. OS_CORE.C(11)
  5. lua运行外部程序_LTUI v2.2 发布, 一个基于lua的跨平台字符终端UI界面库
  6. dotnet中的counter
  7. 单片机拼字程序怎么做_餐饮怎么用微信小程序?餐饮行业怎么做小程序
  8. bzoj2300 [HAOI2011]防线修建 离线凸包
  9. Docker 容器安装vim
  10. 图:试图播放的文件扩展名与文件格式不匹配。播放该文件可能会导致意外行为...的解决办法
  11. 黑莓手机安装linux,Ubuntu下善用黑莓(备份,同步,装卸备份应用程序)
  12. 关于中国互联网的国际出口-转载
  13. JAVA打开PDF文件
  14. ubuntu | 用crossover安装-微信和企业微信
  15. AI 人工智能 探索 (九)
  16. mysql数据模型三要素_2.3.1 逻辑数据模型概述
  17. Eagle PCB软件
  18. 海量智库第5期|Vastbase G100核心技术介绍之「SQL by pass技术」
  19. 使用Apache Solr对数据库建立索引(包括处理CLOB、CLOB)(转)
  20. nyoj 1036非洲小孩

热门文章

  1. php 怎么生成本地连接地址,电脑如何创建本地连接?电脑创建本地连接的操作方法...
  2. Python玩转金融时间序列之ARCH与GARCH模型
  3. the desired address is beyond limit for this PLC
  4. c语言putpixel函数普通写法,C语言标准函数库5
  5. 计算机程序设计的优缺点,事件驱动编程的概念与优缺点分析
  6. 白帽SEO是什么?与黑帽SEO有什么区别?
  7. 日语零基础,为什么有人可以学半年过N1?
  8. php unicode转文字,unicode如何转汉字
  9. 无法访问计算机0x80070035,win10 1809 无法访问网络共享 0x80070035
  10. Pyecharts项目实战:去长沙旅游有哪些好玩的?