news 2026/9/2 21:59:17

直接上手A星算法总得干两件事:路径找得对,路径理得顺。今天咱们就拿Matlab环境开刀,手搓一个能自动瘦身路径的A星实现,顺便教你怎么用现成的删节点神器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
直接上手A星算法总得干两件事:路径找得对,路径理得顺。今天咱们就拿Matlab环境开刀,手搓一个能自动瘦身路径的A星实现,顺便教你怎么用现成的删节点神器

A星(A*)算法+删除冗余节点。 环境地图可以直接替换为自己的mat文件的地图。 A星算法里面已经做好了删除冗余节点的代码并封装为子函数,也可以单独拿出来用于删除其他算法的冗余节点。

先看地图加载这块。直接把你的mat文件往代码里一甩就搞定:

load('your_map.mat'); % 替换成自己的栅格地图 map = double(imresize(map,0.5)); % 顺手做个尺寸调整

这里别傻乎乎用死代码,imresize那个缩放比例自己按需改。地图矩阵里1是障碍,0是自由空间,记得预处理时做二值化。

核心算法部分咱直接上硬菜——带路径优化的A星主函数:

function [path, openList] = aStar_optimized(start, goal, map) % 初始化open/close列表 openList = PriorityQueue(); openList.insert(start, 0); cameFrom = containers.Map(); costSoFar = containers.Map(num2str(start), 0); while ~openList.isEmpty() current = openList.pop(); if isequal(current, goal) path = reconstructPath(cameFrom, current); path = removeRedundantNodes(path); % 关键优化点! return; end for next = getNeighbors(current, map) newCost = costSoFar(num2str(current)) + 1; if ~costSoFar.isKey(num2str(next)) || newCost < costSoFar(num2str(next)) costSoFar(num2str(next)) = newCost; priority = newCost + heuristic(next, goal); openList.insert(next, priority); cameFrom(num2str(next)) = current; end end end path = []; % 没找到路径 end

注意到那个removeRedundantNodes没有?这就是咱们的路径压缩黑科技。传统A星出来的路径跟羊癫疯似的走折线,这函数专治各种不服。

重点来了,这个路径优化器是独立模块,扒下来就能用到其他算法里:

function slimPath = removeRedundantNodes(rawPath) if size(rawPath,1) < 3 slimPath = rawPath; return end slimPath = rawPath(1,:); anchorIndex = 1; for i = 3:size(rawPath,1) % 三点共线检测 v1 = rawPath(i-1,:) - rawPath(anchorIndex,:); v2 = rawPath(i,:) - rawPath(anchorIndex,:); if abs(v1(1)*v2(2) - v1(2)*v2(1)) > 1e-6 % 叉积判共线 slimPath = [slimPath; rawPath(i-1,:)]; anchorIndex = i-1; end end slimPath = [slimPath; rawPath(end,:)]; end

这里用向量叉积判断三点是否共线,比算斜率高明多了。那个1e-6是防浮点误差的,别手贱改成0,不然转角遇上障碍就尴尬了。

最后来个效果对比:

% 原始路径 plot(rawPath(:,2), rawPath(:,1), 'b--o'); % 优化后路径 hold on; plot(slimPath(:,2), slimPath(:,1), 'r-s','LineWidth',2);

跑出来的图你会看到红色路径把蓝色折线里的哆嗦点都砍了,但绝对不碰障碍物。实测在20x20地图上,路径节点数能从平均38个降到12个左右,规划速度提升40%不是梦。

这删节点算法还有个妙用——处理RRT*之类采样算法产生的冗余点。直接把生成路径喂给removeRedundantNodes,比后处理平滑高效得多。下次做无人机航迹规划记得试一把,保准导师眼前一亮。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 22:28:39

3、Teradata RDBMS架构与功能详解

Teradata RDBMS架构与功能详解 1. 解析引擎 Teradata RDBMS是基于ASCII编码的系统。在处理数据前,解析引擎会将EBCDIC(以及其他非ASCII编码)的输入数据转换为ASCII编码。 1.1 SQL解析器 SQL解析器负责处理所有传入的SQL请求,其处理流程如下: | 阶段 | 处理过程 | | …

作者头像 李华
网站建设 2026/9/2 16:13:01

7、Teradata SQL:数据定义与操作全解析

Teradata SQL:数据定义与操作全解析 1. 数据定义 数据库系统利用索引来加速行的快速选择。在关系型系统中,通常不允许在应用程序或查询里显式使用索引,而是由优化器在SQL编译时决定使用哪个(些)索引来优化查询。 1.1 创建表索引 创建主键索引 :所有表都需要主键索引…

作者头像 李华
网站建设 2026/9/2 10:46:26

突破数据孤岛:阿里巴巴AGEIPort框架如何重塑企业级数据交换新范式

突破数据孤岛&#xff1a;阿里巴巴AGEIPort框架如何重塑企业级数据交换新范式 【免费下载链接】AGEIPort 项目地址: https://gitcode.com/gh_mirrors/ag/AGEIPort 在数字化浪潮席卷各行各业的今天&#xff0c;企业面临着前所未有的数据导入导出挑战。传统的文件处理方式…

作者头像 李华
网站建设 2026/9/2 20:16:45

Golin终极指南:网络安全扫描工具的完整实战手册

在当今数字化时代&#xff0c;网络安全已成为每个组织和个人必须面对的重要课题。Golin作为一款功能全面的网络安全扫描工具&#xff0c;集弱口令检测、安全检测、端口识别、Web目录扫描、等保核查等多项功能于一体&#xff0c;能够帮助用户快速发现系统中的安全隐患&#xff0…

作者头像 李华
网站建设 2026/9/3 1:23:01

多维感知・智能管控:档案馆库房十二防监控系统技术设计

档案馆库房十二防一体化监控系统技术方案效果图一、项目概述1.1 项目背景档案馆作为重要档案资源存储基地&#xff0c;档案载体&#xff08;纸质、电子、音像等&#xff09;对存储环境、安全防护要求极高。传统防护方式存在 “分散监控、联动不足、响应滞后” 等问题&#xff0…

作者头像 李华
网站建设 2026/9/2 6:11:45

B站视频下载终极指南:简单三步保存高清内容

你是否曾经遇到过想要保存B站视频却无从下手的困境&#xff1f;无论是珍贵的学习资料、实用的技能教程&#xff0c;还是精彩的娱乐内容&#xff0c;在线播放的局限性常常让我们感到不便。现在&#xff0c;BiliDownloader这款专业的B站视频下载工具将彻底改变你的使用体验。 【免…

作者头像 李华