ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:78.12KB ,
资源ID:9995670      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9995670.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(人工智能作业.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

人工智能作业.docx

1、人工智能作业 人工智能课程设计 用A*算法编写迷宫问题 学院: 班级: 姓名: 学号: 一、 程序目的通过编制迷宫程序来熟练掌握A*算法并熟悉和掌握A*算法实现迷宫寻路功能,要求掌握启发式函数的编写以及各类启发式函数效果的比较。二、 算法概述下面给出A*算法:OPEN:=(s),f(s)=g(s)+h(s)=h(s),fm:=0;LOOP:IF OPEN=( ) THEN EXIT(FAIL);NEST:=ni| f(ni)fm; NEST给出OPEN中满足ffm的结点集合。 IF NEST!=( ) THEN n:=NEST 不空是,取其中g最小者作为当前节点,否则取OPEN的第一个当前节点

2、。IF GOAL(n) THEN EXIT(SUCCESS);REMOVE(n,OPEN),ADD(n,CLOSED);EXPAND(n)mi,计算f(n,mi):=g(n,mi)+h(mi);g(n,mi)是从s通过n到mi的耗散值,f(n,mi)是从s通过n、mi到目标结点耗散值的估计; ADD(mi,OPEN),标记mi到n的指针。 IF f(n,mi)f(mk) THEN f(mk):=f(n,mk),标记mk到n的指针;比较f(n,mk)和f(mk),f(mk)是扩展n之前计算的耗散值。 IF f(n,m1)f(m1)时,把m1重放回OPEN中,不必考虑修改到其子节点的指针。OPEN

3、中的节点按f值从小到达排序;GO LOOP。下面给出源程序中所定义的函数:bool bound(Walked *a)a为struct Walked类型的节点该函数确定了迷宫模型的边界bool bound(Walked *a)int Function_h(Walked *a)a为struct Walked类型的节点该函数求出节点的h(s)值并返回void Walking_Path(Walked *a)a为struct Walked类型的节点该函数回溯a节点的父节点,并且输出从已确定的最短路径的从开始到目标节点的路径Walked* Exist_OPEN(Walked *a)a为struct Wal

4、ked类型的节点该函数确定节点a是否存在于OPEN中,如果存在,则返回,如果不存在,return0Walked* Exist_CLOSE(Walked *a)a为struct Walked类型的节点该函数确定节点a是否存在于CLOSED中,如果存在,则返回,如果不存在,return0void Expand(Walked *a)a为struct Walked类型的节点该函数为扩展函数,即扩展a节点,并按照A*算法的步骤判断节点的可行性void SortStack()该函数为排序函数,负责排序OPEN和CLOSED中的数据int GoIntoMaze()该函数负责初始化迷宫模型并且调用其他关键函数

5、void PrintMaze()该函数负责输出迷宫的模型三、 实验原理(1)A*算法A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。公式表示为: f(n)=g(n)+h(n),其中 f(n) 是从初始点经由节点n到目标点的估价函数,g(n) 是在状态空间中从初始节点到n节点的实际代价,h(n) 是从n到目标节点最佳路径的估计代价。保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:估价值h(n)实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。其实A*算法也是一种最好优先的算法只不过要加上一些约束条件罢了。由于在一些问题求解时,我们希望能够求解出状

6、态空间搜索的最短路径,也就是用最快的方法求解问题,A*就是干这种事情的!我们先下个定义,如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A*算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:f(n) = g(n) + h(n)这里,f(n)是估价函数,g(n)是起点到节点n的最短路径值,h(n)是n到目标的最短路经的启发值。由于这个f(n)其实是无法预先知道的,所以我们用前面的估价函数f(n)做近似。g(n)代替g(n),但 g(n)=g(n)才可(大多数情况下都是满足的,可以不用考虑),h(n)代替h(n),但h(n)=h(n)才可(这一点特别的重要)。可以证明应用这样的估

7、价函数是可以找到最短路径的,也就是可采纳的。我们说应用这种估价函数的最好优先算法就是A*算法。举一个例子,其实广度优先算法就是A*算法的特例。其中g(n)是节点所在的层数,h(n)=0,这种h(n)肯定小于h(n),所以由前述可知广度优先算法是一种可采纳的。实际也是。当然它是一种最臭的A*算法。再说一个问题,就是有关h(n)启发函数的信息性。h(n)的信息性通俗点说其实就是在估计一个节点的值时的约束条件,如果信息越多或约束条件越多则排除的节点就越多,估价函数越好或说这个算法越好。这就是为什么广度优先算法的那么臭的原因了,谁叫它的h(n)=0,一点启发信息都没有。但在游戏开发中由于实时性的问题,

8、h(n)的信息越多,它的计算量就越大,耗费的时间就越多。就应该适当的减小h(n)的信息,即减小约束条件。但算法的准确性就差了,这里就有一个平衡的问题。(2)迷宫问题迷宫图从入口到出口有若干条道路,求从入口到出口最短路径的走法。如图1为一简单迷宫示意图及其平面坐标表示。以平面坐标图来表示迷宫的道路时,问题的状态以所处的坐标位置来表示,即综合数据库定义为(x,y),1=x,Y=N(N为迷宫问题的最大坐标数),则迷宫问题归结为求(1,1)到(4,4)的最短路径问题。迷宫走法规定为向东、南、西、北前进一步,由此可见得到规则集简化形式如下。R1:if(x,y) then(x+1,y)R2: if(x,y

9、) then(x,y-1)R3: if(x,y) then(x-1,y)R4: if(x,y) then(x,y+1)对于这个简单例子,可给出状态空间如图2所示。为求得最佳路径,可使用A*算法。假定搜索一步去单位耗散,则可定义: h(n)=|XG-xn|+|YG-yn|其中(XG,YG)为目标点坐标,(x,y)为节点n的坐标。由于该迷宫问题所有路径都是水平或者垂直的,没有斜路,因此,h(n)=|XG-xn|+|YG-yn|显然可以满足A*的条件,即h(n)=h*(n)。取g(n)=d(n),有f(n)=d(n)+h(n)。再设当不同结点的f值相等时,以深度优先排序,则搜索图如图3所示。最短路径

10、为(1,1),(1.2),(1,3),(2,3),(2,4),(3,4),(3,3),(4,3),(4,4)。在该搜索图中,目标节点的f时8,有几个节点的f也是8,那么这几个f为8的节点,也有被扩展的可能,就看他们在OPEN表中的具体排列次序了。这里假定了f相等时,以深度优先排序。图1 迷宫问题及其表示 图2 状态空间图 图3 迷宫问题启发式搜索图四、实验内容熟悉掌握A*算法,并用此算法解决迷宫的最短路径问题运用编程语言,写出A*算法的源程序,并利用源程序打印迷宫模型,并找出通过迷宫的最短路径,并且输出。迷宫模型如图五、源代码(包含注释)#include#include #includeusi

11、ng namespace std;int MazeMap77=1,2,1,2,1,0,1, 0,3,0,3,2,3,2, 1,2,1,2,1,2,1, 2,3,2,3,0,3,2, 1,2,1,2,1,2,1, 2,3,0,3,2,3,0, 1,2,1,2,1,2,1;/确定迷宫模型,0为不连接,1为节点,2为连接,3为空struct Walked int x; int y; int g; int f; struct Walked *parent;stackOPEN;stackCLOSE;/建立open和closed堆栈bool bound(Walked *a)/确定迷宫边界 if(a-x=0

12、&a-xy=0&a-yx)/2)+abs(6-a-y)/2);void Walking_Path(Walked *a)/回溯路径并输出 stackPath; while(!a-parent=NULL) Path.push(a); a=a-parent; Path.push(a); while(!Path.empty() cout(x/2+1,y/2+1)endl; Path.pop(); Walked* Exist_OPEN(Walked *a)/判断节点是否存在与open堆栈 stackr; Walked *p,*q; while(!OPEN.empty() p=OPEN.top(); if

13、(p-x=a-x&p-y=a-y) /存在,返回该节点指针 while(!r.empty() q=r.top(); r.pop(); OPEN.push(q); return p; OPEN.pop(); r.push(p); while(!r.empty() q=r.top(); r.pop(); OPEN.push(q); return 0;/不存在Walked* Exist_CLOSE(Walked *a)/判断节点是否存在与closed堆栈 stackr; Walked *p,*q; while(!CLOSE.empty() p=CLOSE.top(); if(p-x=a-x&p-y=

14、a-y) /存在,返回该节点指针 while(!r.empty() q=r.top(); r.pop(); CLOSE.push(q); return p; CLOSE.pop(); r.push(p); while(!r.empty() q=r.top(); r.pop(); CLOSE.push(q); return 0;/不存在void Expand(Walked *a)/扩展节点并且按照A*算法的原则判断扩展节点的可行性 int xx,yy; struct Walked *b; struct Walked *Direction4; for(int i=0;ix=a-x+2;/向右扩展

15、Direction0-y=a-y; Direction1-x=a-x-2;/向左扩展 Direction1-y=a-y; Direction2-x=a-x; Direction2-y=a-y-2;/向下扩展 Direction3-x=a-x; Direction3-y=a-y+2;/向上扩展 for(i=0;ix+a-x)/2; yy=(Directioni-y+a-y)/2; if(MazeMapxxyy=2) if(Exist_OPEN(Directioni)=0&Exist_CLOSE(Directioni)=0) Directioni-g=a-g+1; Directioni-f=Dir

16、ectioni-g+Function_h(Directioni); Directioni-parent=a; OPEN.push(Directioni); else if(Exist_OPEN(Directioni) b=Exist_OPEN(Directioni); if(a-g+1g) b-g=a-g+1; b-f=b-g+Function_h(Directioni); Directioni-parent=a; else if(Exist_CLOSE(Directioni) b=Exist_CLOSE(Directioni); if(a-g+1g) b-g=a-g+1; b-f=b-g+F

17、unction_h(Directioni); Directioni-parent=a; OPEN.push(Directioni); void SortStack()/为open和closed堆栈排序 Walked *p,*q,*r; int x=0; stack c; int b=OPEN.size(); for(int i=0;ib;i+) p=OPEN.top(); OPEN.pop(); x=i+1; while(xff) r=p; p=q; q=r; OPEN.push(q); x+; c.push(p); while(!c.empty() q=c.top(); c.pop(); O

18、PEN.push(q); int GoIntoMaze() Walked s=0,0,0,0,NULL;/初始化迷宫 Walked *n=&s; OPEN.push(n); while(true) if(OPEN.empty() /寻找路径失败 cout无法走出迷宫!x=6&n-y=6) /寻找路径成功 cout路径已找到!endl; cout长度为:fendl; cout路径为:endl; Walking_Path(n); return 1; else /寻找中。 OPEN.pop(); CLOSE.push(n); Expand(n); SortStack(); void PrintMaz

19、e()/输出迷宫模型 int i,j; cout迷宫如图:endl; for(i=0;i7;i+) if(i%2=0) for(j=0;j7;j+) if(MazeMapij=1) cout#; else if(MazeMapij=2) cout-; else if(MazeMapij=0) cout ; coutendl; else for(j=0;j7;j+) if(MazeMapij=2) cout|; else cout ; coutendl; void main()/调用输出迷宫和寻找路径函数 PrintMaze(); GoIntoMaze();六、实验结果七、实验总结通过本次作业,加深了对搜索策略的认识。启发式的搜索方不是像穷举的搜索办法一样,列举出所有可行的节点从而进行一一比对,来找到程序所要的目标节点,而是通过算法过程中的启发信息进行有目的的搜索,这样的做法使得搜索变得更有目的性,减少搜索的盲目性,并且这种算法能及时的排除掉那些不可能得到目标节点的节点,使得搜索算法变得更有效率。运用A*算法解决迷宫的最短路径问题,使我充分认识到启发式搜索算法的优点。在以后的编程搜索算法中,可以适当的运用这一十分有效率的算法,以达到提高程序效率的目的。

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

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