位置: IT常识 - 正文

路径规划 | 图解A*、Dijkstra、GBFS算法的异同(附C++/Python/Matlab仿真)(路径规划是什么意思)

编辑:rootadmin
路径规划 | 图解A*、Dijkstra、GBFS算法的异同(附C++/Python/Matlab仿真) 目录0 专栏介绍1 栅格地图与邻域2 贪婪最佳优先搜索3 Dijkstra算法4 启发式A*搜索5 A*、Dijkstra、GBFS算法的异同6 算法仿真与实现6.1 算法流程6.2 ROS C++实现6.3 Python实现6.4 Matlab实现0 专栏介绍

推荐整理分享路径规划 | 图解A*、Dijkstra、GBFS算法的异同(附C++/Python/Matlab仿真)(路径规划是什么意思),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:路径规划最新算法,路径规划最新算法,路径规划图片,路径规划教程,路径规划的基本流程和方法,路径规划的基本流程和方法,路径规划定义,路径规划是什么意思,内容如对您有帮助,希望把文章链接给更多的朋友!

🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。

🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法


1 栅格地图与邻域

搜索(Search)是指从初始状态(节点)出发寻找一组能达到目标的行动序列(或称问题的解)的过程。

在图搜索中,往往将环境简化为栅格地图(Grid Map),易于刻画固定场景,同时也便于计算机控制系统进行信息处理。所谓栅格就是将连续地图用固定大小正方形方格进行离散化的单位。

在栅格地图中,常见的邻域(neighbor)模式如下所示,即

8邻域24邻域48邻域

栅格的邻域表示了从当前位置出发下一次搜索的集合,例如八邻域法中,当前栅格只能和周围的八个栅格相连形成局部路径。

下面是一个图搜索问题的例子,可以直观理解什么是搜索问题。

例1:在如下的栅格地图中,设绿色栅格为起点,红色栅格为终点,灰色栅格为障碍,白色栅格为可行点,问如何设计一条由栅格组成的连接起点、终点的路径,并尽可能使路径最短?

接下来,围绕这个问题展开阐述。

2 贪婪最佳优先搜索

一个朴素的想法是:每一次搜索时就找那些与终点最近的节点,这里衡量最近可以用多种度量方式——曼哈顿距离、欧式距离等。这种方法像一头狼贪婪地望着食物,迫切寻求最近的路径,因此称为贪婪最佳优先搜索(Greedy Best First Search, GBFS)。

假设采用八邻域法,在GBFS思想指导下,在起点的八邻域中就会选择最右侧的节点,如下所示。

循环地,直到如下所示的节点,因为邻域内有障碍,这些障碍节点不会被候选,所以此时离终点最近的就是下方的方格

依次类推直至终点

3 Dijkstra算法路径规划 | 图解A*、Dijkstra、GBFS算法的异同(附C++/Python/Matlab仿真)(路径规划是什么意思)

Dijkstra算法走向了另一个极端,它完全不考虑扩展节点与终点的关系,而是定义了一个路径耗散函数g(n)g(n)g(n),从起点开始,机器人每走一个栅格就会产生一定的代价或耗散,因为Dijkstra算法希望路径最短,所以每次首选那些使路径耗散最小的节点。

依照Dijkstra算法的观点,从起点开始,其八个邻域节点都会被依次探索,因为它们离起点最近,接着再探索这些节点的子节点。

因此Dijkstra算法会遍历大量的节点,一圈圈地逼近终点

4 启发式A*搜索

A*算法是非常有效且常用的路径规划算法之一,其是结合Dijsktra算法与GBFS各自优势的启发式搜索算法,其搜索代价评估函数为

f(n)=g(n)+h(n)f(n)=g(n)+h(n)f(n)=g(n)+h(n)

其中g(n)g(n)g(n)代表路径耗散,是Dijsktra算法分量;h(n)h(n)h(n)代表下一个搜索节点与终点的距离,启发式地引导机器人朝着终点拓展,是GBFS算法分量。

兼具两个算法特点的A*算法既保持完备性,又在一定条件下体现出最优性,被广泛应用于路径规划中。

5 A*、Dijkstra、GBFS算法的异同

特别地

