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

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

改进A*--Floyd算法路径规划Matlab 可以自己任意选目标点和起点位置, 地图可自己任意更换 1 8个搜索方向变成 5个 提高搜索方向 2 无斜穿障碍物顶点 避免发生碰撞 3 删除中间多余节点,减少转折,增加路径的平滑度 4 评价函数:f(n)=g(n)+h(n) 改为:f(n)=g(n)+(1+r/R)*h(n)。 可修改地图,起始点,目的地点,黑色为栅格障碍物,灰色为搜索空间的遍历节点

最近在学习路径规划算法,特别是A算法和Floyd算法的结合。A算法虽然高效,但在某些场景下还是存在一些可以优化的地方。因此,我决定对A*算法做一些改进,结合Floyd算法来提升路径规划的效果。本文将详细记录这个过程,并且附上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. 删除中间多余节点

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

改进A*--Floyd算法路径规划Matlab 可以自己任意选目标点和起点位置, 地图可自己任意更换 1 8个搜索方向变成 5个 提高搜索方向 2 无斜穿障碍物顶点 避免发生碰撞 3 删除中间多余节点,减少转折,增加路径的平滑度 4 评价函数:f(n)=g(n)+h(n) 改为:f(n)=g(n)+(1+r/R)*h(n)。 可修改地图,起始点,目的地点,黑色为栅格障碍物,灰色为搜索空间的遍历节点

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

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('障碍物', '起点', '终点', '原始路径', '平滑路径');

四、总结

通过上述改进,我发现路径规划的效果得到了显著提升。尤其是在避免斜穿障碍物和路径平滑方面,改进后的算法表现得更加智能和高效。希望这篇文章能够帮助大家更好地理解A*算法的改进方法,同时也欢迎各位读者提出宝贵意见!

Read more

2026 人工智能训练师(四级)国家职业技能等级认定:技术实操全解析

2026 人工智能训练师(四级)国家职业技能等级认定:技术实操全解析

作为一名已通关 HCIA-AI 的学习者,在面对“人工智能训练师”四级考试时,最容易在**“业务规范”和“标注实操”**上丢分。本篇将严格基于《国家职业技能标准》,深度拆解实操考试的三大核心环节。 一、 实操环节总览 实操考试通常在指定的“人工智能训练师考核平台”进行,要求在规定时间内(通常 90-120 分钟)完成从原始数据处理到模型评估的全流程任务。 二、 实操核心模块:数据采集与预处理 考核要点: 考查对原始数据的“去噪”与“标准化”能力。 1. 典型任务:数据清洗 考试会提供一份包含干扰项的原始数据集(如图片、文本或 CSV),要求: * 异常值处理: 识别并剔除模糊、过暗、或类别完全不相关的图像。 * 重复性检查: 使用哈希算法或相似度对比,手动剔除重复条目。 * 格式统一: * 图像:

IntelliJ IDEA配置CodeArts代码智能体,AI助力俄罗斯方块小游戏应用快速开发

IntelliJ IDEA配置CodeArts代码智能体,AI助力俄罗斯方块小游戏应用快速开发

最新案例动态,请查阅IntelliJ IDEA配置CodeArts代码智能体,AI助力俄罗斯方块小游戏应用快速开发。小伙伴们快来进行实操吧! 案例简介:CodeArts代码智能体是基于智能生成、智能问答两大核心能力构建起一套全方位、多层次的智能开发体系。在智能生成方面,它能够依据开发者输入的需求描述,准确且高效地生成高质量代码;智能问答功能则如同开发者身边的专属技术顾问。 一、概述 1. 案例介绍 CodeArts代码智能体是基于智能生成、智能问答两大核心能力构建起一套全方位、多层次的智能开发体系。在智能生成方面,它能够依据开发者输入的需求描述,准确且高效地生成高质量代码;智能问答功能则如同开发者身边的专属技术顾问。 本案例使用IntelliJ IDEA配置CodeArts代码智能体,快速实现俄罗斯方块小游戏开发。 2. 适用对象 * 企业 * 个人开发者 * 高校学生 3. 案例时间 本案例总时长预计60分钟。 4. 案例流程 说明: 1. 开发者安装CodeArts Doer for Coding插件; 2. 登录CodeArts代码智能

技术拆解:P2P组网如何一键远程AI

技术拆解:P2P组网如何一键远程AI

文章目录 * **远程访问AI服务的核心是什么?** * **从暴露服务到连接设备** * **核心组件与交互解析** * **安全架构深度剖析** * **一键安装脚本的技术实现** * **# Windows** * **#macOS** * **#Linux** * **与AI工作流的结合实践** 远程访问AI服务的核心是什么? 你自己在电脑或者服务器上装了AI服务,比如大语言模型、Stable Diffusion这些,但是有个头疼的事儿:外面的人或者你在别的地方,怎么既安全又方便地连上这些本地的服务?以前的办法要么得有公网IP,还得敲一堆命令行用SSH隧道,要么就是直接开端口映射,等于把服务直接晾在公网上,太不安全了。 今天咱们就好好说说一种靠P2P虚拟组网的办法,还拿个叫节点小宝的工具举例子,看看它怎么做到不用改啥东西,点一下就装好,还能建个加密的通道,实现那种“服务藏得好好的,想连就能直接连上”的安全远程访问方式。 从暴露服务到连接设备 核心思路转变在于:不再尝试将内网服务端口暴露到公网(一个危险的攻击面),而是将外部访问设

人工智能(AI)常见面试题及答案汇总(2025最新版)

一、AI基础概念与核心原理 1. 人工智能、机器学习、深度学习的关系? 答案: 三者是包含与被包含的关系,核心聚焦“让机器具备智能”的不同实现层次: * 人工智能(AI):广义是让机器模拟人类智能(如推理、学习、决策)的技术总称,涵盖机器学习、深度学习、专家系统、强化学习等多个分支,目标是解决“智能行为”问题; * 机器学习(ML):AI的核心分支,是实现AI的一种手段,指机器通过数据学习规律(无需显式编程),并利用规律预测或决策。核心是“从数据中自动学习模型”,不依赖手动设计规则(如传统编程); * 深度学习(DL):机器学习的子集,以深度神经网络(DNN) 为核心,通过多层网络结构自动提取数据的层级特征(从底层像素/字符到高层语义),擅长处理海量高维数据(如图像、语音、文本)。 关系图示: