多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现
效果一览
基本介绍
代码功能
该代码实现了一个多目标粒子群优化算法(MOPSO),用于解决三维路径规划问题(如无人机避障路径规划)。核心功能是通过球坐标系表示路径节点,优化路径的多个目标(如路径长度、安全性等),最终输出Pareto最优解并可视化。
算法步骤
问题定义
加载环境模型(包含地图、起点、终点、障碍物)
设置路径节点数(决策变量)和球坐标系边界(距离r、俯仰角ψ、方位角φ)
初始化粒子群
随机生成粒子位置(球坐标)和速度
转换球坐标为笛卡尔坐标并计算多目标代价
初始化个体最优和全局最优解
MOPSO主循环
a. 粒子更新
从存档中选择全局最优(领导者)
分别更新球坐标三个分量(r, ψ, φ)的速度和位置
边界处理:速度镜像反弹 + 位置截断
b. 评估与变异
将新位置转为笛卡尔坐标并计算代价
自适应变异:以概率pm生成新解,根据支配关系决定是否接受
c. 更新最优解
比较当前解与个体历史最优,按支配关系或50%概率更新
d. 存档管理
添加新的非支配解到外部存档
移除被支配解
网格自适应:划分目标空间并分配解到网格
存档溢出时删除拥挤区域解
结果输出
从最终存档中选择最优解
转换为笛卡尔坐标并绘制3D路径
用场景
无人机/机器人路径规划
在三维环境中避开障碍物,生成安全、高效的路径
优化目标示例:路径长度最小化、远离障碍物、能耗最低
多目标优化问题
适用于任何需同时优化多个冲突目标的场景
如:成本vs时间、精度vs效率等权衡问题
三维空间导航
利用球坐标系自然约束方向变化
适合空中/水下载体的平滑路径生成
算法特点
球坐标表示
用(r, ψ, φ)代替(x,y,z),简化方向控制
约束角度变化范围(±π/4)保证路径平滑性
多目标处理
外部存档保存Pareto前沿
自适应网格管理解的分布密度
基于拥挤度删除存档解(gamma=2偏好稀疏区域)
自适应变异
变异概率随迭代下降:pm = (1-迭代比)^(1/mu)
变异步长由delta控制,增强局部搜索能力
边界处理
位置越界时采用速度镜像反弹(物理合理性)
速度边界基于位置范围动态计算(α=0.5)
程序设计
- 完整程序和数据下载私信博主回复多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现。
clc; close; clear all;
%% 问题定义
model = CreateModel(); % 创建模型(包含地图、起点、终点等参数)
model_name = 6; % 模型编号
nVar=model.n; % 决策变量数量(路径节点数)
VarSize=[1 nVar]; % 决策变量矩阵大小
% 粒子位置边界(球坐标系)
VarMin.x=model.xmin; % x最小值
VarMax.x=model.xmax; % x最大值
VarMin.y=model.ymin; % y最小值
VarMax.y=model.ymax; % y最大值
VarMin.z=model.zmin; % z最小值
VarMax.z=model.zmax; % z最大值
% 球坐标距离r的范围(基于起点-终点距离计算)
VarMax.r=3*norm(model.start-model.end)/nVar;
VarMin.r=VarMax.r/9;
% 俯仰角(elevation)范围
AngleRange = pi/4; % 角度变化范围限制
VarMin.psi=-AngleRange; % 最小俯仰角
VarMax.psi=AngleRange; % 最大俯仰角
% 方位角(azimuth)范围
VarMin.phi=-AngleRange; % 最小方位角
VarMax.phi=AngleRange; % 最大方位角
% 速度边界(基于位置范围计算)
alpha=0.5; % 速度范围系数
VelMax.r=alpha*(VarMax.r-VarMin.r); % 距离r的最大速度
VelMin.r=-VelMax.r; % 距离r的最小速度
VelMax.psi=alpha*(VarMax.psi-VarMin.psi); % 俯仰角的最大速度
VelMin.psi=-VelMax.psi; % 俯仰角的最小速度
VelMax.phi=alpha*(VarMax.phi-VarMin.phi); % 方位角的最大速度
VelMin.phi=-VelMax.phi; % 方位角的最小速度
% 代价函数句柄(多目标)
CostFunction=@(x) MyCost(x,model,VarMin); % 输入笛卡尔坐标,输出多目标代价向量
%% PSO Parameters
% 获取目标函数数量
dummy_output = CostFunction(struct('x', ones(1, model.n), 'y', ones(1, model.n), 'z', ones(1, model.n)));
nObj = numel(dummy_output); % 目标数量
MaxIt = 500; % 最大迭代次数
nPop = 100; % 种群大小
nRep = 50; % 外部存档大小(存储非支配解)
% PSO 参数
w = 1; % 惯性权重
wdamp = 0.98; % 惯性权重衰减率
c1 = 1.5; % 个体学习因子
c2 = 1.5; % 全局学习因子
参考资料
[1] https://blog.csdn.net/kjm13182345320/article/details/128163536?spm=1001.2014.3001.5502
[2] https://blog.csdn.net/kjm13182345320/article/details/128151206?spm=1001.2014.3001.5502