自动驾驶规划算法

本文将讲解BFS,Dijstra,A*,动态规划的算法原理,不正之处望读者指正,希望有兴趣的读者能在评论区提出一些这些算法的面试考点,共同学习,一起进步

0 图论基础

图有三种:无向图、有向图、带权重的图
无向图
Alt有向图
Alt

带权重的图
Alt

1 BFS

广度优先搜索算法
利用队列queue数据结构实现:先进先出
在这里插入图片描述
算法流程(伪代码):

BFS(G, start, goal):let Q be queue;Q.push(start);mark start as visited;while (!Q.empty()){v = Q.front();Q.pop();if (v is the goal) return v;for all neighbours n of v in GQ.push(n);n->parent = v;mark n as visited;}

BFS总结:
(1)相同探索所有的方向
(2)如果所有边权重为1,那么用BFS搜索出来的路径是cost最优的
(3)在不同的场景中,不能保证所有的边权重为1,对于这些场景,BFS受限

2 Dijstra

核心思想:
(1)相比BFS,Dijstra维护一个新变量g(n),g(n)表示从起始节点到当前节点的累积成本
(2)从openset(Min-priority queue)中访问累积成本g最低的节点

算法流程(伪代码):

Dijstra(G, start, goal):let open_list be priority_queue;open_list.push(start, 0);g[start] = 0;while (!open_list.empty()){current = open_list.pop();mark current as visited;if (current is the goal) return current;for (all unvisited neightbours next of current in G){next_cost = g[current] + cost(current, next);if (next is not in open_list)open_list.push(next, next_cost);else {if (g[next] > next_cost)g[next] = next_cost;}}}

优点:
(1)Dijstra算法能找到从起始节点到图上所有其他节点的最短路径
(2)Dijstra算法满足最优性
缺点:每次都会从open_list寻找代价最少的节点,但是并不知道终点在哪,如果用这个算法做图中特定两个点的最短路径,是比较低效的

3 A*算法

A*算法手撕版本见手撕A算法(详解A算法)

核心思想:

(1)相比Dijstra,A*将目标点的成本估计为启发式信息以提高效率
(2)启发式函数h(n):表示从节点n到目标的估计成本
(3)评估每个节点的成本函数:f(n)=g(n)+h(n)
(4)从open_list选择f-score最低的节点,而不是Dijstra算法中的g-score

算法流程(伪代码):
Astar(G, start, goal):let open_list be priority_queue;g[start] = 0;f[start] = g[start] + h[start];open_list.push(start, f[start]);while (!open_list.empty()){current = open_list.pop();mark current as visited;if (current is the goal) return current;for all unvisited neighbours next of current in Gnext_cost = g[current] + cost(current, next);if (next is not in open_list)open_list.push(next, next_cost + h[next]);else{if (g[next] > next_cost) {g[next] = next_cost;f[next] = next_cost + h[next];}}}
启发式函数设计

在路径搜索过程中,没有唯一启发函数设计原则,需要根据特定的任务来设计,如果最优性和距离相关,则可以计算节点之间的直线距离来估计

三种常用的距离:
起点: ( p 1 , p 2 ) (p_1, p_2) (p1,p2) 终点: ( q 1 , q 2 ) (q_1, q_2) (q1,q2)
(1)Euclidian distance
d ( p , q ) = ( q 1 − p 1 ) 2 + ( q 2 − p 2 ) 2 d(p,q)=\sqrt{(q_1-p_1)^2+(q_2-p_2)^2} d(p,q)=(q1p1)2+(q2p2)2
(2)Manhattan distance
d ( p , q ) = ∣ q 1 − p 1 ∣ + ∣ q 2 − p 2 ∣ d(p,q)=|q_1 - p_1|+|q_2 - p_2| d(p,q)=q1p1+q2p2
(3)Great circle distance
Alt
△ σ = a r c c o s ( s i n ϕ 1 s i n ϕ 2 + c o s ϕ 1 c o s ϕ 2 c o s ( △ λ ) ) \bigtriangleup \sigma =arccos(sin\phi _1sin\phi_2+cos\phi_1cos\phi_2cos(\bigtriangleup\lambda )) σ=arccos(sinϕ1sinϕ2+cosϕ1cosϕ2cos(λ))

d = r △ σ d = r\bigtriangleup \sigma d=rσ

最优性

启发式函数 h ( n ) < c o s t ( n , g o a l ) h(n)<cost(n,goal) h(n)<cost(n,goal)
只要启发式函数提供了小于实际成本的估计,A*将始终找到最优路径,并且通常比Dijstra快
在这里插入图片描述
实际上A->B->D是最短路径
因为B的启发式函数高估了对目标的成本

这种高估导致搜索算法相信节点C总成本低于节点B,使得节点C在节点B之前访问,导致结果不是最优路径

在gridmap中如何设计启发式函数
在这里插入图片描述

使用8连接,曼哈顿距离启发式高估了成本
欧几里得距离总是可以接受

A*算法的精度和效率
在这里插入图片描述

