跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
MATLAB / OctaveAI算法

改进A*算法路径规划:Matlab 实现

一种基于 Matlab 实现的改进 A*路径规划算法。主要改进包括将搜索方向从 8 个优化为 5 个,避免斜穿障碍物顶点,通过删除共线节点增加路径平滑度,以及引入比例因子改进评价函数 f(n)=g(n)+(1+r/R)*h(n)。代码展示了地图初始化、路径搜索及平滑处理的具体实现,旨在提升路径规划的效率和安全性。

DotNetGuy发布于 2026/3/26更新于 2026/7/955 浏览
改进A*算法路径规划:Matlab 实现
一、基本思路

先简单回顾一下 A算法的基本原理。A算法是一种启发式搜索算法,主要通过评价函数 ( f(n) = g(n) + h(n) ) 来衡量从起点到目标点的路径代价。其中,( g(n) ) 是从起点到当前节点的实际代价,( h(n) ) 是从当前节点到目标节点的启发式估计代价。

这次改进的核心思想是:

  1. 增加搜索方向:从传统的 8 个方向减少到 5 个方向,优化搜索策略。
  2. 避免斜穿障碍物顶点:确保路径不会穿过障碍物的顶点,避免碰撞。
  3. 删除中间多余节点:减少路径中的转折点,使路径更加平滑。
  4. 改进评价函数:将 ( f(n) = g(n) + h(n) ) 修改为 ( f(n) = g(n) + (1 + r/R) \cdot h(n) ),引入比例因子 ( r/R ) 以平衡路径代价和启发式估计。

接下来,我会逐个分析这些改进点,并展示如何在 Matlab 中实现。

二、具体改进及实现
1. 增加搜索方向

传统的 A*算法允许 8 个移动方向(上、下、左、右、4 个对角线)。但在实际应用中,这种 8 方向的移动可能会导致路径过于曲折。因此,将搜索方向减少到 5 个,具体包括:

  • 4 个正方向(上下左右)
  • 1 个对角线(根据实际需要选择)

在 Matlab 代码中,可以通过定义移动方式的数组来实现:

% 定义 5 个移动方向(上、下、左、右、左上对角)
move_directions = [ ... 
    [-1, 0], % 上 
    [1, 0], % 下 
    [0, -1], % 左 
    [0, 1], % 右 
    [-1,-1] % 左上对角(可调整) 
];
2. 避免斜穿障碍物顶点

为了避免路径斜穿障碍物的顶点,需要在碰撞检测中增加额外的判断。具体来说,当生成一个新的节点时,不仅需要判断当前节点是否在障碍物内部,还需要检查其周围的顶点是否也在障碍物内部。

例如,可以通过以下代码判断某个点是否在障碍物内部:

function isInside = isPointInsideObstacle(x, y, obstacleMap)
    [rows, cols] = size(obstacleMap);
    if x < 1 || x > rows || y < 1 || y > cols
        isInside = false;
    else
        isInside = obstacleMap(x, y) == 1; % 假设障碍物标记为 1
    end
end

在搜索过程中,每次生成新节点时,都会调用上述函数进行判断,避免进入障碍物区域。

3. 删除中间多余节点

为了减少路径中的转折点,可以在路径生成后对节点进行优化。具体方法是删除那些位于直线上的多余节点,只保留关键点。

例如,可以通过以下代码实现路径平滑:

function smoothPath = smoothPath(path)
    smoothPath = path;
    i = 2;
    while i < length(smoothPath)-1
        % 判断当前点是否在前两个点的连线上
        x1 = smoothPath(i-1,1); y1 = smoothPath(i-1,2);
        x2 = smoothPath(i,1); y2 = smoothPath(i,2);
        x3 = smoothPath(i+1,1); y3 = smoothPath(i+1,2);
        if (y2 - y1) * (x3 - x2) == (y3 - y2) * (x2 - x1)
            % 判断共线
            smoothPath(i,:) = [];
            i = max(i-1, 2); % 调整索引
        else
            i = i+1;
        end
    end
end
4. 改进评价函数

传统的 A*算法评价函数为 ( f(n) = g(n) + h(n) )。为了平衡路径代价和启发式估计,将其改进为:

[ f(n) = g(n) + (1 + r/R) \cdot h(n) ]

其中,( r ) 是当前节点到目标节点的剩余距离,( R ) 是整个地图的范围。这个改进可以使得算法在全局搜索和局部优化之间找到更好的平衡。

具体实现如下:

function f = evaluateFunction(g, h, r, R)
    factor = (1 + r/R);
    f = g + factor * h;
end
三、整体实现

现在,我已经将上述改进点逐一实现,下面是一个完整的 Matlab 代码示例:

