大家好!这是我的第一篇博客,由于之前没有撰写博客的经验,并且也是初入计算机和人工智能领域,可能有些表述或者理解不当,还请大家多多指教。
一、撰写目的
由于这个学期在上算法与数据结构课程的时候,其中一个大作业是用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 |
注:每个初始状态用数列表示ÿ