(1) h ( n ) = 0 h(n)=0 h(n)=0:A退化为Dijstra
(2) h ( n ) < c o s t ( n , g o a l ) h(n)<cost(n,goal) h(n)<cost(n,goal):A
满足最优性,效率比Dijstra更高
(3) h ( n ) = c o s t ( n , g o a l ) h(n)=cost(n,goal) h(n)=cost(n,goal):A满足最优性,并且有最高的效率
(4) h ( n ) > c o s t ( n , g o a l ) h(n)>cost(n,goal) h(n)>cost(n,goal):A
不满足最优性,高估实际成本

BFS、Dijstra、A*总结:

BFSDijstraA*
(1)BFS算法会朝着周围等价扩展(1)相比BFS,Dijstra倾向于累积成本最小化,不是平等地搜索所有可能的路径,能在加权图中满足最优性(1)A*是Dijstra的修改,添加了启发式函数h(n)提高搜索效率
(2)如果每条边权重为1,BFS搜索出来的path也是最优解(2)如果每条边权重为1,BFS=Dijstra(3)启发式函数的设计会影响效率和准确性

搜索算法可视化参考:http://qiao.github.io/PathFinding.js/visual/

4 动态规划

  1. 定义:

一种计算机编程方式,首先把算法问题分解为子问题,求解这些子问题,并把这些结果保存下来,然后优化子问题找到整个问题的最优解

  1. 动态规划的性质:

(1)最优子结构

面对一个大问题可以分解为一系列子问题。如果能找到每个小问题的最优解,并且能够把小问题拼成大的问题。这种问题就叫最优子结构

(2)重复的子问题

动态规划不会重新计算重复的子问题,会事先保存结果

在这里插入图片描述
在这里插入图片描述
3. 计算方法
(1)前向法
在这里插入图片描述

(2)逆向法
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

印度网民集体删除中国APP,网友评论亮了

全世界只有3.14 % 的人关注了爆炸吧知识最近&#xff0c;国外有一款Remove China Apps火了。这款APP只有一个功能&#xff1a;可以一键扫描用户手机里的应用&#xff0c;识别出自中国公司的应用&#xff0c;并进行一键删除的骚操作。应用的主图标、界面&#xff0c;甚至特意使用…

SQL Server 负载均衡集群(转)

SQL Server 负载均衡集群一个应用系统随着业务量的提高,以及访问量和数据流量的快速增长&#xff0c;各个核 心部分的处理性能和计算强度也相应增大&#xff0c;使得单一设备根本无法承担。在此情况下&#xff0c;如果扔掉现有设备去做大量的硬件升级&#xff0c;必将造成现有资…

大前端快闪二:react开发模式 一键启动多个服务

最近全权负责了一个前后端分离的web项目&#xff0c;前端使用create-react-app[1], 后端使用golang做的api服务。npx create-react-app my-app cd my-app npm start歘歘歘&#xff0c;就搭建了一个react前端项目。前端老鸟都知道npm start或yarn start以开发模式启动react App&…

数据库比较工具SQL Delta

SQL Delta 版本4只支持SQL Server数据库 版本5支持Oracle 但是数据库中不可以有英文 否则连接时会报 ORA-12737: Instant Client Light: unsupported server character set ZHS16GBK的错误 配置如下所示&#xff1a; 转载于:https://blog.51cto.com/shuimomo/461266

女朋友在家是怎么利用我的模型的​

1 趁着奶猫还没长大&#xff0c;赶紧摸2 说有谁不喜欢玩具呢3 爸爸再也不用费心编辫子了4 谁知道这是什么5 还挺会利用的啊6 学霸上厕所的时候7 逻辑推理你点的每个赞&#xff0c;我都认真当成了喜欢

abap al设置单元格可编辑 oo_润乾报表美化设置 -- 样式

在制作报表时&#xff0c;报表设计人员经常遇到下面这些美化报表的问题&#xff1a;为什么我做出的报表领导总觉得不好看不满意 美化一张报表要设置太多的格式和属性&#xff0c;那么多报表都得重复设置&#xff0c;真繁琐 系统中不同人做出的报表展现格式各不相同&#xff0c;…

GRPC在网页前端的使用

一直以来都是一个桌面端程序狗&#xff0c;某天突发奇想&#xff0c;想用网页实现一个客户端&#xff0c;于是开始了electronvueasp.netcore的探寻之路&#xff0c;这条道路很坎坷主要是css让我头疼不已&#xff08;当然我们并没有放弃使用wpf&#xff0c;我是一个wpf老手&…

vue 带全选和多选的表格怎么写_EXCEL五分钟,批量制作带照片的工地出入证

作者&#xff1a;祝洪忠 转自&#xff1a;Excel之家ExcelHome小伙伴们好啊&#xff0c;今天和大家分享一个邮件合并的技巧——批量制作带照片的工地出入证。先看效果图&#xff1a;要准备的材料包括&#xff1a;一、Excel资料表资料表中包括姓名、工号和用姓名命名的带格式后缀…

从小一看到数字,脑子里就开始搞颜色......

