【人工智能】八数码问题的A*搜索算法实现

一、实验要求

        熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解八数码问题,理解求解流程和搜索顺序

二、实验原理

        定义h*(n)为状态n到目的状态的最优路径的代价,则当A搜索算法的启发函数h(n)小于等于h* (n),即满足

h(n)≤h*(n)

        对所有结点n时,A搜索算法被称为A*搜索算法。

        A* 搜索算法是由著名的人工智能学者Nilsson 提出的,它是目前最有影响的启发式图搜索算法,也称为最佳图搜索算法。

        如果某一问题有解,那么利用A*搜索算法对该问题进行搜索则一定能搜索到解,并且一定能搜索到最优解。

        A*算法有以下特性:可采纳性、单调性、信息性。

三、实验过程记录

        八数码问题就是在一个3*3的方格盘上,放有1-8的数码,余下一格为空。空格四周上下左右的数码可移到空格。需要找到一个数码移动序列使初始的无序数码转变为一些特殊的排列。

我们下面的求解均以该题为例

        利用A*算法,首先需要给出估价函数f(n)。

        已知f(n)=g(n)+h(n),g(n)代表从初始节点到n节点的实际代价,h(n)代表从n节点到目的节点的最佳路径的估计代价。根据问题,我们定义g(n)=d(n),即当前实际代价为状态的深度;h(n)=w(n),估计最优代价为“不在位”的数码数量,且满足h(n)<=h*(n)。至此,A*算法所需准备完成。

        我们可以得到如下的搜索树,此时的s-B-E-I-K-L即为最优解路。

        下面我们利用Python实现A*算法求解,程序源代码如下:

import numpy as npimport operatorO=int(input(("请输入方阵的行/列数:")))A=list(input("请输入初始状态:"))B=list(input("请输入目标状态:"))z=0M=np.zeros((O,O))N=np.zeros((O,O))for i in range(O):for j in range(O):M[i][j]=A[z]N[i][j]=B[z]z=z+1openlist=[]#open表class State:def __init__(self,m):self.node=m#节点代表的状态self.f=0#f(n)=g(n)+h(n)self.g=0#g(n)self.h=0#h(n)self.father=None#节点的父亲节点init = State(M)#初始状态goal = State(N)#目标状态#启发函数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 openlist#全局变量可以让open表进行时时更新openlist=[s]while(openlist):#当open表不为空get=openlist[0] #取出open表的首节点 if (get.node==goal.node).all():#判断是否与目标节点一致return getopenlist.remove(get)#将get移出open表#判断此时状态的空格位置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#新节点的估价函数值openlist.append(new)#加入open表中list_sort(openlist)#排序# 递归打印路径def printpath(f):if f is None:return#注意print()语句放在递归调用前和递归调用后的区别。放在后实现了倒叙输出printpath(f.father)print(f.node)final=A_star(init)if final:print("有解,解为:")printpath(final)else:print("无解")

四、实验结果

五、实验过程中存在的问题及解决方案

        一开始没搞清楚A搜索A*搜索的区别,尤其是在这个题中,两者的搜索树和过程完全相同。后续通过查找资料和个人理解发现,在该题中相同,是因为我们在A搜索时选择的启发函数h(n)已经符合了A*搜索的h(n)<=h*(n)的条件,因此此时八数码的A搜索树就是A*搜索树。

六、实验总结

        本次实验,我们用Python实现了A*搜索。A*搜索是目前最有影响力的启发式搜索算法,使用A*搜索和其他启发式搜索的核心就是构建启发函数。

        通过这次实验,我进一步熟悉和掌握了启发式搜索的定义、估价函数和算法过程,理解了具体应用到A*搜索时,求解的流程和搜索顺序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用毫米波雷达传感器的功能安全兼容系统设计指南2(TI文档)

2.3 步骤3&#xff1a;平台选择 平台选择是设计生命周期中最关键的步骤之一。一旦从第二步完成了一个成熟的系统框图&#xff0c;重要的任务就是根据性能需求选择系统模块/子系统。TI广泛的毫米波雷达传感器产品组合可以帮助实现许多性能要求&#xff0c;如远程或中程、角度分辨…

GoogLeNet模型详解

模型介绍 GoogLeNet是谷歌工程师设计的深度神经网络结构&#xff0c;于2014年在ImageNet比赛中取得了冠军。它的设计特点在于既有深度&#xff0c;又在横向上拥有“宽度”&#xff0c;并采用了一种名为Inception的核心子网络结构。这个网络名字中的“GoogLeNet”是对LeNet的致…

Layui + Echarts 5.0

Layui 怎么整合最新版本的 Echarts 5.0&#xff0c;Echarts 4 升级到 5后&#xff0c;有了很大改变&#xff0c;新的配置项4是无法兼容的&#xff0c;所以想要使用新的功能&#xff0c;都需要升级&#xff01; 新建一个echarts.js文件 layui.define(function (exports) {// 这…

【Linux】网络基本配置及网络测试、测试工具

一、网络基本配置 查看网络信息&#xff1a; ifconfigc / ip addr停止网卡eth0&#xff1a; ifconfig eth0 down在本地启动网卡eth0&#xff1a; ifconfig eth0 up改变网卡ip&#xff1a; ifconfig eth0 192.168. .修改子网掩码&#xff1a; ifconfig eth0 &#xff08;I…

2023年算法OOA-CNN-BiLSTM-ATTENTION回归预测(matlab)

