A*解决八数码问题

  • 问题内容
  • 算法流程
  • 相关设置
  • 具体程序
  • 运行结果
  • 遇到的问题
  • 完结

问题内容

【八数码问题】
在一个3×3的九宫中有1-8这8个数字以及一个空格随机摆放在其中的格子里。将该九宫格调整到目标状态。
规则:每次只能将与空格(上、下、左、右)相邻的一个数字移动到空格中。试编程实现这一问题的求解。
备注:为了程序中表示方便,用0代替空格。
初始状态和目标状态:均由用户通过键盘手工输入或者从文件读入(不可以写死在程序里面)。

算法流程

相关设置

其实和之前的传教士问题的设置差不多,都有用到open表和closed表。

(1)状态用字符串表示 ,如“513708246”;
(2)对状态结点展开所用到的open表和closed表,就用列表 opened=[ ],closed=[ ];
(3)为了保存每一个状态的父结点,使用字典parent={ key:value },key必须不可变,且唯一,和状态的特性相似,value即为每个状态对应的父结点;
(4)为了计算估价函数值,使用Gn={}和Fn={},用来存储状态和对应的估价函数值;
(5)这里的估价函数值中的H(n) 是和目标状态相比错位的数目。

关于程序中用到的函数:
THEnum()–用来计算状态的逆序数;
Hn()–用来计算估价函数中的值,即为当前状态和目标状态的错位数;
Expand()–对结点进行拓展;
MIN()–从opened表中选择估价函数值最小的一个状态;
PRINT()–按格式输出结果。

具体程序

本人来自江南大学,同校的小伙伴们记得修改修改,以免查重

# -*- coding: utf-8 -*-
"""
Created on Thu Apr  2 21:58:44 2020@author:jn
"""
#计算状态对应的逆序数
def THEnum(node):Sum=0for i in range(1,9):num=0for j in range(0,i):if node[j]>node[i] and node[i]!='0':num=num+1Sum+=numreturn Sum#h(n)函数,用于计算估价函数f(n),这里的h(n)选择的是与目标相比错位的数目
def Hn(node):global goalhn=0for i in range(0,9):if node[i]!=goal[i]:hn+=1return hn#拓展node状态对应的子结点
def Expand(node):global expandtnode=[]state = node.index("0")elist= expand[state]j=statefor i in elist:j=stateif i>j:i,j = j,ire= node[:i] + node[j] + node[i+1:j] + node[i] + node[j+1:]tnode.append(re)return tnode#将最后的结果按格式输出
def PRINT(result):for i in range(len(result)):print("step--" + str(i+ 1))print(result[i][:3])print(result[i][3:6])print(result[i][6:])#选择opened表中的最小的估价函数值对应的状态
def MIN(opened):ll={}for node in opened:k=Fn[node]ll[node]=kkk=min(ll,key=ll.get)return kk#主程序开始
opened=[]
closed=[]
Gn={}#用来存储状态和对应的深度,也就是初始结点到当前结点的路径长度
Fn={}#用来存放状态对应的估价函数值
parent={}#用来存储状态对应的父结点#expand中存储的是九宫格中每个位置对应的可以移动的情况
#当定位了0的位置就可以得知可以移动的情况
expand = {0:[1, 3], 1:[0, 2, 4], 2:[1, 5],3:[0,4,6], 4:[3,1,5,7], 5:[4,2,8],6:[3,7],  7:[6,4,8], 8:[7,5]}start=input("请输入初始状态(从左至右,从上到下,如:102345678):")
goal =input("请输入目标状态(从左至右,从上到下,如:123456780):")if start==goal:print("初始状态和目标状态一致!")
#判断从初始状态是否可以达到目标状态
if (THEnum(start)%2)!=(THEnum(goal)%2):print("该目标状态不可达!")
else:parent[start]=-1#初始结点的父结点存储为-1Gn[start]=0#初始结点的g(n)为0Fn[start]=Gn[start]+Hn(start)#计算初始结点的估价函数值opened.append(start)#将初始结点存入opened表while opened:current=MIN(opened)#选择估价函数值最小的状态del Fn[current]opened.remove(current)#将要遍历的结点取出opened表if current==goal:breakif current not in closed:closed.append(current)#存入closed表 Tnode=Expand(current)#扩展子结点for node in Tnode:#如果子结点在opened和closed表中都未出现,则存入opened表#并求出对应的估价函数值if node not in opened and node not in closed:Gn[node]=Gn[current]+1Fn[node]=Gn[node]+Hn(node)parent[node]=currentopened.append(node)else:#若子结点已经在opened表中,则判断估价函数值更小的一个路径#同时改变parent字典和Fn字典中的值if node in opened:fn=Gn[current]+1+Hn(node)if fn<Fn[node]:Fn[node]=fnparent[node]=currentresult=[]#用来存放路径result.append(current)while parent[current] != -1:#根据parent字典中存储的父结点提取路径中的结点current =parent[current]result.append(current)result.reverse()#逆序PRINT(result)#按格式输出结果

