八数码c语言编程深度搜索,求 :八数码启发式搜索算法

问题描述:

有一个3×3的棋盘,其中有0~8九个数字,0表示空格,其他的数字可以和0交换位置。求由初始状态到达目标状态步数最少的解。

解决八数码问题的常用方法为图搜索法,可用广度优先、深度优先和A*算法实现,其中A*算法又因估价函数的不同而有着不同的搜索时间。

程序说明:

在本程序中,用广度优先、深度优先和A*算法分别实现了八数码问题,其中A*算法的估价函数选择的是“不在位”数和当前层数之和,初始状态和目标状态均可由用户设定,目标状态默认为:

1 2 3

4 5 6

7 8 0

这里是A*算法的可执行程序,由用户输入一组数码,如:

8 3 5

1 2 7

4 6 0

然后程序会询问用户是否要更改目标,输入N即可。等一会儿(几秒到几十秒)后便可得到结果以及消耗的时间和空间。程序中的Block是指生成的8数码块,以此来衡量空间消耗的多少。

这里是广度优先的可执行程序,使用方法同上。广度优先算法当步数较多时消耗的时间可能会比A*算法少,但会消耗较多的空间,因此当计算很长一段时间后仍无结果时应按CTRL+C强行退出,谨防死机。

深度优先算法当问题复杂时时间消耗很多,基本不能用,因此在这里就不给出可执行程序了,需要者可下载下面的源代码自行研究。

算法简评:

三种算法在一定条件下均可得到八数码问题的解。但是广度优先算法当目标的深度较深时,产生很多冗余节点,空间消耗很大(在运行中曾造成过死机)。有限深度优先算法在时间或空间复杂度上均没有明显的优势,但如果目标深度较深而且路径选择得当的话,可以较快地得到解答。A*算法可以消耗较少的空间解决问题,但是由于每次选择均需要寻找估价函数最小的节点,因此当深度增加相应的节点数目增加时,A*算法在时间上并不占优势。然而,A*算法总可以在有限的时间内得到问题的解。

已知可解问题:

8 3 5    4 3 2     2 0 3

1 2 7    1 0 5     1 8 5

4 6 0    6 7 8     4 7 6

A*算法总可在有限时间内(曾试过75秒)解决文曲星中可解的数字拼图问题。

源代码:

这里是程序的源代码,有兴趣的同志可以下载研究,欢迎指教和提问。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值