人工智能导论状态空间搜索实验八数码问题求解解读文档格式.docx
《人工智能导论状态空间搜索实验八数码问题求解解读文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能导论状态空间搜索实验八数码问题求解解读文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
图1八数码问题示意图
请任选一种盲目搜索算法(广度优先搜索或深度优先搜索)或任选一种启发式搜索方法(全局择优搜索,加权状态图搜索,A算法或A*算法)编程求解八数码问题(初始状态任选)。
选择一个初始状态,画出搜索树,填写相应的OPEN表和CLOSED表,给出解路径,对实验结果进行分析总结,得出结论。
实验报告内容格式要求:
XXXXXXXXXXXX(中文:
宋体,小四;
英文:
TimesNewRoman)。
二、实验目的
1.熟悉人工智能系统中的问题求解过程;
2.熟悉状态空间的盲目搜索和启发式搜索算法的应用;
3.熟悉对八数码问题的建模、求解及编程语言的应用。
三、实验算法
启发函数设定
由八数码问题的部分状态图可以看出,从初始节点开始,在通向目标节点的路径上,各节点的数码格局同目标节点相比较,其数码不同的位置个数在逐渐减少,最后为零,因此可以把数码不同的位置个数作为标志一个节点到目标节点距离远近的一个启发性信息,利用这个信息来扩展节点的选择,减少搜索范围,提高搜索速度。
2、数据结构与算法设计
数码结构体
typedefstructnode//八数码结构体
{
intform[N][N];
//数码组
intevalue;
//评估值,差距
intudirec;
//所屏蔽方向,防止往回推到上一状态,1上2下3左4右
structnode*parent;
//父节点
}Graph;
Graph*Qu[MAX];
//队列
Graph*St[MAX];
//堆栈
搜索过程:
(搜索采用广度搜索方式,利用待处理队列辅助,逐层搜索(跳过劣质节点))
a、把初始数码组压入队列;
b、从队列中取出一个数码组节点;
c、扩展子节点,即从上下左右四个方向移动空格,生成相应子节点:
d、对子节点数码组作评估,是否为优越节点,即其评估值是否小于等于其父节点加一,是则将其压入队,否则抛弃。
e、判断压入队的子节点数码组(优越点)的评估值,为零则表示搜索完成,退出搜索;
f、跳到步骤2;
四、程序框图
五、实验结果及分析
采用深度优先搜索方式并简化搜索
六、结论
Open表close表
120
23401
2456013目标完成
七、源程序及注释
#include
<
stdio.h>
}//设计了搜索深度范围,防止队列内存越界
stdlib.h>
6、运行结果
time.h>
#define
N
3
//数码组大小
Max_Step
50
//最大搜索深度
MAX
typedef
struct
node//八数码结构体
{
int
form[N][N];
//数码组
evalue;
//评估值
udirect;
//所屏蔽方向,防止往回推到上已状态,1上2下3左4右
node
*parent;
//父节点
/////////打印数码组
void
Print(Graph
*The_graph)
i,j;
if(The_graph==NULL)
printf("
图为空\n"
);
else
---------------------\n"
for(i=0;
i<
N;
i++)
|\t"
for(j=0;
j<
j++)
%d\t"
The_graph->
form[i][j]);
//遍历打印
}
\t|\n"
|\t\t\t差距:
%d\t|\n"
evalue);
//差距显示
/////////评价函数
Evaluate(Graph
*The_graph,Graph
*End_graph)
valute=0;
//差距数
if(The_graph->
form[i][j]!
=End_graph->
form[i][j])
valute++;
The_graph->
evalue=valute;
return
valute;
/////////移动数码组
Graph
*Move(Graph
*The_graph,int
Direct,int
CreatNew_graph)
*New_graph;
//
HasGetBlank=0;
//是否获取空格位置
AbleMove=1;
//是否可移动
i,j,t_i,t_j,x,y;
i++)//获取空格坐标i,j
form[i][j]==0)
HasGetBlank=1;
break;
if(HasGetBlank==1)
//printf("
空格位置:
%d,%d\n"
i,j);
t_i=i;
t_j=j;
//移动空格
switch(Direct)
case
1:
//上
t_i--;
if(t_i<
0)
AbleMove=0;
2:
//下
t_i++;
if(t_i>
=N)
3:
//左
t_j--;
if(t_j<
4:
//右
t_j++;
if(t_j>
if(AbleMove==0)//不能移动则返回原节点
The_graph;
if(CreatNew_graph==1)
New_graph=(Graph
*)malloc(sizeof(Graph));
//生成节点
for(x=0;
x<
x++)
for(y=0;
y<
y++)
New_graph->
form[x][y]=The_graph->
form[x][y];
//复制数码组
New_graph=The_graph;
//移动后
form[i][j]=New_graph->
form[t_i][t_j];
form[t_i][t_j]=0;
移动产生的新图:
\n"
//Print(New_graph);
New_graph;
/////////搜索函数
*Search(Graph
*Begin,Graph
*End)
*g1,*g2,*g;
Step=0;
//深度
Direct=0;
//方向
i;
front,rear;
front=rear=-1;
//队列初始化
g=NULL;
rear++;
//入队
Qu[rear]=Begin;
while(rear!
=front)//队列不空
front++;
//出队
g1=Qu[front];
开始第%d个图:
front);
//Print(g1);
for(i=1;
=4;
i++)//分别从四个方向推导出新子节点
Direct=i;
if(Direct==g1->
udirect)//跳过屏蔽方向
continue;
g2=Move(g1,
Direct,
1);
//移动数码组
if(g2!
=g1)//数码组是否可以移动
//可以移动
Evaluate(g2,
End);
//评价新的节点
开始产生的第%d个图:
i);
//Print(g2);
if(g2->
evalue<
=g1->
evalue+1)
//是优越节点
g2->
parent=g1;
switch(Direct)//设置屏蔽方向,防止往回推
udirect=2;
udirect=1;
udirect=4;
udirect=3;
Qu[rear]=g2;
//存储节点到待处理队列
evalue==0)//为0则搜索完成
g=g2;
//i=5;
free(g2);
//抛弃劣质节点
g2=NULL;
if(g!
=NULL)//为0则搜索完成
if(g->
evalue==0)
Step++;
//统计深度
if(Step>
Max_Step)
g;
/////////初始化一个八数码结构体
*CR_BeginGraph(Graph
srand((unsigned)time(0));
M=10;
//随机移动步数
Direct;
i,x,y;
M;
Direct=rand()%4+1;
//产生1-4随机数
Direct:
%d\n"
Direct);
New_graph=Move(New_graph,
0);
evalue=0;
udirect=0;
parent=NULL;
main
(int
argc,
const
char
*
argv[])
insert
code
here...
/*
Begin_graph={
{{2,8,3},{1,6,4},{0,7,5}},0,0,NULL
};
{{2,8,3},{1,0,4},{7,6,5}},0,0,NULL
{{2,0,1},{4,6,5},{3,7,8}},0,0,NULL
*/
//目标数码组
End_graph={
{{1,2,3},{8,0,4},{7,6,5}},0,0,NULL
//初始数码组
*Begin_graph;
Begin_graph=CR_BeginGraph(&
End_graph);
//随机产生初始数码组
Evaluate(Begin_graph,
&
//对初始的数码组评价
初始数码组:
Print(Begin_graph);
目标数码组:
Print(&
*G,*P;
top=-1;
//图搜索
G=Search(Begin_graph,
//打印
if(G)
//把路径倒序
P=G;
//压栈
while(P!
=NULL)
top++;
St[top]=P;
P=P->
parent;
搜索结果>
>
//弹栈打印
while(top>
-1)
P=St[top];
top--;
Print(P);
完成>
搜索不到结果,深度为%d\n"
Max_Step);
//设计搜索深度范围主要是防止队列内存越界
0;
读书的好处
1、行万里路,读万卷书。
2、书山有路勤为径,学海无涯苦作舟。
3、读书破万卷,下笔如有神。
4、我所学到的任何有价值的知识都是由自学中得来的。
——达尔文
5、少壮不努力,老大徒悲伤。
6、黑发不知勤学早,白首方悔读书迟。
——颜真卿
7、宝剑锋从磨砺出,梅花香自苦寒来。
8、读书要三到:
心到、眼到、口到
9、玉不琢、不成器,人不学、不知义。
10、一日无书,百事荒废。
——陈寿
11、书是人类进步的阶梯。
12、一日不读口生,一日不写手生。
13、我扑在书上,就像饥饿的人扑在面包上。
——高尔基
14、书到用时方恨少、事非经过不知难。
——陆游
15、读一本好书,就如同和一个高尚的人在交谈——歌德
16、读一切好书,就是和许多高尚的人谈话。
——笛卡儿
17、学习永远不晚。
18、少而好学,如日出之阳;
壮而好学,如日中之光;
志而好学,如炳烛之光。
——刘向
19、学而不思则惘,思而不学则殆。
——孔子
20、读书给人以快乐、给人以光彩、给人以才干。
——培根