实验四A星算法求解迷宫问题实验
实验四:A *算法求解迷宫问题实验 一、实验目的 熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解迷宫问题,理解求解流程和搜索顺序。
二、实验内容 迷宫问题可以表述为:一个二维的网格,0 表示点可走,1表示点不可以走,点用(x,y)表示,寻找从某一个给定的起始单元格出发,经由行相邻或列相邻的单元格(可以通过的),最终可以到达目标单元格的、所走过的单元格序列。在任一个单元格中,都只能看到与它邻近的4个单元格(如果位于底边,则只有 3 个;位于 4 个角上,则只有 2 个是否能通过)。
A*算法是人工智能中的一种搜索算法,是一种启发式搜索算法,它不需遍历所有节点,只是利用包含问题启发式信息的评价函数对节点进行排序,使搜索方向朝着最有可能找到目标并产生最优解的方向.它的独特之处是检查最短路径中每个可能的节点时引入了全局信息,对当前节点距终点的距离做出估计,并作为评价节点处于最短路线上的可能性的度量.A*算法中引入了评估函数,评估函数为:f(n)=g(n)+h(n)其中:n 是搜索中遇到的任意状态。g(n)是从起始状态到 n 的代价。h(n)是对 n 到目标状态代价的启发式估计.即评估函数 f(n)
是从初始节点到达节点 n 处已经付出的代价与节点 n 到达目标节点的接近程度估价值的总和。
这里我们定义 n 点到目标点的最小实际距离为 h(n)*,A*算法要满足的条件为:h(n)<=h(n)* 迷宫走的时候只能往上下左右走,每走一步,代价为 1,这里我们采用的估价函数为当前节点到目标节点的曼哈顿距离,即:
h(n)=|end.x – n.x|+ |end.y – n。y| 这里 end 表示迷宫的目标点,n 表示当前点,很明显这里 h(n)<=h(n)*。
g(n)容易表示,即每走一步的代价是 1,所以利用 f(n)=g(n)+h(n)这种策略,我们可以不断地逼近目标点,从而找到问题的解.时间复杂度:m 行 n 列的迷宫矩阵实现算法的时间复杂度为 O(m*n).实验结果:
实验源码: #include <queue〉 #include 〈vector〉 #include <iostream> using namespace std; int direc[4][2]={{0,1},{-1,0},{0,-1},{1,0}}; enum Flag {,LAESﻩ OPEN,UNVISITED }; typedef struct node { // ;y_,x_ tniﻩ ﻩ)y,x(标坐点节ﻩ int _G; ﻩ ﻩ // ﻩ G销开已际实ﻩ int _H;// ﻩ ﻩ H销开将测探ﻩ ;F_ tniﻩ ﻩ //优先级_F=_G+_H struct node *pre;//前驱顶点 }Queue_Node; typedef struct {;galf galFﻩ;tniop* edoN_eueuQﻩ}Seal; class A_Star {
public:
// 数函造构ﻩ A_Star(){ input(); } ~)(ratS_Aﻩ {)i++;nel_=<i;1=i tni(rofﻩ { ﻩ ﻩ)j++;diw_=<j;1=j tni(rofﻩ {)LLUN=!tniop。]j[]i[laes_(fiﻩ { ﻩ ﻩ ﻩ ﻩ ﻩ ﻩ ﻩ;tniop.]j[]i[laes_ eteledﻩ } ﻩ ﻩ ﻩ } } ﻩ ﻩ)i++;nel_=〈i;0=i(rofﻩ { ﻩ ﻩ ;]i[laes_][ eteledﻩ
ﻩ delete []_maze[i]; } ﻩ ﻩ;laes_][ eteledﻩ;ezam_][ eteledﻩ })(tupni diovﻩ { cout<<”输入: 迷宫左边长,上边宽!例如:30 20"<〈endl;;diw_>>nel_>>nicﻩ_ ;]1+nel_[*laeS wen=laesﻩ_ ﻩ ;]1+nel_[*rahc dengisnu wen=ezamﻩ for(int i=0;i<=_len;++i){ ﻩ _;]1+diw_[laeS wen=]i[laesﻩ _ ;]1+diw_[rahc dengisnu wen=]i[ezamﻩ } ﻩ ﻩ cout<〈”从下一行开始输入迷宫信息:”<<endl; ﻩ)i++;nel_=〈i;1=i(rofﻩ { ﻩ ﻩ ﻩ)j++;diw_= { ﻩ ﻩ ﻩ cin>〉_maze[i][j];ﻩ _seal[i][j].flag=UNVISITED; _ ;LLUN=tniop.]j[]i[laesﻩ } ﻩ ﻩ } ﻩ ﻩ <<"02 03 1 1:如例,标坐点标目,标坐点起入输"〈〈tuocﻩendl;;ye_>〉xe_>〉ys_>〉xs_>>nicﻩ ]xe_[ezam_||’1"==]ys_[]xs_[ezam_(fiﻩ[_ey]==’1'||bound(_sx,_sy)==false||bound(_ex,_ey)==false){ ﻩ;ldne<<"!况情的样这在存能可不”<〈tuocﻩ ﻩ;nruterﻩ } ﻩ ﻩ ;ldne<〈":下如果结印打法算*A 用调"<<tuocﻩ A();} // 法算心核*Aﻩ)(A diovﻩ { //源点放入开放列表 Queue_Node *p_node=new Queue_Node; p_node—>pre=NULL;;)ys_,xs_(H_teg=H_〉—edon_pﻩ p_node->_G=0;;xs_=x_>—edon_pﻩ ﻩ;ys_=y_〉—edon_pﻩ p_node—〉_F=p_node—〉_H+p_node->_G; _;)edon_p(hsup。nepoﻩ _;NEPO=galf。]ys_[]xs_[laesﻩ _;edon_p=tniop.]ys_[]xs_[laesﻩ ﻩ ﻩ ﻩ))(ytpme.nepo_!(elihwﻩ { ﻩ ﻩ ;)(pot。nepo_=edon_pﻩ_ ﻩ ;)(pop.nepoﻩ int x=p_node—>_x; ﻩ int y=p_node->_y; _ ﻩ ﻩ ;LAES=galf。]y[]x[laesﻩ ﻩ)i++;4<i;0=i tni(rofﻩ { ﻩ ﻩ ;]0[]i[cerid+x=xt tniﻩ ﻩ ;]1[]i[cerid+y=yt tniﻩ if(bound(tx,ty)==false||_maze[tx][ty]=='1"||_seal[tx][ty]。flag==SEAL){ ﻩ ﻩ ﻩ ﻩ ﻩ continue;} ﻩ ﻩ ﻩ ﻩ ﻩ)DETISIVNU==galf.]yt[]xt[laes_(fiﻩ { ﻩ ﻩ ﻩ)ye_==yt&&xe_==xt(fiﻩ ﻩ ﻩ { ﻩ ﻩ ﻩ print(p_node);ﻩ cout〈〈"("<<tx<〈”,"〈〈ty〈〈”)"〈〈endl; ﻩ ﻩ ﻩ ﻩ ne<<”步”<〈F_>-edon_p<<":了走共总”〈 ﻩ ﻩ ;1+G_>-edon_p=G_>—pmetﻩ ﻩ ﻩ ;xt=x_>-pmetﻩ ﻩ ﻩ ﻩ temp-〉_y=ty; ﻩ ﻩ ﻩ ;)yt,xt(H_teg=H_>—pmetﻩ ﻩ ﻩ ﻩ temp-〉_F=temp->_G+temp->_H;_ ﻩ;)pmet(hsup.nepoﻩ ﻩ ﻩ ﻩ } ﻩ ﻩ ﻩ esleﻩ ﻩ { ﻩ;tniop。]yt[]xt[laes_=pmet* edoN_eueuQﻩ ﻩ ﻩ ﻩ ﻩ)G_〉-pmet〈1+G_〉-edon_p(fiﻩ ﻩ { ﻩ ﻩ ﻩ ﻩ ;1+G_〉-edon_p=G_>-pmetﻩ ﻩ ﻩ ;edon_p=erp〉-pmetﻩ ﻩ ﻩ ;H_〉-pmet+G_>-pmet=F_>-pmetﻩ } ﻩ ﻩ ﻩ } ﻩ ﻩ ﻩ } ﻩ ﻩ } ﻩ cout<<"没有从("<〈_sx<〈”,”〈<_sy<<")--->”〈<”(”〈<_ex〈〈","<<_ey〈〈”)的路径"< // 径路印打ﻩ void print(Queue_Node *p){ ﻩ)LLUN==p(fiﻩ { ﻩ ﻩ ﻩ ;nruterﻩ } ﻩ ;)erp>-p(tnirpﻩ ﻩ;",)”〈<y_>-p〈<","〈〈x_〉—p<<”(”〈〈tuocﻩ } ﻩ bool bound(int x,int y){ ﻩ ﻩ >y(&&)diw_=<y(&&)1=>x(&&)nel_=〈x(nruterﻩ=1); } ﻩ ﻩ)y tni,x tni(H_teg tniﻩ { ;)ye_—y(ba+)xe_-x(ba nruterﻩ })i tni(ba tniﻩ { ﻩ return i〈0 ? -i:i;} ﻩprivate: pmc tcurtsﻩ { edoN_eueuQ,1n* edoN_eueuQ()(rotarepo loobﻩ*n2){ ﻩ return n1-〉_F>n2—>_F; } ﻩ ;} ﻩ N_eueuQ〈rotcev,* edoN_eueuQ〈eueuq_ytiroirpﻩode *>,cmp> _open;//最小堆(开放列表)int _len,_wid;//迷宫左边长,上边宽 int _sx,_sy,_ex,_ey;Seal **_seal;//动态开辟封闭列表 unsigned char **_maze;//迷宫地图 }; int main(){ A_Star test;;0 nruterﻩ} 三、实验目的 通过这次实验,使我对启发式搜索算法有了更进一步的理解,特别是估计函 数 h(n)所起到的巨大重用.一个好的估计函数对于启发式搜索算法来说是十分关键的.
版权声明:
1.大文斗范文网的资料来自互联网以及用户的投稿,用于非商业性学习目的免费阅览。
2.《实验四A星算法求解迷宫问题实验》一文的著作权归原作者所有,仅供学习参考,转载或引用时请保留版权信息。
3.如果本网所转载内容不慎侵犯了您的权益,请联系我们,我们将会及时删除。
