人工智能之迷宫学习资料Word文档格式.docx

上传人:b****5 文档编号:21415881 上传时间:2023-01-30 格式:DOCX 页数:15 大小:47.99KB
下载 相关 举报
人工智能之迷宫学习资料Word文档格式.docx_第1页
第1页 / 共15页
人工智能之迷宫学习资料Word文档格式.docx_第2页
第2页 / 共15页
人工智能之迷宫学习资料Word文档格式.docx_第3页
第3页 / 共15页
人工智能之迷宫学习资料Word文档格式.docx_第4页
第4页 / 共15页
人工智能之迷宫学习资料Word文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

人工智能之迷宫学习资料Word文档格式.docx

《人工智能之迷宫学习资料Word文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能之迷宫学习资料Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

人工智能之迷宫学习资料Word文档格式.docx

⑵如果f值相同,则深度优先

A*算法的搜索过程如下:

1、OPE比(s),f(s)=g(s)+h(s)

2、LOOPifOPEN=()thenEXIT(FAIL)

3、nJFIRST(OPEN)

4、ifGOAL(n)THENEXIT(SUCCESS)

5、REMOVE(n,OPEN)ADD(n,CLOSED)

6、{mIJEXPAND(n)

1计算f(n,mi)=g(n,mi)+h(mi),(自s过n,m到目标节点的耗散值)

2ADD(m,OPEN),标记m到n的指针(m不在OPENSCLOSE中)

3iff(n,mk)vf(mk)thenf(mk)Jf(n,mk),标记m到n的

指针(mk在OPEN中)

4iff(n,ml)vf(ml)thenf(ml)Jf(n,ml),标记m到n的

指针(m在CLOSED中)

ADD(mOPEN),扌巴m放回至UOPEN中

7、OPEN中的节点按照f值升序排列

8、GOLOOP

A*算法的搜索图示如图2.2所示。

{3,1,3,0,3,1,3},

{1,4,1,4,1,4,1},

{3,0,3,1,3,0,3},

{3,0,3,1,3,1,3}};

其中数字3代表坐标点,1代表两个坐标点之间存在路径,0代表两个坐标点之间不存在路径,数字4没有意义。

从这个二维整型数组抽象出来的迷宫如下所示:

2每个坐标点的数据结构如下:

structData

{

intx;

inty;

intg;

intf;

structData*parent;

};

其中x代表数组的第几行对应实际坐标的y值,y代表数组的第几列对应实际坐标的x值,g代表从入口到该坐标点的耗散值,f代表代表评价函数值,parent代表路径上的该坐标点的前一个坐标点。

3程序中对应入口坐标为(6,0)也就是实际中的入口(1,1),实际中每走一步对应程序中是x+2或x-2或y+2或y-2。

程序中对应的出口坐标为

(0,6)实际对应着出口(4,4)。

4实际中的h函数对应程序中的h(n)=|x—0|/2+|y—6|/2。

5因为实际坐标与程序中坐标不对应,所以需要一个转换公式,

如下:

实际坐标的x值等于程序中坐标点的y值除以2再加1

实际坐标的y值等于5减去程序中坐标点的x值除以2再减1

6判断两个坐标点a,b之间是否存在路径:

p=(a->

x+b->

x)/2;

q=(a->

y+b->

y)/2;

如果Maze[p][q]==1,则说明a,b之间存在路径,Maze[p][q]==0,贝U说明不存在路径。

为了将搜索结果图形输出,则又设置了Maze[p][q]==5,代

表“二,Maze[p][q]==6,代表,Maze[p][q]==7,代表“T”,Maze[p][q]==8,代表“J”。

7为了满足open表中节点如果f值相同,则深度优先,使用一个栈来表示open表,closed表也是用一个栈来表示。

(2)函数说明

boolbound(Data*a)

函数功能:

判断一个坐标点是否越过边界,返回值bool值

inth(Data*a)

函数功能:

h函数

Data*Nopen(Data*a)

在open表中搜索结点a.若找到则返回结点a的地址,否则返

回0

Data*Nclosed(Data*a)

在closed表中搜索结点a.若找到则返回结点a的地址,否则返回0

voidsort()

对open表中节点按照f值升序排列

voidExpand(Data*a)

扩展当前结点a

voidprintmaze()

输出迷宫

voidprintpath(Data*a)

输出搜索结果

intA()

A*算法

voidmain()

主函数

(3)详细程序设计

#include<

iostream>

stack>

usingnamespacestd;

