生活资讯
HNU-人工智能-实验1-A*算法
2025-01-02 14:11  浏览:126
  • 掌握有信息搜索策略的算法思想

    HNU-人工智能-实验1-A*算法

  • 能够编程实现搜索算法

  • 应用A*搜索算法求解罗马尼亚问题。

  • 课程实训平台https://www.educoder.net/shixuns/vgmzcukh/challenges

3.0 题目要求

罗马尼亚问题:在罗马尼亚度假,目前位于 Arad 城市。明天有航班从Bucharest 起飞,不能改签退票。

现在你需要寻找到 Bucharest 的最短路径,在右侧编辑器补充函数,使用编写的搜索算法代码求解罗马尼亚问题

3.1 A*算法原理

算法的原理是设计一个代价估计函数:其中 **评估函数**是从起始节点通过节点的到达目标节点的最小代价路径的估计值,函数是从起始节点到节点的已走过路径的实际代价,函数是从节点到目标节点可能的最优路径的估计代价 。

函数 表明了算法使用的启发信息,它来源于人们对路径规划问题的认识,依赖某种经验估计。根据 可以计算出当前节点的代价,并可以对下一次能够到达的节点进行评估。

采用每次搜索都找到代价值最小的点再继续往外搜索的过程,一步一步找到最优路径。

3.2 算法实现

