西电电院人工智能课程大作业

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

西电人工智能大作业

八数码难题

一.实验目的

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

(a) 初始状态 (b) 目标状态

图1 八数码问题示意图

请任选一种盲目搜索算法(深度优先搜索或宽度优先搜索)或任选一种启发式搜索方法(A 算法或 A* 算法)编程求解八数码问题(初始状态任选),并对实验结果进行分析,得出合理的结论。

本实验选择宽度优先搜索:选择一个起点,以接近起始点的程度依次扩展节点,逐层搜索,再对下一层节点搜索之前,必先搜索完本层节点。

二.实验设备及软件环境

Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI 等编程语言。

三.实验方法

算法描述:

(1)将起始点放到OPEN表;

(2)若OPEN空,无解,失败;否则继续;

(3)把第一个点从OPEN移出,放到CLOSE表;

(4)拓展节点,若无后继结点,转(2);

(5)把n的所有后继结点放到OPEN末端,提供从后继结点回到n的指针;

(6)若n任意后继结点是目标节点,成功,输出;否则转(2)。

流程图:

代码:

#include

#include

typedef struct Node {

int num[9]; //棋盘状态

int deepth; //派生的深度 g(n)

int diffnum; //不在位的数目 h(n)

int value; //耗散值 f(n)=g(n)+h(n)

struct Node * pre;

struct Node * next;

struct Node * parent;

}numNode; /* ---------- end of struct numNode ---------- */

int origin[9]; //棋盘初始状态

int target[9]; //棋盘目标状态

int numNode_num,total_step;

numNode *open,*close; //Open表和Close表

numNode *create_numNode()

{

return (numNode *)malloc(sizeof(numNode));

}

numNode *open_getfirst(numNode *head); //返回第一项,并从Open表中删除

void open_insert(numNode *head,numNode *item); //向Open表中按序插入新节点

void close_append(numNode *head,numNode *item); //向Close表中插入新节点

int expand(numNode *item); //扩展节点

int print_result(numNode *item); //打印结果

numNode *copy_numNode(numNode *orgin);

char isNewNode(numNode *open,numNode *close,int num[9]);

//是否在Open表或Close表中

void print_num(int num[9]); //打印棋盘状态

int diff(int num[9]); //求不在位棋子的个数

void init(); //初始化,获得棋盘初始状态和目标状态

void swap(int *a,int *b);

int operate(int num[],int op);

void free_list(numNode *head);

/*

* Name: 主函數

* Description: 程序入口

*/

Int main ( int argc, char *argv[] )

{

//初始化Open表和Close表

open=create_numNode();

close=create_numNode();

open->pre=open->next=close->pre=close->next=NULL; init(); //由用户输入初始和目标状态

//初始化初始节点

numNode *p1;

p1=create_numNode();

p1->parent=NULL;

p1->deepth=0;

int i=0;

for ( i=0; i<9; i++)

{

p1->num[i]=origin[i];

}

open_insert(open,p1);

numNode_num=1;

p1=open_getfirst(open);

while (p1!=NULL)

{

close_append(close,p1);

if(expand(p1))

return EXIT_SUCCESS;

p1=open_getfirst(open);

}

相关文档
最新文档