intMaze[7][7]={{3,1,3,1,3,0,3},

{0,4,1,4,1,4,1},

//3代表节点,1代表两个节点之间有线,0代表两个节点之间没有线,4无意义

intg;

//坐标点结构体

stackvData*>

open;

//open表

closed;

//close表

boolbound(Data*a)//边界函数

return(a->

x<

=6)&

&

(a->

x>

=0)&

y<

(a->

y>

=0);

}

inth(Data*a)//h函数

returnabs((a->

x-0)/2)+abs((a->

y-6)/2);

Data*Nopen(Data*a)//在open表搜索a坐标点

Data*b,*d;

c;

while(!

open.empty())

b=open.top();

if(b->

x==a->

x&

b_>

y==a_>

y)

c.empty())

d=c.top();

c.pop();

open.push(d);

returnb;

open.pop();

c.push(b);

open.push(d);

}return0;

Data*Nclosed(Data*a)在closed表搜索a坐标点

closed.empty())

b=closed.top();

closed.push(d);

closed.pop();

return0;

voidsort()对open表中坐标点排序

Data*p,*q,*r;

intb=open.size();

for(inti=0;

i<

b;

i++)

p=open.top();

for(intj=i+1;

j<

j++)

q=open.top();

if(q->

fvp->

f)

r=p;

p=q;

q=r;

open.push(q);

c.push(p);

q=c.top();

open.push(q);

voidExpand(Data*a)〃扩展a坐标点

intp,q;

Data*d;

structData*b[4];

for(inti=0;

4;

b[i]=(structData*)malloc(sizeof(Data));

b[0]->

x=a->

x+2;

b[0]->

y=a->

y;

b[1]->

x;

y-2;

b[2]->

x-2;

b[3]->

y+2;

for(i=0;

if(bound(b[i]))

p=(b[i]->

x+a->

q=(b[i]->

y+a->

if(Maze[p][q]==1)

if(Nopen(b[i])==0&

Nclosed(b[i])==0){

b[i]->

g=a->

g+1;

b[i]->

f=b[i]->

g+h(b[i]);

parent=a;

open.push(b[i]);

elseif(Nopen(b[i]))

d=Nopen(b[i]);

if(a->

g+1<

d->

g)

d->

elseif(Nclosed(b[i]))

open.push(b[i]);

voidprintmaze()//输出迷宫

cout«

"

(4,4)"

<

endl;

7;

if(i==6)

入口—"

;

else

if(i%2==0)

for(intj=0;

if(Maze[i][j]==3)

•”;

elseif(Maze[i][j]==1)cout«

—"

elseif(Maze[i][j]==5)cout«

J"

elseif(Maze[i][j]==6)cout«

if(i==0)

—出口"

for(intj=0;

if(Maze[i][j]==1)

cout<

|"

elseif(Maze[i][j]==7)

T"

elseif(Maze[i][j]==8)

J"

(1,1)"

endl«

voidprintpath(Data*a)〃输出搜索结果

intb,c;

q;

a->

parent==NULL)

q.push(a);

b=(a->

parent->

c=(a->

x)

Maze[b][c]=5;

Maze[b][c]=6;

Maze[b][c]=7;

Maze[b][c]=8;

a=a->

parent;

q.empty())

coutvv"

("

vvq.top()->

y/2+1vv"

"

v<

5-(q.top()->

x/2+1)vv"

)"

q.pop();

printmaze();

intA()//A*算法

Datas={6,0,0,0,NULL};

Data*n=&

s;

open.push(n);

while

(1)

if(open.empty())

不存在路径!

endl;

n=open.top();

if(n->

x==0&

n->

y==6)

最短路径长度为:

fv<

endl«

最短路径为:

printpath(n);

return1;

open.pop();

closed.push(n);

Expand(n);

//扩展n节点

sort();

//open中节点按照f值升序排列

voidmain()〃主函数

迷宫如下图:

A();

四、设计结果及分析

(1)实验结果

rGmir\Ue^kta我區交件丢\A工岸諾朗申咋业"

,时日砖璟犢^XJebu^XMajeexeP-—_

(2)实验分析

从上面的图中可以看出程序运行结果与分析结果一致,程序运行正确

五、实验心得与体会

通过本次课程设计的训练,增加了我学习算法的兴趣,对A*算法有了更

深刻的理解,虽然还不是很明白其中的具体内容,但已发现算法分析与程序设计的乐趣,而且还熟练使用C语言编程的能力。

虽然还有很多复杂的问题是我们的能力所不及的,但我相信通过一次次实际的训练操作会使我们的解决问题的能力一步步有所提高。

这次程序设计让我们学到了好多知识,但也暴露了我们在程序设计中的不足。

总之,所以我相信通过此次课程设计会提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1