初始给定出发节点,放入openList队列,然后进行扩展操作

  • 扩展操作:对于所有与该节点相连的节点,计算它们的g()值,然后加上h()值,得到f()值,并加入openList队列。
  • openList队列:该队列本质是一个优先队列,以队列中各元素节点的f()值为键进行排序。给定的程序中使用sort+优先队列来实现,实际上这里直接使用优先队列来进行维护会效率更高,这是可以优化的一个点。
  • 选定操作:在扩展,优先化(也就是题中的sort)之后,选定一个f()值最大的作为下一个访问的节点。
  • 访问节点:任何节点的访问操作只能进行一次,但是扩展操作可以进行多次(这其实也可以理解,再次访问该节点显然比原来访问该节点的代价高
  • 终止条件:按照上述循环重复执行,直至访问到(不是扩展到)目标终点为止。

基本思路可以用下述伪代码展示

 

3.3 源码&分析

 

具体分析如下

  • 结构体定义:结构体 定义了节点的属性,包括节点名称 ,从起点到该节点的路径长度 ,该节点到目标节点的估计距离 ,以及综合路径长度和估计距离的总代价 。重载了小于操作符,以便在优先队列中进行排序。
  • 图的表示:使用二维数组 表示图,数组大小为 20x20,即有 20 个节点。数组中存储了节点之间的边的权值。
  • 初始化图:在 类的 方法中,添加了节点之间的边及对应的权值。
  • A*搜索算法: 函数实现了A*搜索算法。它通过优先队列 来管理待扩展的节点,并且利用数组 来记录已经访问过的节点。 数组用于记录每个节点的父节点,方便后续回溯路径。算法首先将起始节点加入到 中,并进行排序。然后,循环进行以下步骤
    • 取出 中的首节点 ,如果该节点是目标节点,则搜索结束。
    • 将 加入到 中,表示已经访问过。
    • 遍历与当前节点相邻的节点,如果相邻节点未被访问过,则将其加入到 中,并更新其父节点为当前节点,并根据当前节点到该相邻节点的路径长度以及该节点到目标节点的估计距离计算总代价 。
    • 最后对 进行排序,以保证优先扩展代价较小的节点。
  • 打印结果: 函数用于打印搜索结果,即输出找到的最短路径以及路径的总代价。
    • 将起始节点压入栈中。
    • 从目标节点开始,通过 数组逐步向上回溯,将经过的节点依次压入栈中,直到回溯到起始节点。
    • 在压入栈的过程中,同时计算路径的总代价。因为 A* 算法是一种启发式搜索算法,搜索到的路径并不一定是最优的,但它会在每一步中选择一个启发性最好的节点进行扩展,因此得到的路径一般是较优的。
    • 最后,从栈中依次弹出节点,打印出完整的路径,并输出路径的总代价。
  • 主函数:在主函数中,首先初始化图,然后调用 函数进行搜索,并最终打印搜索结果。【注意】主函数是在线平台中没有的,在线平台应该指定了程序入口并做了变量初始化的工作。因此我们用主函数来实现这个工作。

综上所述,这段代码实现了使用A*算法在给定图中寻找从起点到目标点的最短路径,并输出了路径以及路径的总代价。

3.4 基于题目的代码:算法分析

时间复杂度可能趋近于O(n^3),主要原因与维护parent数组的最新性有关,这个后面在讲想法的时候会具体说明。

空间复杂度应该有O(n^2),因为使用邻接矩阵来存储图。

3.5 基于题目的代码:困惑思考

基于题目做这道题的时候,我感觉很困惑。

A*算法不是一个非常复杂的算法,但题目中的一些操作让我感觉有点迷。

①parent数组问题

题目使用openList中保存被扩展的节点,然后用closeList来标记被访问的节点,用parent来存储每个节点的父亲这种方式。

这会带来一个挑战:在一个节点被扩展之后,它不一定被立即访问。

如下面这张图,Sibiu节点的四个子节点中,最右子节点Rimnicu Vilcca先被访问,但后来Sibiu的左起第二个子节点Fagaras又被访问到了。此时若该两个子节点都有相同的另一个子节点M,则M可能同时具有Rimnicu Vilcca和Fagaras两个父节点。这样用一个parent数组显然是没办法表示的(注意这里不能是覆盖关系,因为这两个子节点都是“被扩展”的状态而不是“已被访问”的状态,真正被访问的节点有可能从它们之一产生

比如,出现下图所示情况。若Bucharest不是最终节点,则它同时又两个parent,这显然无法用一个parent数组存下。

因此理想的方法是将parent作为一个属性写入该节点的node结构体中去。但这样还没解决一个问题,输出结果会有点烦。

或者使用后面改进的方法,直接用指针来作为属性。这样只需要指针走一遍,就可以把顺序给呈现出来了。

但是,原题中我也想办法解决了,其实观察或者是从题目中可以发现,一个节点如果发现有比它g()值更小的节点,实际上g()值较大的那个显然就没有用了,即使予以保留,最终也会在较低优先级而不会被调用(这个实际上看的是f()值,事实上是一样的,因为f()=g()+h(),h()显然只与节点有关系)。故我直接略去g()值较大的节点,默认它们直接被淘汰掉了,parent数组只保存g()值最小的那个所对应的。

②vector+sort替代priority_queue

题目中使用了vector来保存访问节点的结构体,再加上sort来保证优先级,其实可以直接用priority_queue来实现,效率更高。

3.6 改进代码-结构体

只展示核心代码,略去重复的宏定义部分和graph类。

使用结构体和指针绕开了parent数组的问题

 

3.7 改进代码2-<priority_queue>

只需要在上面代码的基础上更改部分即可,但考虑到这里使用的其实是结构体的指针,故重载运算符其实不太好操作。我采取使用比较函数的方法来完成大小的判断。

 

3.8 运行截图

1:宽度优先搜索,深度优先搜索,一致代价搜索,迭代加深的深度优先搜索算法哪种方法最优

首先分析这四种算法

  • 宽度优先搜索(BFS:通常在最短路径问题上表现优异,但是空间复杂度很高,因为需要保存所有已经访问的节点。
  • 深度优先搜索(DFS:解空间较大,在解相对较浅的问题上可能更有效率,但是可能会陷入无限深度的分支。
  • 迭代加深深度优先搜索(IDDFS:结合了DFS和BFS的优点,在不断增加的深度限制上调用深度受限搜索。对于深度搜索问题而言,是一种比较有效的方法。
  • 一致代价搜索(UCS:保证在图中搜索的每一步都是最小代价的算法,通常在无启发式的情况下用于解决最短路径问题。

对于一般的问题而言,一致代价搜索是更优的。但对于不同问题要具体问题具体分析,如问题的时间或空间限制等。

2:贪婪最佳优先搜索和A*搜索哪种方法最优

首先分析这两种算法

  • 贪婪最佳优先搜索:根据启发式函数h()所提供的信息,每次选择看起来最有希望的节点进行扩展,但是它不能保证找到最优解,因为它没有考虑到节点到目标的真实代价。
  • A*搜索算法:通过综合考虑节点的实际代价g()和启发式函数h()的估计值,保证了在每一步都能选择到最优的节点进行扩展,从而保证找到最优解。

A*搜索算法通常在需要找到最优解的问题上更为优秀,因为它考虑了实际代价。

3:分析比较无信息搜索策略和有信息搜索策略。

    以上就是本篇文章【HNU-人工智能-实验1-A*算法】的全部内容了,欢迎阅览 ! 文章地址:http://sjzytwl.xhstdz.com/xwnews/940.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://mip.xhstdz.com/ , 查看更多   
最新文章
教你彻底关闭手机自动更新,老手机不再卡顿还可以继续用几年手机系统更新怎么关闭「教你彻底关闭手机自动更新,老手机不再卡顿还可以继续用几年」
当我们购买一部新手机时,第一时间关闭系统更新是非常重要的。你们知道为什么我们经常更换手机吗?不正是因为手机变得卡顿和不流
电信固话怎么设置呼叫转移座机转接到手机怎么设置「电信固话怎么设置呼叫转移」
在现代通信中,呼叫转移功能为用户提供了极大的便利,尤其是在无法接听电话或需要临时将电话转接到其他号码时。对于电信固话用户
从“出新必换”到“多年不换”,消费者为啥不爱换手机了?手机几年换一次比较好「从“出新必换”到“多年不换”,消费者为啥不爱换手机了?」
你有多久没换手机了?不少消费者反馈,自己已经一两年或更长时间没有购买新手机或新平板电脑了。从“出新必换”到“多年不换”,
求小明正确的四位手机密码手机密码破解「求小明正确的四位手机密码」
小学生题目:小明五次输入四位数的手机密码均错误,但是每次输入的密码中都有两位数字正确,且输入的数字的位
奥尼尔谈GOAT人选:NBA仅4人够格
关于谁才是NBA的GOAT,每个人心中都会有自己的看法,毕竟大家看比赛的角度不同,对于球星成色的判断也就不同。近日,奥尼尔就谈
新就业形态下,灵活就业人员权益如何保障?
原标题:新就业形态下,灵活就业人员权益如何保障?(主题)专家:多方协同推动劳动者权益保障与企业可持续发展(副题)中国妇女
5G麒麟芯+卫星通信!华为20多款中端机已备案,继续发力高性能手机「5G麒麟芯+卫星通信!华为20多款中端机已备案,继续发力」
近日,有消息称华为将不仅在高端市场回归,还将回归中端市场,将麒麟9000s芯片下放到中端手机中。同时,华为还计划在中端手机中
买台手机好过年 没选新出的S16 Pro 却买了上代15 Pro新出的手机「买台手机好过年 没选新出的S16 Pro 却买了上代15 Pro」
购买小米12 Pro翻车后,眼看离春节就几天,还是要在过年前满足自己买过年的愿望。只考虑了OPPO和VIVO的产品后,放弃了OPPO的Reno
iPhone游戏必备神器、精准识别那个老六。雷蛇手机「iPhone游戏必备神器、精准识别那个老六。」
相信很多用iPhone玩游戏的值友们都遇到过降频的问题,尤其13PM,虽然支持120hz但是只要你敢开,十分钟内必让你的屏幕黑下来,感
割裂的杭州楼市:手握千万资金抢不到房,刚需盘降价40万无人问津
“ 杭州一季度的楼市表现,如同一面多棱镜,映照出土地市场的狂热、开发商的野心、购房者的焦虑,也暴露出城市发展的不均衡。中