八数码问题文库

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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:如何寻找一系列的中间状态及遇到的问题?

要寻找这一系列中间状态的方法是搜索,但搜索很容易遇到时间和空间上的问题。以下就是搜

索的基本原理:

相关文档
最新文档