人工智能:八数码难题的启发式搜索

  • 格式:docx
  • 大小:268.07 KB
  • 文档页数:13

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

人工智能基础

大作业

----八数码难题

学院:数学与计算机科学学院

2016.12.20

一、实验名称

八数码难题的启发式搜索

二、实验目的

八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。

要求:1.熟悉人工智能系统中的问题求解过程;

2.熟悉状态空间的启发式搜索算法的应用;

3.熟悉对八数码问题的建模、求解及编程语言的应用。

三、实验设备及软件环境

1.实验编程工具:VC++ 6.0

2.实验环境:Windows7 64位

四、实验方法:启发式搜索

1.算法描述

1.将S放入open表,计算估价函数f(s)

2.判断open表是否为空,若为空则搜索失败,否则,将open表中的第一

个元素加入close表并对其进行扩展(每次扩展后加入open表中的元素

按照代价的大小从小到大排序,找到代价最小的节点进行扩展)

注:代价的计算公式f(n)=d(n)+w(n).其中f(n)为总代价,d(n)为节点

的度,w(n)用来计算节点中错放棋子的个数。

判断i是否为目标节点,是则成功,否则拓展i,计算后续节点f(j),

利用f(j)对open表重新排序

2.算法流程图:

3.程序源代码:

# include

# include

# include

# include

typedef struct node {

int i,cost,degree,exp,father;

int a[3][3];

struct node *bef,*late;

struct node *son;

}treenode;

int flag=0,count=1,num=0,i=0;

void set(treenode *s);

void cpynode(treenode *s1,treenode *s2);

void add1(treenode *s,treenode *open);

void adjust1(treenode *close);

void jscost(treenode *s);

void tiaozheng(treenode *open);

void sortopen(treenode *open);

int test(treenode *s1,treenode *s2);

void position(treenode *s,treenode *open,treenode

*close,treenode *s1);

void printstr(treenode *open);

int search(treenode *s1,treenode *s2);

void input(treenode *s);

int cmpnode(treenode *s1,treenode *s2);

void print(treenode *s);

void add(treenode *s,treenode *close);

void xuhao(treenode *s);

void extend(treenode *r1,treenode *s,treenode *s1,treenode *open,treenode *close);

void main() {

treenode *s0,*s1,*s;

treenode *open,*close,*opend,*closed;

open=(treenode*)malloc(sizeof(treenode));

close=(treenode*)malloc(sizeof(treenode));

open->late=NULL;

close->late=NULL;

opend=open;

closed=close;

s0=(treenode*)malloc(sizeof(treenode));

set (s0);

s1=(treenode*)malloc(sizeof(treenode));

set(s1);

printf("请输入八数码的初始状态:(以空格为分隔)\n");

input (s0);

printf("请输入八数码的目标状态:(以空格为分隔)\n");

input(s1);

xuhao(s0);

add (s0,opend);

while(open->late!=NULL && flag==0) {

s=(treenode*)malloc(sizeof(treenode));

cpynode(s,open->late);

open=open->late;

add(s,close);

if(test(s,s1)==0){

flag=1; }

else{

position(s,open,close,s1);

sortopen(open); };};

if(open->late!=NULL) {

printf("搜索过程如下:\n ");

adjust1(close);

printstr(close);

printf("\n%d 步,%d 个节点\n",num,count);} else {

printf("查找错误 ! \n");}; }

void set(treenode *s) {

s->i=i;

s->father=0;

s->degree=0;

s->bef=NULL;

s->son=NULL;

s->late=NULL; };

void input(treenode *s) {

int j,k;

for(j=0;j<3;j++)

for(k=0;k<3;k++)

scanf("%d",&s->a[j][k]); };