运行结果

遇到的问题

没遇到什么问题,哈哈哈哈

完结

撒花~~~~~~~~~

python---A*搜索算法解决八数码问题相关推荐

  1. 宽度优先搜索算法解决八数码问题

    宽度优先搜索算法解决八数码问题 原理 1.宽度优先搜索是指在一个搜索树中,搜索以同层邻近节点依次扩展节点.这种搜索是逐层进行的,在对下一层的任一节点进行搜索之前,必须搜索完本层的所有节点. 宽度优先搜 ...

  2. 有界深度优先搜索算法解决八数码问题

    <人工智能导论>(第四版) 课后题5.3 C++实现 题目: 运行结果: C++代码: 思想:Octal结构体表示一个状态,其中parent和current为父状态和当前状态的值,这个值可 ...

  3. Python利用A*算法解决八数码问题

    资源下载地址:https://download.csdn.net/download/sheziqiong/86790565 资源下载地址:https://download.csdn.net/downl ...

  4. Astar、A星算法解决八数码问题--python实现

    一.问题描述 数码问题又称9宫问题,与游戏"华容道"类似.意在给定的3*3棋格的8个格子内分别放一个符号,符号之间互不相同,余下的一格为空格.并且通常把8个符号在棋格上的排列顺序称 ...

  5. 题目2:隐式图的搜索问题(A*算法解决八数码)

    数据结构课程实践系列 题目1:学生成绩档案管理系统(实验准备) 题目2:隐式图的搜索问题(A*算法解决八数码) 题目3:文本文件单词的检索与计数(实验准备) 文章目录 数据结构课程实践系列 题目1:学 ...

  6. Nilsson's sequence score算法解决八数码问题解释

    解决了最近一个人工智能关于解决八数码难题的作业. 图可能看不清,除了黑块外其他位置是英文字母ABCDEFGH A*:f(n)=g(n)+h(n) 其中f为总花费,g为已知花费(深度),h为估计花费 关 ...

  7. A*算法解决八数码问题 Java语言实现

    A*算法解决八数码问题 Java语言实现 参考文章: (1)A*算法解决八数码问题 Java语言实现 (2)https://www.cnblogs.com/beilin/p/5981483.html ...

  8. 深度优先搜索解决八数码难题

    八数码问题 以前用java写的通过深度优先瘦素解决八数码难题. 对于八数码难题来说,可以把9宫格看成一个[3][3]的二维数组,将空格位置看成0,将0可以移动的方向看成树的枝丫,分为上下左右4个方向. ...

  9. python解决八数码问题_A搜索算法(python)之八数码问题

    什么是启发式搜索算法 启发式搜索(Heuristically Search)又称为有信息搜索(Informed Search),它是利用问题拥有的启发信息来引导搜索,达到减少搜索范围.降低问题复杂度的 ...

最新文章

  1. PAL算法原理及代码实现
  2. dev-sidecar安装桌面版
  3. 3 Curator框架实现分布式锁
  4. MYSQL数据库学习十七 日志管理
  5. 尚硅谷_Ajax_学习笔记
  6. 特斯拉全球超级充电站已超过25000座 国内超过870座
  7. 每日一拍:linux升级python2.x到python3.x
  8. HoloLens 2开发:获取并渲染双手
  9. grafana设置mysql为数据源,并进行可视化
  10. python的N个小功能(图片预处理:打开图片,滤波器,增强,灰度图转换,去噪,二值化,切割,保存)...
  11. 数字信号处理实验(六)——FIR滤波器的设计
  12. Mysql之无法查询中文字解决办法
  13. vue-echarts教程
  14. bin 转hex方法
  15. 一文入门智能开关的3种功能形态
  16. Android 设置wifi共享电脑服务器资源
  17. python scipy拟合曲线optimize.curve_fit 50例
  18. tenacity 报错_Python tenacity源码分析(一个专门用来做重试的库)v1.0
  19. 14.VRP介绍以及AC初始化配置_AC和AP的软件升级方法
  20. 2019年6款最佳的wordpress主机推荐(优缺点分析)

热门文章

  1. 香港公司、香港离岸公司和岛屿公司3者区别
  2. NPS、市场增长率每况愈下,移动CRM如何自救?
  3. 【蓝桥杯真题练习】STEMA科技素养练习题库 练习版004 持续更新中~
  4. 职场:“工作”的理解
  5. (Java实现) 洛谷 P1387 最大正方形
  6. 通过WinPE卸载补丁,解决因安装补丁电脑蓝屏、无法开机等问题
  7. python第三次课:数据结构第二部分----(元组和集合)
  8. 用python定义两个元组_python初学-元组、集合
  9. Python 实验题目:字符串格式化输出内容为:姓名:张三,学号:1101,张三的平均分为90.65分。(平均分的原始值为:90.6497)
  10. php微信狗,PHP 微信狗小程序 搜鱼CMS商业正版V3.1 一键生成小程序