人工智能 实验四 城市交通图的代价树深度优先搜索讲解Word文档格式.docx
- 文档编号:20530677
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:13
- 大小:33.29KB
人工智能 实验四 城市交通图的代价树深度优先搜索讲解Word文档格式.docx
《人工智能 实验四 城市交通图的代价树深度优先搜索讲解Word文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能 实验四 城市交通图的代价树深度优先搜索讲解Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
C1的代价:
3B1的代价:
4
Open表:
3|C1|A
4|B1|A
4|B1|A
2|C1|A
C1不是目标节点,于是继续扩展
5)把C1扩展得到D1,放入open表
D1的代价:
3+2=5
B1的代价:
5|D1|C1
1|A
|0
6)把B1从open放入closed表
5|D1|C1
3|B1|A
B1不是目标节点,于是继续扩展
7)扩展B1得D2,E1,放入Open表
D2的代价:
4+4=8
E1的代价:
4+5=9
8|D2|B1
9|E1|B1
8)把D1从open表放入closed表
4|D1|C1
D1不是目标节点,于是继续扩展
9)把D1扩展得到E2,B2,放入open表
E2的代价:
3+2+3=8
B2的代价:
3+2+4=9
8
9
8|E2|D1
9|B2|D1
10)把E2从open表放入closed表
5|E2|D1
E2是目标节点,搜索结束。
则搜索路径A-C1-D1-E2
即:
A-C-D-E
五、实验代码:
#include<
stdio.h>
malloc.h>
#defineINF32767/*INF表示∞*/
typedefintInfoType;
typedefcharVertex;
#defineMAXV6/*最大顶点个数*/
/*以下定义邻接矩阵类型*/
typedefstruct/*图的定义*/
{InfoTypeedges[MAXV][MAXV];
/*邻接矩阵*/
intn,e;
/*顶点数,弧数*/
Vertexvexs[MAXV];
/*存放顶点信息*/
}MGraph;
/*图的邻接矩阵类型*/
/*以下定义邻接表类型*/
typedefstructANode/*弧的结点结构类型*/
{intadjvex;
/*该弧的终点位置*/
structANode*nextarc;
/*指向下一条弧的指针*/
InfoTypeinfo;
/*该弧的相关信息,这里用于存放权值*/
}ArcNode;
typedefstructVnode/*邻接表头结点的类型*/
{Vertexdata;
/*顶点信息*/
ArcNode*firstarc;
/*指向第一条弧*/
}VNode;
typedefVNodeAdjList[MAXV];
/*AdjList是邻接表类型*/
typedefstruct
{AdjListadjlist;
/*邻接表*/
intn,e;
/*图中顶点数n和边数e*/
}ALGraph;
/*图的邻接表类型*/
typedefstruct
{charvi,vj;
intinfo;
}etype;
typedefstructCLOSEDList
{
intid;
//记住矢量
intdatan;
intcost;
intdad;
//记住父节点回溯用
}closed;
//open表和close表都用这个类型
voidMatToList(MGraphg,ALGraph*&
G)
/*将邻接矩阵g转换成邻接表G*/
inti,j,n=g.n;
ArcNode*p;
G=(ALGraph*)malloc(sizeof(ALGraph));
for(i=0;
i<
n;
i++)
{
G->
adjlist[i].firstarc=NULL;
adjlist[i].data=g.vexs[i];
}
for(j=n-1;
j>
=0;
j--)
if(g.edges[i][j]!
=INF)
{
p=(ArcNode*)malloc(sizeof(ArcNode));
p->
adjvex=j;
info=g.edges[i][j];
nextarc=G->
adjlist[i].firstarc;
G->
adjlist[i].firstarc=p;
}
G->
n=n;
G->
e=g.e;
}
voidListToMat(ALGraph*G,MGraph&
g)
/*将邻接表G转换成邻接矩阵g*/
inti,j,n=G->
for(i=0;
i++)
for(j=0;
j<
j++)
g.edges[i][j]=INF;
i++)
{g.vexs[i]=G->
adjlist[i].data;
p=G->
while(p!
=NULL)
{
g.edges[i][p->
adjvex]=p->
info;
p=p->
nextarc;
}
g.n=n;
g.e=G->
e;
voidDispMat(MGraphg)
/*输出邻接矩阵g*/
inti,j;
g.n;
for(j=0;
if(g.edges[i][j]==INF)
printf("
%3s"
"
∞"
);
else
%3d"
g.edges[i][j]);
printf("
\n"
voidDispAdj(ALGraph*G)
/*输出邻接表G*/
inti;
printf("
\n%3d%c:
"
i,G->
adjlist[i].data);
while(p!
=NULL)
{
printf("
-->
%d(%d)"
p->
adjvex,p->
info);
p=p->
voidcreatmat(MGraph&
g,charvex[],intn,etypeedge[],inte)
//建立邻接矩阵
{g.n=n;
g.e=e;
intk,i,j;
for(k=0;
k<
k++)
g.vexs[k]=vex[k];
{i=0;
while(g.vexs[i]!
=edge[k].vi)
i++;
j=0;
while(g.vexs[j]!
=edge[k].vj)
j++;
g.edges[i][j]=g.edges[j][i]=edge[k].info;
voidcreatlink(ALGraph*&
G,charvex[],intn,etypeedge[],inte)
//建立邻接表
{ArcNode*p;
e=e;
adjlist[i].data=vex[i];
{
i=0;
while(G->
adjlist[i].data!
while(G->
adjlist[j].data!
p=(ArcNode*)malloc(sizeof(ArcNode));
p->
p->
info=edge[k].info;
p=(ArcNode*)malloc(sizeof(ArcNode));
adjvex=i;
adjlist[j].firstarc;
adjlist[j].firstarc=p;
//chardfsv[10];
charbfsv[10];
intk;
intvisited[10];
/*voidDFS(ALGraph*G,intv)//深度优先遍历
intw;
dfsv[k]=G->
adjlist[v].data;
k++;
visited[v]=1;
p=G->
adjlist[v].firstarc;
while(p!
{w=p->
adjvex;
if(visited[w]==0)
DFS(G,w);
p=p->
}*/
//**********************************************************************************************************************
voidBFS(ALGraph*G,intv,intdest)//广度优先搜索,v是出发结点序号,dest是目标节点序号
closedop[20];
//定义open表大小
closedcl[20];
//定义closed表大小
intfront,rear;
//定义指针
intcrear=-1;
intcost=0;
//定义费用变量
front=rear=-1;
k=0;
rear++;
op[rear].id=0;
op[rear].datan=0;
op[rear].cost=0;
op[rear].dad=-1;
while(front<
rear)
front++;
crear++;
//取出open表表首节点,crear为closed表的尾指针
cl[crear]=op[front];
//放入close表
if(cl[crear].datan==dest)//判断是目标结点,回溯输出访问路径
chartoprt[MAXV];
\n找到目标,搜索路径为:
intii=crear;
intto=0;
while(ii!
=-1)
{
toprt[to]=G->
adjlist[ii].data;
ii=cl[ii].dad;
to++;
for(intj=to-1;
%c-->
"
toprt[j]);
%c\n"
G->
adjlist[cl[crear].datan].data);
//printf("
Leastcost:
%d\n\n"
cl[crear].cost);
return;
adjlist[cl[crear].datan].firstarc;
//firsttobe扩展结点
=NULL)//若不是目标节点,则对其扩展,并将扩展结果放入open表表尾部
rear++;
op[rear].id=rear;
//open新节点位置
op[rear].dad=crear;
//记录父节点在close表中的位置,方便后来回溯
op[rear].datan=p->
//是哪个字符,即位置
op[rear].cost=cl[crear].cost+p->
//计算费用
inti=rear,j;
boolexchange=true;
//将open表在所有待扩展范围内全排序,代价小的在上面。
排序方法:
冒泡
closedtemp;
while(exchange)
exchange=false;
for(j=front+1;
i;
if(op[j].cost<
op[j].cost)
temp=op[j+1];
op[j+1]=op[j];
op[j]=temp;
exchange=true;
i--;
}
//以下为主函数;
voidmain()
{
MGraphg;
charvex[]="
abcde"
;
etypeedge[]={{'
a'
'
b'
4},{'
c'
3},{'
d'
2},{'
4},{'
e'
3},{'
5}};
ALGraph*G;
creatmat(g,vex,5,edge,6);
有向图G的邻接矩阵:
DispMat(g);
creatlink(G,vex,5,edge,6);
图G的邻接矩阵转换成邻接表:
DispAdj(G);
/*for(i=0;
MAXV;
visited[i]=0;
DFS(G,0);
*/
BFS(G,0,4);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 实验四 城市交通图的代价树深度优先搜索讲解 实验 城市 交通图 代价 深度 优先 搜索 讲解