OOA-CNN-BiLSTM-Attention鲸鱼算法优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 鱼鹰优化算法&#xff08;Osprey optimization algorithm&#xff0c;OOA&#xff09;由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出&#xff0c;其模拟鱼鹰的捕…

Nodejs前端学习Day5

苦其心志&#xff0c;劳其筋骨 文章目录 前言一、处理路径问题二、path路径模块总结 前言 继续fs 一、处理路径问题 在使用fs模块操作文件时&#xff0c;如果提供的操作路径是以./或…/开头的相对路径时&#xff0c;很容易出现路径动态拼接错误的问题 原因&#xff1a;代码在…

读写注册表、读写文件windows api接口

在Windows操作系统中&#xff0c;对注册表进行读写操作和对文件进行读写操作涉及不同的API接口。这些API接口是Windows API的一部分&#xff0c;通常在C或C语言中使用。以下是一些主要的API接口&#xff1a; 注册表API接口 读取注册表 RegOpenKeyEx: 打开注册表键。RegQueryVa…

USB-C显示器:未来显示技术的革新者

随着科技的不断发展&#xff0c;显示技术也在不断进步&#xff0c;而USB-C显示器作为最新的显示技术&#xff0c;正在引领着显示行业的发展潮流。USB-C显示器具有许多优点&#xff0c;如高速传输、便捷连接、节能环保等&#xff0c;使其成为未来显示技术的革新者。 一、USB-C显…

【leetcode】01背包总结

01 背包 关键点 容器容量固定每件物品只有两种状态&#xff1a;不选、选 1 件求最大价值 代码 int N, W; // N件物品&#xff0c;容量为W int w[N], v[N]; // w为大小&#xff0c;v为容量/* 数组定义 */ int[][] dp new int[N][W 1]; // 注意是W 1, 因为重量会取到W dp[…

向日葵企业“云策略”升级 支持Android 被控策略设置

此前&#xff0c;贝锐向日葵推出了适配PC企业客户端的云策略功能&#xff0c;这一功能支持管理平台统一修改设备设置&#xff0c;上万设备实时下发实时生效&#xff0c;很好的解决了当远程控制方案部署后&#xff0c;想要灵活调整配置需要逐台手工操作的痛点&#xff0c;大幅提…

小型洗衣机哪个牌子好用又耐用?最好用的迷你洗衣机推荐

最近这两年在洗衣机中火出圈的内衣洗衣机&#xff0c;它不仅可以清洁我们较难清洗的衣物&#xff0c;自带除菌功能&#xff0c;可以让衣物上的细菌&#xff0c;还能在清洗的过程中呵护我们衣物的面料&#xff0c;虽然说它是内衣洗衣机&#xff0c;它的功能不止可以清洗内衣&…

怎样开发adobe indesign插件,具体流程?

文章目录 第一.流程步骤第二.如何调试indesign插件第三.相关资源第四.总结 第一.流程步骤 开发Adobe InDesign插件通常涉及以下步骤&#xff1a; 获取SDK和工具&#xff1a; 从Adobe官方网站下载最新的Adobe InDesign SDK&#xff08;Software Development Kit&#xff09;&am…

精通Python第16篇—深入解析Pyecharts极坐标系参数与实战

文章目录 Pyecharts绘制多种炫酷极坐标系参数说明与方向的技术博客1. 导入必要的库2. 极坐标系基础3. 定制化极坐标系4. 方向性的极坐标系5. 极坐标系的动画效果6. 自定义极坐标轴标签7. 添加极坐标系的背景图8. 极坐标系的雷达图总结 Pyecharts绘制多种炫酷极坐标系参数说明与…

JVM系列——对象管理

JVM对象分布 对象头 第一类是用于存储对象自身的运行时数据&#xff0c;如哈希码&#xff08;HashCode&#xff09;、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等 另外一部分是类型指针&#xff0c;即对象指向它的类型元数据的指针&#xff0c;Java 虚…

系统架构设计师-22年-论文题目

系统架构设计师-22年-论文题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 题目任选其一 摘要字数在400字以内&#xff0c;可以分条叙述&#xff0c;但不允许有图、表、流程图。 正文字数为2000字至300字&#xff0c;文中可以分条叙述&#xff0c;但不要全部用分条…

DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测(代码+教程)

DeepSORT算法是一种用于目标跟踪的算法&#xff0c;它可以对车辆和行人进行跟踪计数&#xff0c;并且可以检测是否存在道路违规行为。该算法采用深度学习技术来提取特征&#xff0c;并使用卡尔曼滤波器来估计物体的速度和位置。 DeepSORT算法通过首先使用目标检测算法来识别出…

1 月 27日算法练习-贪心

文章目录 扫地机器人分糖果最小战斗力差距谈判纪念品分组 扫地机器人 思路&#xff1a; 最优机器人清理方法&#xff1a;机器人清理方法先扫左边&#xff0c;有时间再扫右边。最短时间&#xff1a;通过枚举&#xff0c;从 1 开始&#xff0c;清理面积会越大直到全部面积的清理…

【Sql Server】新手一分钟看懂在已有表基础上增加字段和说明

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第8章 项目整合管理(九)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

计算机网络——IP协议

前言 网络层的主要负责地址分配和路由选择,ip负责在网络中进行数据包的路由和传输。 IPv4报文组成&#xff08;了解&#xff09; IPv4首部&#xff1a;IPv4首部包含了用于路由和传输数据的控制信息&#xff0c;其长度为20个字节&#xff08;固定长度&#xff09;。 版本&#…