% 初始化地图和起终点
mapSize = [50, 50];
start = [6, 6];
goal = [45, 45];
obstacleMap = createObstacleMap(mapSize); % 自定义函数生成障碍物地图

% 定义路径规划算法
function [path] = improvedAStar(obstacleMap, start, goal)
    % 初始化优先队列
    openList = [];
    closedList = [];
    
    % 定义 5 个移动方向
    move_directions = [ ... 
        [-1, 0], % 上 
        [1, 0], % 下 
        [0, -1], % 左 
        [0, 1], % 右 
        [-1,-1] % 左上对角 
    ];
    
    % 初始化起点
    start.g = 0;
    start.h = heuristic(start, goal);
    start.f = evaluateFunction(start.g, start.h, 0, max(size(obstacleMap)));
    openList = [openList, start];
    
    while ~isempty(openList)
        % 取出 f 最小的节点
        [~, currentNode] = min(openList(:, 'f'));
        currentNode = openList(currentNode, :);
        
        % 判断是否到达目标点
        if isequal(currentNode, goal)
            path = reconstructPath(closedList, currentNode);
            return;
        end
        
        % 将当前节点加入 closed 列表
        closedList(end+1,:) = currentNode;
        
        % 扩展邻居节点
        for i = 1:size(move_directions, 1)
            neighbor = currentNode + move_directions(i,:);
            
            % 判断邻居是否在障碍物内部
            if isPointInsideObstacle(neighbor(1), neighbor(2), obstacleMap)
                continue;
            end
            
            % 计算 g 值
            neighbor.g = currentNode.g + 1; % 假设每步代价为 1
            
            % 计算 h 值
            neighbor.h = heuristic(neighbor, goal);
            
            % 计算 f 值
            r = norm(goal - neighbor);
            R = max(size(obstacleMap));
            neighbor.f = evaluateFunction(neighbor.g, neighbor.h, r, R);
            
            % 判断邻居是否已经存在
            if ~isMember(neighbor, closedList) && ~isMember(neighbor, openList)
                openList(end+1,:) = neighbor;
            end
        end
    end
    
    % 如果没有找到路径
    path = [];
end

% 启动算法
[path] = improvedAStar(obstacleMap, start, goal);
smoothPath = smoothPath(path);

% 绘制结果
figure;
imshow(obstacleMap, []);
hold on;
plot(start(2), start(1), 'ro', 'MarkerSize', 10);
plot(goal(2), goal(1), 'bo', 'MarkerSize', 10);
plot(path(:,2), path(:,1), 'g-', 'LineWidth', 2);
plot(smoothPath(:,2), smoothPath(:,1), 'y-', 'LineWidth', 2);
legend('障碍物', '起点', '终点', '原始路径', '平滑路径');
四、总结

通过上述改进,路径规划的效果得到了显著提升。尤其是在避免斜穿障碍物和路径平滑方面,改进后的算法表现得更加智能和高效。

目录

  1. 一、基本思路
  2. 二、具体改进及实现
  3. 1. 增加搜索方向
  4. 2. 避免斜穿障碍物顶点
  5. 3. 删除中间多余节点
  6. 4. 改进评价函数
  7. 三、整体实现
  8. 四、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 开发核心概念:Skill、MCP 与 Function Call 详解
  • Z-Image 模型采样器选择建议:不同算法对结果的影响
  • C/C++ 位运算符详解
  • 龙芯内核配置指南及引脚分配方案(适配龙邱库)
  • 中国人民大学《大语言模型》新书及技术路线解析
  • 基于高阶 CBF 的端到端无人机高速丛林穿越与 RL 安全避障
  • 基于 TRAE CN 与 MasterGo MCP 实现设计稿转前端代码实战
  • 弗洛伊德 - 沃舍尔算法 (Floyd-Warshall Algorithm)
  • Vitis AI 模型 FPGA 部署实战指南
  • AI 大模型收费指标 Token 详解
  • Flutter 三方库 bavard 鸿蒙适配:语义化聊天协议与分布式通讯封装
  • 基于 CLIProxyAPI 与 New API 构建统一 AI 中转站实战指南
  • 鸿蒙金融理财全栈项目:安全合规与用户体验优化
  • DFS 算法简介
  • C++ 继承机制全面解析
  • Dify MCP Server 将工作流发布为第三方可调用服务
  • 移植 3D 封面画廊到 Android TV
  • OpenClaw 部署指南:Minimax/DeepSeek 模型与飞书机器人配置
  • VSCode Remote-SSH 远程服务器代理配置错误排查与修复
  • Docker 部署 Redis 并实现公网远程访问

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online