数据结构实践作业(二)隐式图的搜索问题 预习报告


一、实验内容

3x3九宫棋盘,放置数码为1~8的8个棋子,棋盘中留有一个空格,空格周围的棋子可以移动到空格中,从而改变棋盘的布局。根据给定初始布局和目标布局,移动棋子从初始布局到达目标布局,求解移动步骤并输出。请设计算法,使用合适的搜索策略,在较少的空间和时间代价下找到最短路径
在这里插入图片描述

二、实验任务

1)对九宫重排问题,建立图的启发式搜索求解方法;
2)用A*算法求解九宫重排问题。

三、算法

A*算法

A*算法是一种用于求解最短路径的算法,给出起始节点和终止节点,其中核心公式为F=G+H。

伪代码如下

建立两个集合分别为 open list 和close list.
将起始节点放入open list中
while(open list不为空)
{
将当前节点放入close list中,并将其周围可到达的节点全部放入open list
将open list中F值最低的节点设置为当前节点,然后在open list中寻找从当前节点出发,G值更小的节点,若存在,则把该节点设置为当前节点。
if(终点节点在open list中)
break;
}

四、解题思路

首先应该选定A*算法在这题中的h(x)函数,在这里我们有三种选择方法
1.以不在位的数码的个数为估价函数
2.以不在位的数码归位所需的最短距离和即曼哈顿距离为估价函数
3.将逆序对数作为估价函数
可以证明前两种都是乐观估计,最后一种不是,因此前两种都可以作为八数码问题的估价函数,但是你的估计值与真实值越近所需要搜索的状态越少,很明显第一种方法太乐观了(估价函数的选取直接决定算法的效率),因此我们采用第二种方法作为八数码问题的估价函数
解决了估价函数的问题以后,第二个需要解决的问题就是判重,我们首先想到的是用集合set,这种方法最简单,但是很不幸这种方法耗时也是最多的,如果时间要求比较高的话,这种情况很容易超时。这里我们不用这种方法,判重问题自然而然想到的是哈希表,好了现在问题又来了,如何创建哈希表,也就是哈希函数怎么写,这个东西比较有技巧,还好对于这种问题有一种现成的方法解决,那就是康托展开 ,还有一个问题就是有些问题是无解的,这种情况我们不希望进行很大力气的搜索之后发现无解,最好是能提前预知,值得庆幸的是八数码无论怎么移动逆序的奇偶性不变,因此我们可以直接通过O(1)的时间判断开始和目标结点的逆序奇偶性是否相同就可以了。有了上面的分析之后,程序就可以写出来了

五、开发环境

语言:JAVA
开发软件:IntelliJ IDEA

总结

本文简单介绍了A算法在九宫重组问题中的应用,A算法是用于求解最短路径的最佳算法,刚开始接触会感觉有一些难度,但在熟悉之后其实并不难。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值