什么是启发式搜索?

本篇将会结合实例解析启发式搜索,帮助大家更好理解。

启发式搜索(英文:heuristicsearch)是一种改进的搜索算法。它在普通搜索算法的基础上引入了启发式函数,该函数的作用是基于已有的信息对搜索的每一个分支选择都做估价,进而选择分支。简单来说,启发式搜索就是对取和不取都做分析,从中选取更优解或删去无效解。

(1)贪婪最佳优先

在Dijkstra算法中,我已经发现了其最终要的缺陷,搜索存在盲目性。在这里,我们只针对这个痛点,采用贪婪最佳优先搜索来解决。如何解决?我们只需稍微改变下观念即可,在Dijkstra算法中,优先队列采用的是,每个顶点到起始顶点的预估值来进行排序。在贪婪最佳优先搜索采用的是,每个顶点到目标顶点的预估值来进行排序。

两者的搜索过程对比如下动图所示:

明显看到右边的算法(贪婪最佳优先搜索)寻找速度要快于左侧,虽然它的路径不是最优和最短的,但障碍物最少的时候,他的速度却足够的快。这就是贪心算法的优势,基于目标去搜索,而不是完全搜索。

(2)Astar算法

我们找到了最短路径和搜索顶点最少数量的两种方案,Dijkstra算法和贪婪最佳优先搜索。接下来能否汲取两者的有点选择既速度快又能得到最优解的算法?

Astar算法正是这么做了,它吸取了Dijkstra算法中的当前代价,为每个边长设置权值,不停的计算每个顶点到起始顶点的距离,以获得最短路线,同时也汲取贪婪最佳优先搜索算法中不断向目标前进优势,并持续计算每个顶点到目标顶点的距离,以引导搜索队列不断想目标逼近,从而搜索更少的顶点,保持寻路的最优解。Astar算法在运算过程中,每次从优先队列中选取f(n)值最小(优先级最高)的节点作为下一个待遍历的节点。Astar算法使用两个集合来表示待遍历的节点,与已经遍历过的节点,这通常称之为open_set和close_set。

Astar算法优先队列排序方式基于估价值,估价值由顶点到起始顶点的距离(代价)加上顶点到目标顶点的距离(启发函数)之和构成。

Astar算法、贪婪最佳优先、Dijkstra算法三者的静态效果图如下:

由于概念过于抽象,这里使用例题讲解。

如果你是辰辰,你能完成这个任务吗?

输入格式:

输出格式:

代码实现:

#include#include#include#include#includeusingnamespacestd;typedeflonglongll;intn,m,ans;constintmaxn=105;structnode{inta,b;doubleval;}e[maxn];boolcmp(nodea,nodeb){returna.val>b.val;}intf(intt,intv){inttot=0;for(inti=0;i+t<=n;i++){if(v>=e[t+i].a){v-=e[i+t].a;tot+=e[i+t].b;}elsereturn(int)(tot+v*e[i+t].val);}returntot;}voiddfs(intt,intpass,intv){ans=max(ans,v);if(t>n)return;if(f(t,pass)+v>=ans)dfs(t+1,pass,v);if(e[t].b>m>>n;for(inti=1;i<=n;i++){cin>>e[i].a>>e[i].b;e[i].val=1.0*e[i].b/e[i].a;}sort(e+1,e+1+n,cmp);dfs(1,m,0);cout<

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

THE END
1.启发式算法课程设计理念.docx启发式算法课程设计理念一、教学目标本课程旨在通过启发式算法的学习,让学生掌握基本的算法思想和方法,培养学生的问题解决能力和创新思维能力。具体的教学目标如下:知识目标:使学生了解并理解启发式算法的基本概念、原理和常用算法。技能目标:培养学生能够运用启发式算法解决实际问题,提高学生的编程能力和算法设计能力。情感https://www.renrendoc.com/paper/370548727.html
2.人工智能算法背后的故事:从启发到创新展开 人工智能背后的那些看似神秘的算法,竟然是从大自然的奥秘、科学的启发和人类智慧的碰撞中诞生的?这些算法不仅改变了我们工作的方式,还在悄悄地塑造未来的世界。今天,就让我们一起揭秘,人工智能算法背后的故事,从最初的灵感闪现,到它如何演变成引领创新的核心力量!人工智能算法的灵感常常来自我们日常生活中的平凡https://www.sohu.com/a/839485940_121188207
3.数学建模——启发式算法(模拟退火遗传算法)启发式算法是基于直观或经验构造的算法,在可接受的计算时间和空间条件下,给出待解决优化问题的一个可行https://kaiwu.qboson.com/forum.php?mod=viewthread&tid=431&extra=page%3D1
4.有啥问啥什么是启发式算法(HeuristicAlgorithm)?什么是启发式算法(HeuristicAlgorithm)? 启发式算法是一类在解决复杂问题时利用经验规则和启发式信息进行搜索的算法。这些算法并不保证找到最优解,但在很多情况下能找到一个较好的解,且计算效率较高。启发式算法广泛应用于组合优化、人工智能、搜索问题等领域。 https://blog.csdn.net/mieshizhishou/article/details/140996716
5.经典算法研究系列:八再谈启发式搜索算法编程开发资料库A*搜索算法,作为经典算法研究系列的开篇文章,之前已在本BLOG内有所阐述。 但要真正理解A*搜索算法,还是得先从启发式搜索算法谈起。 毕竟,A*搜索算法也是启发式算法中的一种。ok,切入正题。 一、何谓启发式搜索 启发式搜索算法有点像广度优先搜索,不同的是,它会优先顺着有启发性和具有特定信息的节点搜索下去 https://soft-app.iteye.com/blog/922327
6.什么是启发式搜索?详述启发式搜索的原理?用C语言实现启发式搜索用C语言实现启发式搜索算法。内附代码。 大家好,我是贤弟! 一、什么是启发式搜索? 启发式搜索算法是一种基于经验和启发性信息的搜索算法,它通过评估每个搜索节点的启发性价值来指导搜索方向,从而在搜索空间中找到最优解。 启发式搜索算法可以应用于各种领域,如人工智能、运筹学、计算机视觉等。https://cloud.tencent.com/developer/news/1261429
7.遗传算法原理及其应用.pdf该法效率较低。 用心打造免费、绿色、专业、海量的教育文库网站 本文档来源于第一文库网:/view/9713DE425B686CA 3.html 启发式算法:寻求一种能产生可行解的启发式规则,以找到一个最优解或近似最优 解。此法对每个问题都必须找出其特有的启发式规则,不具有通用性。 https://max.book118.com/html/2021/0226/7161120004003061.shtm
8.基于启发式策略的最短路径算法【摘要】:在讨论经典Dijkstra算法和启发式策略算法(A*,矩形算法等)的基础上,提出一种基于Dijkstra算法的动态方向限制搜索算法用于求解道路网络中两节点之间最短路径.该算法结合人类的搜索思路和动态灵活的处理方式,对最短路径算法的搜索策略进行改进,动态改变搜索限制区域,减少计算时间.该算法不仅可以单独提高计算最短路径https://www.cnki.com.cn/Article/CJFDTotal-HZLG200612001.htm
9.7启发式求解器的软件结构和优化算法到目前为止,我们已经完成了数据模型的建立和处理,以及用算法构建(Konstruktiv)和评估(Evaluation)。前面的章节也提到过,启发式算法构建的解决方案未必是最优解,因此本章我们来讲解如何逐步优化启发式算法提供的解决方案,并把到目前为止已经涉及到的算法和结构体系化。 https://www.jianshu.com/p/d8d5d78b9c8c