西电电院人工智能课程大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);
}