1 脑子里的数字有颜色估计都是它的锅▼2 不愧是你▼3 文科生考场惯用伎俩填满了就是胜利▼4 每年向社会输送大量精英人才▼5 &#xff1f;&#xff1f;&#xff1f;▼6 高考最后一晚逆袭的答案在一本叫《刑法》的书里▼7 中国外卖VS俄罗斯外卖毛子送外卖坐公交你敢信&am…

android键盘弹出,聊天背景不变形

2019独角兽企业重金招聘Python工程师标准>>> android:transcriptMode"normal"&#xff0c;如果软键盘弹出时候&#xff0c;设置该属性listview会自动调整到最后&#xff0c;这样弹出的软键盘就不会遮盖到listview了 背景图尽量用 getWindow().setBackgrou…

bpmn文件的标签为何都以bpmn2开头_C语言之两种作用域:函数的作用域与文件作用域...

作用域描述程序中可访问标识符的区域。一个C变量的作用域可以是块作用域、函数作用域、函数原型作用域或文件作用域。其中&#xff0c;块是用一对花括号括起来的代码区域。例如&#xff0c;整个函数体是一个块&#xff0c;函数中的任意复合语句也是一个块。定义在块中的变量具有…

集成开放平台标准化连接器之基于OAS3.0的API管理能力

源宝导读&#xff1a;随着企业信息化进程的逐步深入&#xff0c;互联网技术的发展和分布式系统应用的日益广泛&#xff0c;直接导致大量异构系统的存在&#xff0c;这些系统往往各自独立、封闭运行&#xff0c;相互之间不存在或很少存在数据的交互&#xff0c;由于这种应用分割…

axure 组件_技巧分享 | Axure后台组件制作的全过程

点击上方蓝字&#xff0c;关注行设视觉黑马家族成员原创发布于行设视觉&#xff0c;转载请注明出处。作者 | 时光若刻http://www.woshipm.com/rp/2527010.html大家好&#xff0c;前一段时间我刚刚分享了一篇《打造高品质Axure组件库就是这么简单》&#xff0c;意在分享给大家一…

有没有测试人心里的软件,心理测评,认识自己的有效工具:(二)你做的可能是假的心理测试...

上一篇文章主要介绍了心理测评的基础知识&#xff0c;今天在上一篇的基础上&#xff0c;介绍下网上一些随处可见的心理测评&#xff0c;是如何的错误&#xff0c;以及怎么“迷惑”大家的&#xff1f;网上随便搜的一个阅读量超过10w的"心理"测试&#xff1a;测试他人会…

这相册一出手,哪个长辈搞不定?

1 这相册看着多喜庆看这花多美▼2 不会只有我一个人连最普通的都叠不好吧&#xff1f;▼3 真就史上最惨毕业生连毕业照都不配拥有吗&#xff1f;▼4 看起来经历了很严格的军训▼5 我闺蜜【偷】男票的钱给我买MAC air▼6 在台湾爸比和东北妈妈中间无缝切换▼7 先漱口、后…

医疗大数据:商业保险、移动医疗的崛起,正在形成闭环(二)

以下内容摘自华创证券分析师 吴晓雯、张伟光的《挖掘医疗大数据中的金矿》报告。 接上篇&#xff1a;医疗大数据&#xff1a;商业保险、移动医疗的崛起&#xff0c;正在形成闭环&#xff08;一&#xff09; 三、 商业保险、移动医疗等商业力量的崛起&#xff0c;加速医疗大数据…

WriteComponent,ReadComponent

WriteComponent,ReadComponent 代码 varForm1: TForm1; ms: TMemoryStream;implementation{$R *.dfm}procedureTForm1.Button1Click(Sender: TObject);varaBtn: TButton;beginaBtn :TButton.Create(Self); aBtn.Parent :Self; aBtn.Caption :Test; aBtn.Left :10; ms.WriteComp…

jquery 使用方法

jQuery是目前使用最广泛的javascript函数库。据统计&#xff0c;全世界排名前100万的网站&#xff0c;有46%使用jQuery&#xff0c;远远超过其他库。微软公司甚至把jQuery作为他们的官方库。对于网页开发者来说&#xff0c;学会jQuery是必要的。因为它让你了解业界最通用的技术…

bread是可数还是不可数_雅思官方语法教程之——这个名词到底可不可数?

名词是否可数&#xff0c;是非常隐形的扣分点。考生很可能意识不到自己犯错了&#xff0c;毕竟这是中文里不存在的语法点。这类语法点更应该重点备考。越练习&#xff0c;越熟悉&#xff0c;犯错扣分的几率也就越低。OK进入主题↓语法解释官方对可数和不可数名词的解释如下&…

google的api key调用次数是多少_Sprint Boot如何基于Redis发布订阅实现异步消息系统的同步调用?...

前言在很多互联网应用系统中&#xff0c;请求处理异步化是提升系统性能一种常用的手段&#xff0c;而基于消息系统的异步处理由于具备高可靠性、高吞吐量的特点&#xff0c;因而在并发请求量比较高的互联网系统中被广泛应用。与此同时&#xff0c;这种方案也带来了调用链路处理…