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

1问题描述

使用盲目搜索中的宽度优先搜索算法或者使用启发式搜索中的全局择优搜索或A算法,对任意的八数码问题给出求解结果。例如:对于如下具体的八数码问题:
在这里插入图片描述
通过设计启发函数,编程实现求解过程,如果问题有解,给出数码移动过程,否则,报告问题无解。
对于输入输出的要求如下:
输入:初始节点和目标节点。
输出:如果无解在屏幕输出“目标状态不可达”;如果有解在屏幕输出“最少移动n步到达目标状态”,n为最少移动的步骤数,并记录从初始状态到目标状态的每一步中间状态。
可采用命令行方式、文件方式和GUI方式进行输入输出。
在完成以上内容的基础之上,完成拓展实验,实验内容如下:
1.记录宽度优先搜索、全局择优搜索、A
算法3种算法的执行时间,并比较三者的效率。
2.在启发式搜索中,分别实现4种启发式函数,并比较四者的效率,思考如何进一步改进启发式函数。
3.试分析在所有可能的初始状态和目标状态之间最长的最小移动步骤数是多少

2求解算法设计

八数码问题求解算法描述如下:
(1)算法输入:八数码问题初始节点与目标节点。
(2)算法输出:如果无解在屏幕输出“目标状态不可达”;如果有解在屏幕输出“最少移动n步到达目标状态”,n为最少移动的步骤数,并记录从初始状态到目标状态的每一步中间状态。
(3)算法步骤:
Step1存储初始节点信息和目的节点信息
Step2计算初始节点与目标节点的逆序数,判断初始节点与目的节点是否可达;若不可达,则输出“当前输入不可到达目标”,若可达,则转至Step3
Step3进行宽度优先搜索、全局择优搜索、A算法3种算法的选择,根据选择跳转至Step4,Step5,Step6
Step4对于宽度优先搜索
Step4.1将初始节点放入open表中
Step4.2判断open表是否为空,若为空,则输出“求解失败”,求解结束;否则,转至Step4.3
Step4.3从open表中取出一个节点node,并将node存入close表中
Step4.4判断node是否为目标节点。若是,则将路径信息输出,并输出最少移动步骤数,求解结束;否则,移动node节点的空格,查找符合移动方向且可达的后继节点,并将节点从尾部加入open表中,而后转Step4.2
Step5对于全局择优搜索
Step5.1将初始节点放入open表中
Step5.2判断open表是否为空,若为空,则输出“求解失败”,求解结束;否则,转至Step5.3
Step5.3从open表中取出一个节点node,并将node存入close表中
Step5.4判断node是否为目标节点。若是,则将路径信息输出,并输出最少移动步骤数,求解结束;否则,移动node节点中的空格,查找符合移动方向且可达的后继节点,并求出后继节点的估价值,根据估价值的大小顺序从小到大的加入open表中,而后转至Step5.2
Step6对于A
算法
Step6.1将初始节点放入open表中
Step6.2判断open表是否为空,若为空,则输出“求解失败”,求解结束;否则,转至Step6.3
Step6.3从open表中取出一个节点node,并将node存入close表中
Step6.4判断node是否为目标节点。若是,则将路径信息输出,并输出最少移动步骤数,求解结束;否则,移动node节点的空格,查找符合移动方向且可达的后继节点,判断所得后继节点是否已经出现在close表和open表中。若所得节点不存在与close表和open表中,则计算该节点的估价值,并根据估价值的大小顺序从小到大的将节点加入open表中;若所得节点存在于open表中,则比较该节点的估价值与已经存在节点的估价值,若新节点的估价值小,则删除旧节点,并按照估价值大小顺序将新节点插入open表中;若所得节点存在于close表中,则比较该节点的估价值与已经存在节点的估价值,若新节点的估价值较小,则删除close表中旧节点,按照估价值大小顺序将新节点加入open表中;而后转至Step6.2

3求解算法实现

3.1数据结构设计
对于节点信息,采用结构体,设计如下;
在这里插入图片描述
其中Dir为枚举类型数据,用于表示空格的移动方向,设计如下:
在这里插入图片描述
对于三种算法的open表和close表的设计。由于在宽度优先搜索算法中,后继节点往往从open表的尾部插入open表,因此对于宽度优先搜索算法,open表设计为队列。而在全局择优搜索和A算法中,由于涉及到根据估价值对结点进行排序,为了方便操作,因此将全局择优搜索和A算法中的open表设计为优先队列。而三种算法的close表均设计为队列。具体设计如下:
在这里插入图片描述
其中对于优先队列中结点估价值的大小比较,设计重载函数如下:
在这里插入图片描述
3.2核心算法设计
寻找后继节点的核心代码展示如下:
在这里插入图片描述
其中isMove函数用于判断当前方向下空格是否可以移动,用于判断空格是否可以移动的关键代码如下:
在这里插入图片描述
而进行估价值计算时,启发式函数的设计如下:
hFun1()为当前节点与目标节点格局相比,位置不符的数字个数。
在这里插入图片描述
hFun2()为当前节点与目标节点格局相比,位置不符的数字移动到目标节点中对应位置的最短距离之和。
在这里插入图片描述
输出路径信息时,借助具有“先进后出”特点的栈来存储从目标节点到初始结点的结点信息,而后依次出栈获取路径信息。核心代码展示如下:
在这里插入图片描述

