八数码问题文库
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
八数码实验报告
八数码实验报告
:
03122997
学校:上海大学学院:计算机学院
关键字:八数码、人工智能、A*算法、双向广搜、启发式函数
摘要:
九宫排字问题(又称八数码问题)是人工智能当中有名的难题之一。问题是在
3×3方格盘上,
放有八个数码,剩下第九个为空,每一空格其上下左右的数码可移至空格。问题给定初始位置和目
标位置,要求通过一系列的数码移动,将初始位置转化为目标位置。本文介绍用普通搜索方法、双
向广度搜索和启发式搜索如何缩短寻找路径的时间,以及各算法间的利与弊。
目录:
问题简介
问题分析
算法设计
程序实现
相关链接
问题简介:
所谓八数码问题是指这样一种游戏:将分别标有数字
1,2,3,…,
8的八块正方形数码牌任意
地放在一块
3×3的数码盘上。放牌时要求不能重叠。于是,在
3×3的数码盘上出现了一个空格。
现在要求按照每次只能将与空格相邻的数码牌与空格交换的原则,将任意摆放的数码盘逐步摆成某
种特殊的排列。如下图表示了一个具体的八数码问题求解。
问题分析:
首先,八数码问题包括一个初始状态
(START)和目标状态
(END),所谓解八数码问题就是在两
个状态间寻找一系列可过渡状态(
START>
STATE1>
STATE2>...
>
END)。这个状态是否存在就是我
们要解决的第一个问题:
Q1:每一个状态及每一次操作的表示方法?
有许多表示方法,比如一个
3*3的八数码盘可以压缩成一个
int值表示,但不适用于
15puzzle
或大于
8的
puzzle问题。如果对空间要求很高,应该还可以再压缩。本文采用一个int表示的方法。
表示方法如下:由于
int的表示范围大于
1e9,所以我们取一个
int的低
9位,为了方便寻找空
格的位置,int的个位我们用来放空格的位置(19)
。而前
8位,按照行从上到下,列从左到右的顺
序依次记录对应位置上的数字。例如:
成
231584675,个位的
5表示空格在第
5位,前八位数按顺序记
录。坐标转换公式为:
num(压缩后的
int)
xy(求
x行
y列,1记起)1e(n)为
1乘
10的
n次
int
temp=(x1)*
3+y
if
temp>num%10thenreturn(num/1e(9temp+
1))%10
else
return(num/1e(9temp))%
10
为了方便本文介绍,取目标状态为:123456789即>
操作本文用
urdl分别表示空格的向上向右向下向左四个操作。比如,在简介中的图包括两步操作
ld,可能与平时玩这类游戏的习惯不符合,但这是为了和
ACM例题相统一。
对应地,每种操作引起的状态变化如下:
r:num值++
l:num值u:
有点复杂
int
t0=
9num%
10+
1
int
t1=
num/1e(t0)
int
t2=
t1%1000
t1=
t1t2+
(t2
%100)
*
10+
t2
/100
t1*=
1e(t0)
return(t1+
((num%t0)
3))
d:return前面同
u操作,
return返回
(t1+
((num%t0)+
3))
Q2:判断是否存在中间状态使
START到达
END?
用组合数学的方法可以快速地进行判断,例如SOJ
2061题
2360题中都是关于此类的问题。但
八数码的判断方法比他们简单多了。
本文用的方法是计算排列的逆序数值,以231584675为例子,5表示的是空格,不计算,那么求
23158467的逆序值为
+0
+2
(1<21<3)
+0+
0+
1(
4<5)+
1(6<8
)+1
(7<8)
=5
目标状态
123456789的逆序自然就是
0。
两个状态之间是否可达,可以通过计算两者的逆序值,若两者奇偶性相同则可达,不然两个状
态不可达。
简单证明一下:
l和
r操作,不会影响状态的逆序值,因为只会改变个位数(空格的位置)。
u和
d操作是使某个位置的数字右
/左移两位。由于数字序列的每一次移动会使逆序值奇偶性
改变,所以移动两次后奇偶性不变。
所以四个操作均不会影响序列的奇偶性。
Q3:如何寻找一系列的中间状态及遇到的问题?
要寻找这一系列中间状态的方法是搜索,但搜索很容易遇到时间和空间上的问题。以下就是搜
索的基本原理: