目录

一、实验主要步骤

①.设计界面输入规则

②.判断是否有解

③.求解

二、实验结果展示

三、附录

完整实验程序代码:


一、实验主要步骤

①.设计界面输入规则

有且仅有9位数字代表数码和空格,从左到右,从上至下,空格用0表示。

②.判断是否有解

有判断是否有解至关重要,因为后续求解的过程中包含着循环迭代,若无解的话,程序会始终处于寻找解的状态,陷入死循环无法跳出。作为用户,短时间内无法判断是求解时间过长还是陷入死循环中,影响判断。
经过查阅,得知可以用逆序数解决是否有解问题。

将其转换为代码:

#先判断八数码问题是否有解
num1=0
num2=0
#求初始状态的逆序数 num1
for i in start:if i!="0":for j in start[0:start.index(i)]:if j>i:num1=num1+1
#求目的状态的逆序数 num2
for i in end:if i!="0":for j in end[0:end.index(i)]:if j>i:num2=num2+1
if num1%2!=num2%2:print("该题无解")exit(0)#如果无解则立即退出程序 避免在后面的算法中陷入死循环

③.求解

有解时,首先创建两个矩阵START和END分别存储初始状态和目标状态,之后定义类State,当类实例化的时候,自动调用类函数init,创建结点、给启发函数赋初始值以及给父亲结点赋值。

#创建两个矩阵 分别将初始状态和目标状态赋值给矩阵
START=np.zeros((num,num))
END=np.zeros((num,num))
for i in range(num):for j in range(num):START[i][j]=start[z]END[i][j]=end[z]z=z+1
excel=[]class State:def __init__(self,m):#node存储矩阵的数据self.node=m#f(n)为g(n)+h(n)self.f=0self.g=0self.h=0#节点的父亲节点赋初始值self.father=Noneinit = State(START)#初始状态
goal=State(END)#目标状态

定义启发函数h:a初始值为,若当前结点与目标结点的值不一致,则a自增1,函数的返回值为a。

#启发函数
def h(s):a=0for i in range(len(s.node)):for j in range(len(s.node[i])):if s.node[i][j]!=goal.node[i][j]:a=a+1return a

定义排序函数list_sort:对结点列表,安装估价函数的值的规则进行排序。

#对节点列表按照估价函数的值的规则排序
def list_sort(l):cmp=operator.attrgetter('f')l.sort(key=cmp)

定义打印函数printpath:使用递归对路径进行打印。

# 递归打印路径
def printpath(f):if f is None:return#注意print()语句放在递归调用前和递归调用后的区别。放在后实现了倒叙输出printpath(f.father)print(f.node)

A*算法:当excel表格不为空时循环求解:若结点与目标结点一致,则从excel列表里移除该结点,随后判断空格状态的位置并开始移动,最后再将excel表格排序进行下一次的循环。

#A*算法
def A_star(s):global excel#全局变量可以让excel表进行时时更新excel=[s]#当excel表不为空时 循环求解while(excel):get=excel[0] #取出excel表的首节点  if (get.node==goal.node).all():#判断是否与目标节点一致return getexcel.remove(get)#将get移出excel表#判断此时状态的空格位置for a in range(len(get.node)):for b in range(len(get.node[a])):if get.node[a][b]==0:breakif get.node[a][b]==0:break#开始移动for i in range(len(get.node)):for j in range(len(get.node[i])):c=get.node.copy()if (i+j-a-b)**2==1:c[a][b]=c[i][j]c[i][j]=0new=State(c)new.father=get#此时取出的get节点成为新节点的父亲节点new.g=get.g+1#新节点与父亲节点的距离new.h=h(new)#新节点的启发函数值new.f=new.g+new.h#新节点的估价函数值excel.append(new)#加入excel表中list_sort(excel)#排序 

二、实验结果展示

、附录

完整实验程序代码:

import numpy as np
import operatorprint("注:本系统应用于八数码问题,加上无数码位共需输入9位数字,数字之间不需要输入空格或标点符号,用数字0表示无数码,如输入123456708,即为:")
print("        1  2  3")
print("        4  5  6")
print("        7  0  8")
start=list(input("初始状态:"))
end=list(input("目标状态:"))
num=3
z=0#先判断八数码问题是否有解
num1=0
num2=0
#求初始状态的逆序数 num1
for i in start:if i!="0":for j in start[0:start.index(i)]:if j>i:num1=num1+1
#求目的状态的逆序数 num2
for i in end:if i!="0":for j in end[0:end.index(i)]:if j>i:num2=num2+1
if num1%2!=num2%2:print("该题无解")exit(0)#如果无解则立即退出程序 避免在后面的算法中陷入死循环#创建两个矩阵 分别将初始状态和目标状态赋值给矩阵
START=np.zeros((num,num))
END=np.zeros((num,num))
for i in range(num):for j in range(num):START[i][j]=start[z]END[i][j]=end[z]z=z+1
excel=[]class State:def __init__(self,m):#node存储矩阵的数据self.node=m#f(n)为g(n)+h(n)self.f=0self.g=0self.h=0#节点的父亲节点赋初始值self.father=Noneinit = State(START)#初始状态
goal=State(END)#目标状态#启发函数
def h(s):a=0for i in range(len(s.node)):for j in range(len(s.node[i])):if s.node[i][j]!=goal.node[i][j]:a=a+1return a#对节点列表按照估价函数的值的规则排序
def list_sort(l):cmp=operator.attrgetter('f')l.sort(key=cmp)#A*算法
def A_star(s):global excel#全局变量可以让excel表进行时时更新excel=[s]#当excel表不为空时 循环求解while(excel):get=excel[0] #取出excel表的首节点  if (get.node==goal.node).all():#判断是否与目标节点一致return getexcel.remove(get)#将get移出excel表#判断此时状态的空格位置for a in range(len(get.node)):for b in range(len(get.node[a])):if get.node[a][b]==0:breakif get.node[a][b]==0:break#开始移动for i in range(len(get.node)):for j in range(len(get.node[i])):c=get.node.copy()if (i+j-a-b)**2==1:c[a][b]=c[i][j]c[i][j]=0new=State(c)new.father=get#此时取出的get节点成为新节点的父亲节点new.g=get.g+1#新节点与父亲节点的距离new.h=h(new)#新节点的启发函数值new.f=new.g+new.h#新节点的估价函数值excel.append(new)#加入excel表中list_sort(excel)#排序
# 递归打印路径
def printpath(f):if f is None:return#注意print()语句放在递归调用前和递归调用后的区别。放在后实现了倒叙输出printpath(f.father)print(f.node)final=A_star(init)if final:print("有解,解为:")printpath(final)

A*算法解决八数码问题 人工智能原理实验报告 启发式搜索 python相关推荐

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

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

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

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

  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. Nilsson's sequence score算法解决八数码问题解释

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

  6. 全局择优搜索、A*算法、宽度优先算法解决八数码问题

    1问题描述 使用盲目搜索中的宽度优先搜索算法或者使用启发式搜索中的全局择优搜索或A算法,对任意的八数码问题给出求解结果.例如:对于如下具体的八数码问题: 通过设计启发函数,编程实现求解过程,如果问题有 ...

  7. 人工智能实现a*算法解决八数码_小白带你学回溯算法

    微信公众号:小白算法 关注可了解更多算法,并能领取免费资料.问题或建议,请公众号留言;小白算法,简单白话算法,每个人都能看懂的算法 上一期算法回顾--贪婪法:https://mp.weixin.qq. ...

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

    从起点 开始,把它加入到一个由方格组成的open list(开放列表) 中,这个open list像是一个购物清单.Open list里的格子是可能会是沿途经过的,也有可能不经过.因此可以将其看成一个 ...

  9. C++ 使用A*算法解决八数码问题

    主要过程: 通过一个当前最好状态即best矩阵,移动0或者空白的位置,上下左右生成4个方向的子结点(如果0没有越界),把子结点加入到open表中,当前的best加入到closed表.然后在open表中 ...

最新文章

  1. 面试官:说一下线程池内部工作原理?
  2. 0寄存器与arm_如何在ARM下进行高效的C编程?
  3. 封装的cookie存储、获取、删除方法
  4. 使用requests请求网页时,返回的页面信息有时是乱码,如下代码
  5. ADN中国队参加微软Kinect他赢得了全国比赛三等奖,我们的创意项目与团队Kinect于Naviswork虚拟之旅...
  6. mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享
  7. qt动画效果_Qt编写自定义控件44-天气仪表盘
  8. apache php 500,apache出现500错误的原因是什么
  9. java中double除法和取余的若干注意
  10. java(19) - 反射机制
  11. VMware View虚拟桌面在安卓平板电脑上的演示
  12. nyoj 605 Dice Tower
  13. 快播资源哪里跑(逆向)
  14. ansys 服务器系统,云服务器 ansys
  15. ffmpeg滤镜专题2-高斯模糊
  16. 零基础学IT选择软件测试有前途吗?
  17. 反转链表(leetcode 206)
  18. 计算机基础知识教学反思,计算机基础课教学反思.doc
  19. 2014阿里实习生面试题——mysql如何实现索引的
  20. 使用Pycharm设置python脚本文件头

热门文章

  1. Xcode 截取手机屏幕并保存在mac上
  2. GB28181国标平台LiveGBS如何获取下级监控摄像头、4G执法记录仪、无人机等GB28181设备的经纬度位置信息
  3. 重磅!全新N9042B UXA信号分析仪,助力毫米波技术的应用创新!
  4. 实现OutputDebugString输出调试消息
  5. 京城报刊全面提速 城八区居民提前一小时看早报
  6. 吉利发布新出行科技品牌“礼帽出行” 定位高品质定制化出行
  7. Android 官方数据库Room --- 配置
  8. 5G通信与物联网技术交流群
  9. 为什么电脑不能安全关闭计算机,电脑执行关机命令后,不能自动切断电源,而是在屏幕上显示“您可以安全关闭计算机”...
  10. Matlab画三维图的方法