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的节点对实例如下:

其实际程序运行结果为(以宽度优先搜索为例):

从上面测试结果可知,所编写的程序能够较好地满足八数码问题求解的需求,可以进一步推广使用。

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

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

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

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

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

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

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

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

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

  5. 有趣的数据结构算法12——利用递归解决八皇后问题

    有趣的数据结构算法12--利用递归解决八皇后问题 题目复述 解题思路 实现代码 GITHUB下载连接 本次教程主要讲述如何利用递归解决八皇后问题,它和汉诺塔一样让人很难过. 题目复述 据说西洋棋手都具 ...

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

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

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

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

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

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

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

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

最新文章

  1. 【转】Visual Studio 2010 架构图之用例图(UML Use Case Diagram)
  2. selenium作业题
  3. 连接sql server数据库的两种方式
  4. 加装的硬盘进入后点不了文件夹_Mac OS Catalina 挂载NTFS硬盘的问题 (无需第三方软件,几行代码即可)...
  5. python里面的dict和set
  6. linux无线网卡连不上网,Ubuntu 16.04无线网卡不见,无法用WiFi上网的解决方法
  7. 美团将建新上海总部 斥资65亿元拿下上海杨浦商办地块
  8. Unity3D游戏开发之GUI
  9. [ES6系列-01]Class:面向对象的“新仇旧恨”
  10. Mybatis 中经典的 9 种设计模式!面试可以吹牛了!
  11. PowerShell在Exchange2010下快速开启邮箱[续]
  12. Angular 4.x Template-Driven Forms
  13. Java:详解List集合的排序功能
  14. web自动化(Python版)之百度登录
  15. XTU 1249 Rolling Variance
  16. win10无线显示未连接到服务器,解决win10无线网络已连接但上不了网的方法
  17. Hdu 5804 Price List【水题】
  18. 小程序 实现星星评分(共10分),含有半星
  19. CPU个数、CPU物理核数、CPU逻辑核数、vCPU数之间的区别
  20. cocos creator尝试使用tween的几种新实现方案

热门文章

  1. STM32 BOOT模式配置以及作用
  2. 人脸识别广告显示屏通过人像识别、面部识别应用
  3. [Python] python 破解Excel密码(还原工作表密码)
  4. 黄仁勋:GPU,打折!
  5. 【烈日炎炎战后端】操作系统(1.1万字)
  6. Prometheus使用cAdvisor监控Docker容器指标
  7. 数据结构课程设计--图书管理系统
  8. 基于IOS音乐播放器在线歌词同步小程序系统(音乐小程序)
  9. MySQL必知必会——第十五章联结表
  10. Theil-Sen Median斜率估计和Mann-Kendall趋势分析:以多年NPP数据为例