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

    技术2025-07-08  24

    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的节点对实例如下: 其实际程序运行结果为(以宽度优先搜索为例): 从上面测试结果可知,所编写的程序能够较好地满足八数码问题求解的需求,可以进一步推广使用。

    Processed: 0.015, SQL: 9