实验四A星算法求解迷宫问题实验 求解迷宫的算法的代码
下面是范文网小编整理的实验四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? ? ? ? ))(ytepo_!(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)所起到的巨大重用.一个好的估计函数对于启发式搜索算法来说是十分关键的. 迷宫问题实验报告 遗传算法求解TSP问题实验报告 计算机网络实验实验要求 数值计算实验四 实验五面调度算法模拟,实验报告