问题描述:
八数码,在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。(注:图片给的例子无解。)
内容提要:
分别用广度优先搜索策略、深度优先搜索策略和启发式搜索算法(至少两种)求解八数码问题;分析估价函数对启发式搜索算法的影响;探究讨论各个搜索算法的特点。
实验步骤:
1.随机生成一个八数码问题分布,设计一个可解的目标状态(要求棋盘9个位置都不同)。
2.分别用广度优先搜索策略、深度优先搜索策略和至少两种启发式搜索算法求解八数码问题。
实验步骤
1.广度优先搜索
先从空白格周围开始搜索,上下左右四个方向找到了可交换的位置,就把位置交换之后的状态放入队列中,再从队列中取出队头元素,重复以上步骤。
2.有界深度搜索
先设定一个搜索的界限值,从空白格的四周开始搜索,找到了可交换的位置,就把该状态放进栈中,交换位置之后继续搜索,直到搜索到了界限值并且四周都搜索完毕没有可交换的位置,该状态出栈,取出栈顶元素继续重复以上步骤搜索。
3.启发式搜索
从空白格的四周开始搜索,把空白格放进open表中,从open表中取出表头,找出该层中上下左右四个方向搜索到可交换的位置,放进close表中,并计算出该状态与目标状态不同的格子数为id值,找出该层中最小id值的状态,再把这些状态放入open表中,重复上述步骤。
4.启发式搜索A*
先构造一个优先级队列,从空白格四周开始搜索,把空白格放入open表中,并计算出该状态的id值即层数加该状态不同格子与移动到目标状态最小位移数,取出open表中表头元素放进close表,搜索可以交换的位置放进open,重复该步骤。
分析说明(包括核心代码及解释)
1.广度优先搜索
#include #include
实验结果:
2.有界深度搜索
#include #include #include #include
实验结果:
3.启发式搜索
#include #include #include
实验结果:
4.启发式搜索A*
#include #include #include #include
实验结果:
总结心得
广度搜索从四周扩散式地搜索直到搜索到目标节点,比深度搜索效率要高;考虑到深度搜索要是不设置界限值可能要花很长时间才找到目标状态节点,就采取了有界深度搜索,效率比深度搜索要高;启发式搜索相对效率要更高一些,基于广度搜索的算法,在代价函数估计值,找到最接近目标状态的路径去搜索到目标状态。一个状态表示成一维的形式,求出除0之外所有数字的逆序数之和,也就是每个数字前面比它大的数字的个数的和,称为这个状态的逆序。若两个状态的逆序奇偶性相同,则可相互到达,否则不可相互到达。
到此这篇关于利用C++求解八数码问题的文章就介绍到这了,更多相关C++求解八数码问题内容请搜索0133技术站以前的文章或继续浏览下面的相关文章希望大家以后多多支持0133技术站!