人工智能课程设计。
用a*算法编写迷宫问题。
学院:班级:
姓名:学号:
一、 程序目的。
通过编制迷宫程序来熟练掌握a*算法并熟悉和掌握a*算法实现迷宫寻路功能,要求掌握启发式函数的编写以及各类启发式函数效果的比较。
二、 算法概述。
下面给出a*算法:
open:=(s),f(s)=g(s)+h(s)=h(s),fm:=0;
loop:if open=( then exit(fail);
nest:=,计算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) if f(n,m1)open中的节点按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 walked类型的节点。
该函数确定节点a是否存在于open中,如果存在,则返回,如果不存在,return0
walked* exist_close(walked *a)
a为struct walked类型的节点。
该函数确定节点a是否存在于closed中,如果存在,则返回,如果不存在,return0
void expand(walked *a)
a为struct walked类型的节点。
该函数为扩展函数,即扩展a节点,并按照a*算法的步骤判断节点的可行性。
void sortstack()
该函数为排序函数,负责排序open和closed中的数据。
int gointomaze()
该函数负责初始化迷宫模型并且调用其他关键函数。
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)<=n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
如果估价值》实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
其实a*算法也是一种最好优先的算法只不过要加上一些约束条件罢了。由于在一些问题求解时,我们希望能够求解出状态空间搜索的最短路径,也就是用最快的方法求解问题,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)才可(这一点特别的重要)。
可以证明应用这样的估价函数是可以找到最短路径的,也就是可采纳的。我们说应用这种估价函数的最好优先算法就是a*算法。举一个例子,其实广度优先算法就是a*算法的特例。
其中g(n)是节点所在的层数,h(n)=0,这种h(n)肯定小于h'(n),所以由前述可知广度优先算法是一种可采纳的。实际也是。当然它是一种最臭的a*算法。
再说一个问题,就是有关h(n)启发函数的信息性。h(n)的信息性通俗点说其实就是在估计一个节点的值时的约束条件,如果信息越多或约束条件越多则排除的节点就越多,估价函数越好或说这个算法越好。这就是为什么广度优先算法的那么臭的原因了,谁叫它的h(n)=0,一点启发信息都没有。
但在游戏开发中由于实时性的问题,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) 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所示。最短路径为((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
#include
using namespace std;
int mazemap[7][7]=,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&&a->x<=6&&a->y>=0&&a->y<=6)
return 1;
elsereturn 0;
人工智能作业
人工智能 由自然探索于创新课程所想。管理学院李先同 201200272120 人工智能是一个大家看似并不陌生的字眼,我们平时所用的手机,电影中的科幻元素无不充斥着人工智能。由此人工智能变成为了一个人人都知道,却又都不甚了解的事物。通过这学期自然探索与创新课程的学习,我了解到了人工智能的发展简史,更对...
人工智能作业
2014 人工智能 作业 1 提交时间10 21 1 食草动物与食肉动物问题。3只食草动物与3只食肉动物在河一边,并有一条船。船能坐一至两只动物。船不能空载。目标是,把每只动物送到河对岸,并且留在某岸边或者船上的食肉动物数不能多于食草动物数。请将此问题转换成一个搜索问题 a.定义一个状态表示。b.给...
人工智能作业
1.何谓估价函数,在估价函数中,g n 和h n 各起什么作用?解 估价函数的任务是估计待搜索节点的重要程度,给它们排定次序。g n 是起始点到达n的实际路径代价,h n 就是n到目标点最短路径的启发函数。2.设有如下结构的移动将牌游戏 其中,b表示黑色将牌,w表是白色将牌,e表示空格。游戏的规定走...