4拓展实验完成情况

在此次大作业中,我选择完成拓展实验1,即记录三种算法的执行时间,并比较三种算法的效率。
首先对三种算法进行分析,盲目搜索的宽度优先搜索算法,在处理每个节点时不涉及启发函数以及估价值的求解,仅仅利用纯数学的方法即节点的位置来决定搜索节点的次序,因此搜索的复杂性较高;全局择优搜索,利用启发信息来决定搜索节点的次序,相比宽度优先搜索算法,效率会更高,不过在这个过程中全局择优搜索涉及估价值的计算以及根据估价值对节点进行排序;A算法,同样利用启发信息来决定搜索节点的次序,不过在进行节点估价值计算以及排序之前需要筛除相关节点,即已经存在于close表和open表中部分节点,因此在这个过程中A算法涉及判断节点是否已经存在、估价值的计算与比较以及根据估价值对节点进行排序,此外,A算法的有效性也取决于启发式函数的选择,且问题一旦有解,A算法可以得到最优解。
其次,关于本次实验对于估价函数的选择,通过比较估价函数1和估价函数2,估价函数1没有考虑数码应移动的距离,因此使用估价函数2作为本实验的估价函数更为合适。
分别使用最少移动步骤数小于等于6和最少移动步骤数大于等于10的两种类型的结点来对三种算法进行比较分析。
(1)最少移动步骤数小于等于6的节点对测试
最少移动步骤数为4的节点对如下:
在这里插入图片描述
分别使用宽度优先搜索算法、全局择优算法和A*算法对上述节点对进行求解,所得结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

通过比较可发现,当处理最少移动步骤数较小的节点时,三种算法的运行时间以及处理效率相差不大,A算法略胜于全局择优搜索算法略胜于宽度优先搜索算法。
(2)最少移动步骤数大于等于10的节点对测试
最少移动步骤数为16的节点对实例如下:
在这里插入图片描述
分别使用宽度优先搜索算法、全局择优搜索算法、A
算法对上述节点进行求解,所得结果如下:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

最少移动步骤数为30的节点对实例如下:
在这里插入图片描述
分别使用宽度优先搜索算法、全局择优搜索算法、A*算法对上述节点进行求解,所得结果如下:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

通过比较可发现,当处理最少移动步骤数较多的节点时,全局择优算法的运行时间和效率明显优于宽度优先搜索算法的运行时间和效率。而对于A算法,由于受估价函数的影响,以及由于每次对于新生成的结点都需要判断其是否是存在于close表和open表中的特殊节点,因此在此处需要花费较多的时间,此时A算法与宽度优先算法相比则失去优势,但是A*算法能够得出问题的最优解。

5实验对比结果分析

根据所编写的程序以及大作业任务要求,设计了6组初始节点和目标节点对,用于进行程序的运行于测试。其中节点对的设计涵盖了不可达、最少移动步骤数大于等于10、最少移动步骤数小于等于6这三种情况。
(1)不可达节点对测试
不可达节点对实例如下:
在这里插入图片描述
上述节点对的预期实验结果为程序输出“目标不可达”提示信息,实际程序运行结果为:
在这里插入图片描述
(2)最少移动步骤数大于等于10的节点对测试
最少移动步骤数为30的节点对实例如下:
在这里插入图片描述
其实际程序运行结果为(以全局择优搜索算法运行结果为例):
在这里插入图片描述
最少移动步骤数为20的节点对实例如下:
在这里插入图片描述
其实际程序运行结果为(以全局择优搜索算法运行结果为例):
在这里插入图片描述
最少移动步骤数为16的节点对实例如下:
在这里插入图片描述
其实际程序运行结果为(以A*算法运行结果为例):
在这里插入图片描述
(3)最少移动步骤数小于等于6
最少移动步骤数为4的节点对实例如下:
在这里插入图片描述
其实际程序运行结果为(以全局择优搜索为例):
在这里插入图片描述
最少移动步骤数为5的节点对实例如下:
在这里插入图片描述
其实际程序运行结果为(以宽度优先搜索为例):
在这里插入图片描述
从上面测试结果可知,所编写的程序能够较好地满足八数码问题求解的需求,可以进一步推广使用。

  • 8
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值