当g(n)=g\left( n \right) =0g(n)=0时,启发函数影响占据主导,A*算法退化为GBFS算法——完全不考虑状态空间本身的固有属性,不择手段地追求对目标的趋近,此时算法搜索效率将得到提升,但最优性无法保证;当h(n)=h(n)=0h(n)=0时,路径耗散函数影响占据主导,A*算法退化为Dijsktra算法——无先验信息搜索,此时算法搜索效率下降,但最优性上升。

三个算法的直观比较如下所示

6 算法仿真与实现6.1 算法流程

6.2 ROS C++实现

核心代码如下

std::tuple<bool, std::vector<Node>> AStar::plan(const unsigned char* costs, const Node& start, const Node& goal, std::vector<Node> &expand) { // open list std::priority_queue<Node, std::vector<Node>, compare_cost> open_list; open_list.push(start); // closed list std::unordered_set<Node, NodeIdAsHash, compare_coordinates> closed_list; // expand list expand.clear(); expand.push_back(start); // get all possible motions const std::vector<Node> motion = getMotion(); // main loop while (!open_list.empty()) { // pop current node from open list Node current = open_list.top(); open_list.pop(); current.id = this->grid2Index(current.x, current.y); // current node do not exist in closed list if (closed_list.find(current) != closed_list.end()) continue; // goal found if (current==goal) { closed_list.insert(current); return {true, this->_convertClosedListToPath(closed_list, start, goal)}; } // explore neighbor of current node for (const auto& m : motion) { Node new_point = current + m; // current node do not exist in closed list if (closed_list.find(new_point) != closed_list.end()) continue; // explore a new node new_point.id = this->grid2Index(new_point.x, new_point.y); new_point.pid = current.id; // if using dijkstra implementation, do not consider heuristics cost if(!this->is_dijkstra_) new_point.h_cost = std::sqrt(std::pow(new_point.x - goal.x, 2) + std::pow(new_point.y - goal.y, 2)); // if using GBFS implementation, only consider heuristics cost if(this->is_gbfs_) new_point.cost = 0; // goal found if (new_point==goal) { open_list.push(new_point); break; } // bext node hit the boundary or obstacle if (new_point.id < 0 || new_point.id >= this->ns_ || costs[new_point.id] >= this->lethal_cost_ * this->factor_) continue; open_list.push(new_point); expand.push_back(new_point); } closed_list.insert(current); } return {false, {}}; }}

6.3 Python实现

核心代码如下

def plan(self): # OPEN set with priority and CLOSED set OPEN = [] heapq.heappush(OPEN, self.start) CLOSED = [] while OPEN: node = heapq.heappop(OPEN) # exists in CLOSED set if node in CLOSED: continue # goal found if node == self.goal: CLOSED.append(node) return self.extractPath(CLOSED), CLOSED for node_n in self.getNeighbor(node): # exists in CLOSED set if node_n in CLOSED: continue node_n.parent = node.current node_n.h = self.h(node_n, self.goal) # goal found if node_n == self.goal: heapq.heappush(OPEN, node_n) break # update OPEN set heapq.heappush(OPEN, node_n) CLOSED.append(node) return [], []

6.4 Matlab实现

核心代码如下

while ~isempty(OPEN(:, 1)) % pop f = OPEN(:, 3) + OPEN(:, 4); [~, index] = min(f); cur_node = OPEN(index, :); OPEN(index, :) = []; % exists in CLOSED set if loc_list(cur_node, CLOSED, [1, 2]) continue end % goal found if cur_node(1) == goal(1) && cur_node(2) == goal(2) CLOSED = [cur_node; CLOSED]; flag = true; cost = cur_node(3); break end % explore neighbors for i=1:neighbor_num node_n = [cur_node(1) + neighbor(i, 1), ... cur_node(2) + neighbor(i, 2), ... cur_node(3) + neighbor(i, 3), ... 0, cur_node(1), cur_node(2) ]; node_n(4) = h(node_n(1:2), goal); % exists in CLOSED set if loc_list(cur_node, CLOSED, [1, 2]) continue end % obstacle if map(node_n(1), node_n(2)) == 2 continue; end % goal found if cur_node(1) == goal(1) && cur_node(2) == goal(2) CLOSED = [cur_node; CLOSED]; flag = true; cost = cur_node(3); break end % update expand zone expand = [expand; node_n(1:2)]; % update OPEN set OPEN = [OPEN; node_n]; end CLOSED = [cur_node; CLOSED];end


🔥 更多精彩专栏:

《ROS从入门到精通》《Pytorch深度学习实战》《机器学习强基计划》《运动规划实战精讲》…

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

本文链接地址:https://www.jiuchutong.com/zhishi/297662.html 转载请保留说明!

上一篇:vue3 框架学习概念笔记(vue框架总结)

下一篇:前端发起请求,后端响应请求的整个过程(前端发起请求怎么设置)

  • apple pencil一代怎么查看电量(Apple pencil一代怎么连接ipad pro)

    apple pencil一代怎么查看电量(Apple pencil一代怎么连接ipad pro)

  • 腾讯会议离开会议会被发现吗(腾讯会议离开会议主持人会有弹窗吗)

    腾讯会议离开会议会被发现吗(腾讯会议离开会议主持人会有弹窗吗)

  • 笔记本合上是什么状态(笔记本电脑合上盖子处于什么状态怎么设置)

    笔记本合上是什么状态(笔记本电脑合上盖子处于什么状态怎么设置)

  • iphonex喇叭声音变小了(苹果x手机喇叭声音越来越小了怎么解决)

    iphonex喇叭声音变小了(苹果x手机喇叭声音越来越小了怎么解决)

  • 知乎怎么看自己的匿名回答(知乎怎么看自己的浏览记录)

    知乎怎么看自己的匿名回答(知乎怎么看自己的浏览记录)

  • 华为怎么把联系人从黑名单里拉出来(华为怎么把联系人存到sim卡)

    华为怎么把联系人从黑名单里拉出来(华为怎么把联系人存到sim卡)

  • 华为p40按键怎么设置(华为p40按键怎么显示)

    华为p40按键怎么设置(华为p40按键怎么显示)

  • 华为nova7和nova5pro区别(华为nova7和nova5pro充电器一样吗)

    华为nova7和nova5pro区别(华为nova7和nova5pro充电器一样吗)

  • 荣耀10怎么没有录屏(荣耀10怎么没有荣耀分享了)

    荣耀10怎么没有录屏(荣耀10怎么没有荣耀分享了)

  • 天猫精灵可以远程控制吗(天猫精灵可以远程控制空调吗)

    天猫精灵可以远程控制吗(天猫精灵可以远程控制空调吗)

  • 发语音对方忙线中是什么意思(发语音对方忙线是怎么回事)

    发语音对方忙线中是什么意思(发语音对方忙线是怎么回事)

  • 支付宝收款打折怎么取消(支付宝收款打折怎么设置)

    支付宝收款打折怎么取消(支付宝收款打折怎么设置)

  • 怎么在自己的手机上录制视频(怎么在自己的手机查别人的话费)

    怎么在自己的手机上录制视频(怎么在自己的手机查别人的话费)

  • 在excel中单元格地址是指什么(在excel中单元格a1的内容为112单元格b2的内容为593)

    在excel中单元格地址是指什么(在excel中单元格a1的内容为112单元格b2的内容为593)

  • 多媒体计算机中的多媒体是指什么(多媒体计算机中的媒体信息是指?图像)

    多媒体计算机中的多媒体是指什么(多媒体计算机中的媒体信息是指?图像)

  • 苹果d开头的是什么机子(苹果D开头的是什么)

    苹果d开头的是什么机子(苹果D开头的是什么)

  • 手机情景模式怎么设置(手机情景模式怎么关)

    手机情景模式怎么设置(手机情景模式怎么关)

  • 华为定时开关机在哪里设置(华为定时开关机是什么意思)

    华为定时开关机在哪里设置(华为定时开关机是什么意思)

  • 怎么设置微信置顶句子(怎么设置微信置顶折叠)

    怎么设置微信置顶句子(怎么设置微信置顶折叠)

  • tof3d摄像头是什么意思(3d ir摄像头)

    tof3d摄像头是什么意思(3d ir摄像头)

  • 2600x相当于i几(2600x性能相当于i几)

    2600x相当于i几(2600x性能相当于i几)

  • 尾插小板坏了什么现象(尾插小板坏了手机能开机吗)

    尾插小板坏了什么现象(尾插小板坏了手机能开机吗)

  • 小米联网权限设置在哪里(小米联网权限设置)

    小米联网权限设置在哪里(小米联网权限设置)

  • 华为nova3相机设置(华为nova3拍照怎么显示日期时间)

    华为nova3相机设置(华为nova3拍照怎么显示日期时间)

  • 如何将PDF文件转换成WORD(如何将PDF文件转成高清图片)

    如何将PDF文件转换成WORD(如何将PDF文件转成高清图片)

  • flex 布局中子元素设置宽度无效的解决办法(flex布局子元素height100)

    flex 布局中子元素设置宽度无效的解决办法(flex布局子元素height100)

  • 努沙杜瓦海岸与防波堤,印度尼西亚巴厘岛 (© Dkart/Getty Images)(努沙杜瓦酒店)

    努沙杜瓦海岸与防波堤,印度尼西亚巴厘岛 (© Dkart/Getty Images)(努沙杜瓦酒店)

  • 从零开始,三分钟内用Python快速自建一个私有化 ChatGpt 聊天机器人网站(从零开始文章)

    从零开始,三分钟内用Python快速自建一个私有化 ChatGpt 聊天机器人网站(从零开始文章)

  • 增值税小规模纳税人申报表填表说明
  • 委托外单位研发的研发费用加计扣除最新政策
  • 采购砂石料无发票对税务有影响
  • 记账凭证银行利息该怎么记凭证
  • 建筑设备租赁如何确定租赁期限
  • 公允价值下降属于资产吗
  • 年报资产总额是期末余额吗
  • 一般纳税人增值税申报操作流程
  • 销售出库发票会计分录怎么做?
  • 所得税汇算交的所得税怎么做账
  • 税控机减免税额怎么算
  • 待处理财产损益借贷方向
  • 应付未付的款项如何税务处理
  • 公益捐赠税前扣除凭证
  • 发票的单价开得太低了怎么办?
  • 怎么查找使用手机的时间
  • 公司与政府协议
  • 审计报告的二维码扫出来是什么
  • 暂估收入销项税与后期开票不一致
  • 个体户需要对公户吗
  • linux系统查询mac地址命令
  • 资产处置收益的项目有哪些
  • 文件被占用无法删除
  • 实收资本可以大于注册资本吗
  • 至极加速
  • 交易性金融资产是什么意思
  • hbuilderx怎么运行代码
  • php二分查找算法两种方法
  • 企业所得税扣除标准表
  • 预收房屋租金
  • 土增税税
  • 如何利用路由器登陆花生壳
  • YII2.0之Activeform表单组件用法实例
  • laravel 日志配置
  • 存货盘亏的账务处理进项税额转出
  • vue里的for循环
  • php实现有序数组的数据
  • 税务局规定多久开发票
  • 建设单位和施工单位的责任和义务
  • 企业抵扣进项税条件
  • idea快速生成lambda
  • 个人帮公司代持股份
  • 电子缴款凭证在哪里找
  • 增值税退税是否算主营业务收入
  • 买赠销售账务处理
  • 农民农作物补偿标准文件
  • 固定资产报废的变卖收入计入哪个科目
  • 与其他企业联合投资一个项目要怎么做账务处理?
  • 出口发票上的汇票是什么
  • 商业承兑汇票怎么做账
  • 违约金进项税额可否抵扣 分录
  • 建筑劳务公司的会计账务处理
  • 交增值税账务处理
  • 固定资产清理账户借方的核算内容包括
  • 出表的好处
  • 在sql server中触发器不具有什么类型
  • win10周年更新版是什么意思
  • win8蓝屏解决方法
  • win8怎么设置开机启动项
  • windows xp设置屏保密码
  • mac u盘启动盘
  • mac系统不能升级怎么办
  • win10安装不了ie
  • linux和windows的区别?
  • win10怎么这只让任务栏图标居中显示?
  • JAVAscript操作word
  • 使用jquery插件的好处
  • linux基本命令的使用方法
  • linux c程序开发
  • css网站布局实录
  • 基于jquery的框架
  • wordpress开发文档
  • 国家税务总局班子简历
  • 增值税普通电子发票有什么用
  • 税务认证系统如何操作
  • 个人可以免费开店的平台有哪些
  • 辽宁省国家税务局网上申报
  • 当前土地增值税优惠政策
  • 超期未申报还能申报吗
  • 房租是不是先交
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设