基于图搜索的自动驾驶规划算法 - BFS,Dijstra,A*

本文将讲解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/576701.shtml

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

相关文章

uni-app附件下载预览 并解决打开附件时黑屏

// 预览附件perviewFile(file) {console.log(点击附件, file)var strfile.previewUrlvar filTypestr.split(.)console.log(filType,filType)uni.downloadFile({url: success: function(res) {console.log(打开文档成功, res);if (res.statusCode 200) {uni.saveFile({tempFile…

11.Go 列表

列表是一种非连续的存储容器&#xff0c;由多个节点组成&#xff0c;节点通过一些变量记录彼此之间的关系&#xff0c;列表有多种实现方法&#xff0c;如单链表、双链表等。 在Go语言中&#xff0c;列表使用container/list包来实现&#xff0c;内部的实现原理是双链表&#xf…

物理模拟重力 斜抛运动计算 抛物线计算

物理模拟重力 斜抛运动计算 抛物线计算 一、介绍二、原理三、实现如下PhysicsUtil.cs 工具类Missile.cs 四、资源分享 一、介绍 模拟Unity原始重力系统进行重写&#xff0c;可是实现发射到指定目标位置并能继续当前力进行自身的弹力与摩擦继续运动 二、原理 将Unity原始不受控…

Linux常用命令(一):Conda、RPM、文件权限、apt-get(更新中...

文章目录 一、Conda二、RPM三、文件权限四、apt-get 一、Conda Conda是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装和管理软件包及其依赖项。它主要用于Python编程语言&#xff0c;但也可以用于其他语言的项目。Conda可以帮助用户创建不同版本的Python环境&a…

​一个人成长最快的方式

一个人成长最快的方式就是&#xff1a;保持阅读&#xff0c;向行业的专家学习&#xff0c;在实践中不断的复盘总结&#xff0c;循环这三点&#xff0c;没有学不好的东西。基于此&#xff0c;推荐一些在产品、设计领域的专家&#xff0c;关注他们&#xff0c;学习他们&#xff0…

springcloud 服务网关Zuul实战(二)路由访问映射规则

上篇文中已经讲完基本的路由配置&#xff0c;但是我们如何对访问的微服务做映射 访问的地址&#xff1a;http://myzuul.com:9527/microservicecloud-dept/dept/get/2 从访问地址可以分析出我们真实的微服务名字&#xff0c;我们为了安全起见将真实的微服务名字隐藏&#xff0…

B端 — 卡片式列表设计

作者&#xff1a;Nick&#xff08;转载已取得作者授权&#xff09;卡片式列表是一种很好的集合信息的方式&#xff0c;它既有好处也有弊端&#xff0c;因此需要根据场景和内容确定展现形式。本文结合了案例与大家分享一下卡片式列表设计的一些思考。一、定义1. 什么是卡片物理世…

隐藏文件或文件夹属性无法修改解决方案

对于无法显示隐藏文件或文件夹的问题&#xff0c;网上的的 控制面板--》文件夹选项 解决方案就不再累述了。接下来是这个问题&#xff1a;可以显示隐藏文件&#xff0c;但是想将隐藏文件或文件夹的隐藏属性去掉&#xff0c;却无法操作。因为右键查看文件属性时&#xff0c;可以…

springcloud config配置中心概述

Spring Cloud Config简介 Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心&#xff0c;虽然后来又发布了 Consul 可以代替配置中心功能&#xff0c;但是 Config 依然适用于 Spring Cloud 项目&#xff0c;通过简单的配置即可实现功能。 配置文件是我们再熟悉不过的…

【计算机四级(网络工程师)笔记】操作系统运行机制

目录 一、中央处理器&#xff08;CPU&#xff09; 1.1CPU的状态 1.2指令分类 二、寄存器 2.1寄存器分类 2.2程序状态字&#xff08;PSW&#xff09; 三、系统调用 3.1系统调用与一般过程调用的区别 3.2系统调用的分类 四、中断与异常 4.1中断 4.2异常 &#x1f308;嗨&#xff…

JAVA中equals()方法的重要性

对于对象比较使用equals()方法的重要性&#xff0c;这里以String类为例进行了比较。 /*** 对于对象比较使用equals()方法的重要性&#xff0c;这里以String类为例进行了比较。* author HAN**/ public class TestEqual {public TestEqual(){testMethod();}void testMethod(){Str…

springcloud config服务端配置(一)

用自己GitHub账号在GitHub上新建一个microservicecloud-config的新的repository 又上一步我们得到了ssh的git地址 gitgithub.com:470812087/microservicecloud-config.git 本地目录新建&#xff08;F:\JAVA\ideaIU\microservicecloud-config-repository&#xff09;仓库并…

要求做一个从网页上导入excel

要求做一个从网页上导入excel&#xff0c;&#xff0c;开始着手去实现它。 思路很简单&#xff1a; 1、做一个jsp页面&#xff0c;页面包括浏览文件&#xff0c;提交文件 2、将excel文件上传到服务器 3、 服务器对该excel文件进行读出 4、 将excel文件内容显示到页面上 环境搭…

解决git@github.com: Permission denied (publickey). Could not read from remote repository

原因分析 Permission denied (publickey) 没有权限的publickey &#xff0c;出现这错误一般是以下两种原因 客户端与服务端未生成 ssh key客户端与服务端的ssh key不匹配 找到问题的原因了&#xff0c;解决办法也就有了&#xff0c;重新生成一次ssh key &#xff0c;服务端也…

经典Sql大全--转

一、基础 1、说明&#xff1a;创建数据库CREATE DATABASE database-name2、说明&#xff1a;删除数据库drop database dbname3、说明&#xff1a;备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 开…

springcloud config服务端配置(二)

接着上一篇把把本地仓库yml文件推送到github之后&#xff0c;下面我们就是实战了&#xff0c;各个微服务如何读取到远程仓库的的yml文件配置 一&#xff0c;新建一个Module模块microservicecloud-config-3344 它即为Cloud配置中心模块 二&#xff0c;pom文件添加依赖 <?xm…

电脑很卡~~~~为什么???

问题&#xff1a;最近电脑不知道为什么&#xff0c;只要连接USB下载或是用QQ视频聊天&#xff0c;电脑就很卡&#xff0c;速度超级慢&#xff0c;连千千静听播放的速度都很慢&#xff0c;唱的歌都是断断续续的&#xff01; 用杀毒软件又查不到毒&#xff0c;漏洞全补好了&#…

循环队列CircleQueue的使用

循环队列CircleQueue 的使用 循环队列是实际编写应用中比较重要的一种数据结构&#xff0c;下面介绍在实际项目中用到的循环队列CircleQueue。它是用C编写的&#xff0c;具体源代码见 https://github.com/duankai/CircleQueue template<typenameAnyData> struct DATA_NOD…

C4996    'fopen': This function or variable may be unsafe

C4996 fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 在工程文件处右击&#xff0c;选择属性->配置属性->C/C->预处理器 加入一个_CR…

atmega8 例程:USART串口通信

/***************************************************************** * 函数库说明&#xff1a;ATMEGA8 串口通信 * 版本&#xff1a; v1.0 * 修改&#xff1a; 庞辉 芜湖联大飞思卡尔工作室 …