c语言15-puzzle解法,15 Puzzle (4乘4谜题) IDA*(DFS策略与曼哈顿距离启发) 的C语言实现...

大家好!这是我的第一篇博客,由于之前没有撰写博客的经验,并且也是初入计算机和人工智能领域,可能有些表述或者理解不当,还请大家多多指教。

一、撰写目的

由于这个学期在上算法与数据结构课程的时候,其中一个大作业是用C语言和深度优先(DFS)的 IDA*(基于迭代加深的A*算法)实现快速寻求15Puzzle(4乘4迷题)的解法的工具,同时尽可能地加入优化使得算法尽可能快速、简练。我发现网上很少有关于利用IDA*去解决15乃至24Puzzle的介绍,于是我就想跟大家分享一下自己的学习经验和解决方法,文章中大多理念都是有我自己归纳总结的地方,只是为了给大家粗略地介绍一下并不能涵盖这些知识的全部方面,希望能给大家一点帮助。

二、15Puzzle(4乘4迷题)及其一般算法简介

1. 15-Puzzle:15Puzzle(4乘4迷题)看似陌生,但其实肯定每个人都知道甚至玩过类似的衍生游戏,在此我们以15Puzzle为例给大家介绍。15Puzzle是一个由16个宫格以4乘4方式排列的组成的图案,通常是以益智类游戏的方式出现,16个宫格中有15个具有数字编号或图案,剩下一个为空格。当16个格子按照一定顺序排列成为“最终状态”时,其数字编号也会按照顺序排列,或是其图案会一个大的图片,如下方就是数字形式的15Puzzle的“最终状态”:

B  1   2   3

4  5   6   7

8  9  10  11

12 13 14 15

注:B代表空格子,B可位于任何一个角落,取决于不同的游戏规则

在游戏初始状态时,所有宫格为乱序排列,如:

14  13  15  7

11  12   9  5

6   B   2  1

4   8  10  3

一次移动中,玩家只可以将空格(B)与其相邻的某个格子互换位置,达到一个新的状态。如上图第一步只可能为将B与12,6,2,或8交换位置。玩家若通过多次移动,将全部宫格恢复到“最终形态”后,游戏即结束,为了方便起见,在程序中我们采用0代替B。

为了直观地说明算法时间复杂度的差异,在这里我采用了6组随机但必有解的初始状态,分别为:

N

初始状态

1

14 13 15 7 11 12 9 5 6 0 2 1 4 8 10 3

2

13 5 4 10 9 12 8 14 2 3 7 1 0 15 11 6

3

14 7 8 2 13 11 10 4 9 12 5 0 3 6 1 15

4

5 12 10 7 15 11 14 0 8 2 1 13 3 4 9 6

5

7 6 8 1 11 5 14 10 3 4 9 13 15 2 0 12

6

15 2 12 11 14 13 9 5 1 3 8 7 0 10 6 4

注:每个初始状态用数列表示,第一个代表最左上角格子,N1即为上方初始状态实例的数列表示,0代表空格

2. 穷举算法:而所谓关于15-Puzzle的算法,其目的无非就是用尽可能少的时间、尝试尽可能少状态,在解法存在的情况下,找到步数最少的最优解法。其中当然最简单的即为穷举法,我们由初始状态出发,迭代尝试所有可能的状态,即穷举出只移动一步可以达到的状态、两步可以达到的状态...直到尝试得到“最终状态”,这里的算法可以尝试广度优先搜索(Breath-first Search, BFS),以层(步数)为单位向外拓展搜索直到达到最终状态,实现既可以使用迭代也可以不使用,这里就不详细阐述了。穷举算法的复杂度相当之高(理论上最多会查看1013个状态,普通笔记本电脑可能会花费数十分钟至数十小时来求解),在此由于时间关系我就没有进行实验,有兴趣的朋友可以尝试一下。

3. 最简单的优化 - 不走回头路:在最简单的穷举法中我们可以发现,在尝试超过一步移动所达到的状态时,程序常常会先将空格向左移(比如互换0和2),然后在下一步再将空格向右移(还是互换2和0),那这样其实又回到了2步前的状态,这样子的两步也有可能能解出答案,但并不是我们寻找最优解所需要的。所以为了避免这种“恢复原状态的移动”的出现,我的做法是对于每个出现的状态ÿ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值