【SQO三维路径规划】蜘蛛蜂算法SWO复杂山地环境下无人机三维路径规划【含Matlab源码 3576期】

✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
🍎个人主页:海神之光
🏆代码获取方式:
海神之光Matlab王者学习之路—代码获取方式
⛳️座右铭:行百里者,半于九十。

更多Matlab仿真内容点击👇
Matlab图像处理(进阶版)
路径规划(Matlab)
神经网络预测与分类(Matlab)
优化求解(Matlab)
语音处理(Matlab)
信号处理(Matlab)
车间调度(Matlab)

⛄一、蜘蛛蜂算法无人机避障三维航迹规划简介

1 无人机航迹规划问题的数学模型
建立三维航迹规划问题的数学模型时, 不但考虑无人机基本约束, 还考虑复杂的飞行环境, 包括山体地形和雷暴威胁区。

1.1 无人机基本约束
规划的无人机三维航迹, 通常需要满足一些基本约束, 包括最大转弯角、最大爬升角或下滑角、最小航迹段长度、最低和最高飞行高度, 以及最大航迹长度等约束。其中, 最大转弯角约束, 是指无人机只能在水平面内小于或等于指定的最大转弯角内转弯;最大爬升角或下滑角约束, 是指无人机只能在垂直平面内小于或等于指定的最大爬升角或下滑角内爬升或下滑;最小航迹段长度约束, 要求无人机改变飞行姿态之前, 按目前的航迹方向飞行的最短航程;最低和最高飞行高度约束, 要求无人机在指定的飞行高度区间飞行;最大航迹长度约束, 是指无人机的航迹长度小于或等于指定的阈值。

记q (x, y, z, θ, ψ) 为无人机的飞行位置与姿态, 其中, (x, y, z) 为无人机的位置, θ为无人机的水平转弯角, ψ为无人机的竖直爬升角或下滑角, 进而建立上述基本约束的数学表达式。

1.2 飞行环境障碍物和威胁区建模
在飞行环境中, 高耸的山体近似采用圆锥体等效表示, 用以e为底的自然指数图形生成, 那么, 山体地形可以通过多个位置不同的圆锥体叠加而成。若将参考海拔基准高度设置为xOy平面, 记 (x, y, z) 为山体地形中的点, 那么
在这里插入图片描述
式中:N为山体个数;xk0和yk0为第k座山体中心对称轴的横坐标和纵坐标;hk为第k座山体的最大高度;xki和yki为第k座山体的横向斜度和纵向斜度。

在飞行环境中, 山体附近通常存在雷暴等极端气象, 本文视为飞行威胁区, 并通过球体近似等效表示, 且记第k座山体附近飞行威胁区的球心坐标为 (xks0, yks0, zks0) , 半径为rk。

1.3 目标函数及航迹表示
在本文中, 执行任务的某型无人机, 其航迹规划的目标函数是生成一条由起始点到目标点的无碰撞可行航迹。采用q (x, y, z, θ, ψ) 表示无人机在飞行空域中某特定位置的特定姿态, 那么 (x, y, z) 则表示无人机所在航迹点, θ表示无人机的水平转弯角, ψ表示无人机的竖直爬升角或下滑角。采用r (q) 表示由起始点qinitial到目标点qgoal的无碰撞可行航迹, 那么航迹规划的过程可以写成如下形式:
在这里插入图片描述

2 蜘蛛蜂算法
群居生物的觅食行为一直是优化算法研究的热点问题。蜘蛛猴优化(Spider Monkey Optimization,SMO)是一种全局优化算法,灵感来自于蜘蛛猴在觅食过程中的裂变融合社会(Fission-Fusion social,FFS)结构。SMO巧妙地描述了群体智能的两个基本概念:自组织和分工。SMO作为一种基于群体智能的算法,近年来得到了广泛的应用,并被应用于许多工程优化问题中。这一部分详细介绍了蜘蛛猴优化算法。为了更好地理解SMO过程的工作原理,给出了一个SMO过程的数例。
蜘蛛猴优化(SMO)算法是近年来出现的一种基于群体智能的优化算法[1, 2],更新方程是基于可能解之间的欧氏距离,该算法已广泛应用于求解复杂的优化问题。在[3]中,Dhar和Arora应用蜘蛛猴优化算法(SMO)设计和优化了一个模糊规则库;Sharma等人[4]将SMO应用于IEEE-14、30和33测试总线系统中,在适当分配3和5个电容器的情况下,解决最优电容器配置和尺寸问题;Wu等人[5]将SMO用于稀疏线性阵列的合成。利用SMO算法对扩展稀疏子阵中所有元素的幅值和位置进行优化,从而在一组实际约束条件下降低整个阵列的旁瓣电平;Cheruku等人设计了用于糖尿病数据规则挖掘任务的SM-RuleMiner[6]。SMO还被用于合成线性天线阵的阵列因子,并为无线应用优化设计了一种E形贴片天线[7]。

下面将详细介绍蜘蛛猴优化算法的动机和工作原理。

2.1 动机
2.1.1 裂变融合社会结构的出现

裂变融合社会的概念是生物学家“汉斯·库默”在解释最复杂的哺乳动物阿拉伯狒狒的社会组织时提出的。由于季节变化导致食物短缺时,母系群体成员之间的食物竞争导致分裂成许多群体,然后融合成一个单一的群体。当食物供应充足时,群体是最大的,而在最小的群体中,食物短缺处于顶峰。裂变部分表现了蜘蛛猴的觅食行为,融合是将较小的群体组合成较大的群体。

2.1.2 蜘蛛猴的觅食行为
蜘蛛猴生活在中美洲和南美洲的热带雨林中,北至墨西哥[8]。蜘蛛猴是世界最聪明的猴子之一。它们被称为蜘蛛猴,因为当它们通过尾巴挂起来的时候看起来像蜘蛛[9]。蜘蛛猴总是喜欢生活在一个称为父群的单元组中。根据食物的稀缺性或充足性,它们会自动拆分或合并。它们之间通过手势、姿势和叫声进行交流。群体组成(Group composition)是这个结构中的一个动态属性。

2.1.3 社会组织与行为
蜘蛛猴的社会组织和行为可以通过以下事实来理解:

蜘蛛猴生活在一个大约40-50只个体的群体中;这个群落里的所有个体在白天时都以小组的形式朝不同的方向觅食,晚上每个个体都在自己的栖息地分享觅食的经验。领头的母蜘蛛猴决定觅食路线;如果领头没有找到足够的食物,她就把小组分成更小的小组,这些小组分别觅食;社会中的个体可能不会因为彼此之间的相互宽容而在一个地方被注意到。当他们接触时,他们的手势反映出他们实际上是一个大群体的一部分。

2.1.4 交流
蜘蛛猴通过位置和姿势分享它们的意图和观察结果。在很远的距离,它们通过特定的声音相互交流,如大叫或鸣叫。每只猴子都有自己可辨别的声音,其他小组成员可以通过这些声音辨别出那只猴子。

4.1.2 蜘蛛猴优化过程
SMO是一种元启发式技术,灵感来自于蜘蛛猴的智能觅食行为。蜘蛛猴的觅食行为是基于分裂融合的社会结构。该算法的特点依赖于一个群体的社会组织,在这个群体中,女性领导者决定是分裂还是合并。整个团队的领导者在这里被命名为全局领导者,而小组织的领导者被称为为局部领导者。参考SMO算法,食物短缺现象被定义为解不再改善。由于SMO是一种基于群体智能的算法,所以每个小群体都应该有一个最小数量的猴子。因此,在任何时候,如果进一步的裂变产生了至少一组少于最小数量的猴子,我们将其定义为融合时间。在SMO算法中,蜘蛛猴(SMO)表示一个可选解。SMO由六个阶段组成:局部领导者阶段、全局领导者阶段、局部领导者学习阶段、全局领导者学习阶段、局部领导者决策阶段和全局领导者决策阶段。

⛄二、部分源代码

close all
clear
clc
addpath(‘./Algorithm/’)%添加算法路径
warning off;
%% 三维路径规划模型定义
global startPos goalPos N
N=2;%待优化点的个数(可以修改)
startPos = [10, 10, 80]; %起点(可以修改)
goalPos = [80, 90, 150]; %终点(可以修改)
SearchAgents_no=30; % 种群大小(可以修改)
Function_name=‘F2’; %F1:随机产生地图 F2:导入固定地图
Max_iteration=100; %最大迭代次数(可以修改)
% Load details of the selected benchmark function
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
[Best_score,Best_pos,curve]=SWO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);%算法优化求解
AlgorithmName=‘SWO’;%算法名字
figure
plot(curve,‘Color’,‘r’,‘linewidth’,2)
xlabel(‘迭代次数’);
ylabel(‘飞行路径长度’);
legend(AlgorithmName)
display(['算法得到的最优适应度: ‘, num2str(Best_score)]);
Position=[Best_pos(1:dim/3); Best_pos(1+dim/3:2*(dim/3)); Best_pos(1+(2*dim/3):end)]’; %优化点的XYZ坐标(每一行是一个点)
plotFigure(Best_pos,AlgorithmName)%画最优路径

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]田疆,李二超.用于无人机三维航迹规划改进连接型快速扩展随机树算法[J].航空工程进展. 2018,9(04)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C#实现的SQO算法求解不等式约束二次规划的程序示例,包了输入、求解以及输出部分: ```csharp using System; namespace SQOAlgorithm { class Program { static void Main(string[] args) { // 输入不等式约束二次规划的参数 int n = 3; // 变量个数 double[,] Q = { { 2, 0, 0 }, { 0, 3, 0 }, { 0, 0, 4 } }; // 二次项系数矩阵 double[] c = { -2, -3, -4 }; // 一次项系数向量 double[,] A = { { 1, 1, 0 }, { 1, 0, 1 }, { 0, 1, 1 } }; // 不等式约束系数矩阵 double[] b = { 1, 1, 1 }; // 不等式约束右端向量 // 求解不等式约束二次规划 double[] x = SQO(Q, c, A, b); // 输出最优解 Console.Write("最优解为:("); for (int i = 0; i < n - 1; i++) { Console.Write("{0:f4}, ", x[i]); } Console.Write("{0:f4})", x[n - 1]); Console.ReadLine(); } // SQO算法求解不等式约束二次规划 static double[] SQO(double[,] Q, double[] c, double[,] A, double[] b) { int n = c.Length; // 变量个数 int m = b.Length; // 不等式约束个数 int maxIter = 100; // 最大迭代次数 double eps = 1e-6; // 精度要求 // 初始化SQP算法的参数 double[] x = new double[n]; // 初始解 double[] lam = new double[m]; // 不等式约束的拉格朗日乘子 double mu = 1; // 步长 double rho = 0.5; // 步长缩放因子 double tau = 0.1; // 步长缩放因子 double sigma = 0.1; // 控制停止迭代的松弛因子 double[] S = new double[m]; // S向量 double[] grad = new double[n]; // 梯度向量 double[,] H = new double[n, n]; // Hessian矩阵 // 迭代优化过程 for (int k = 0; k < maxIter; k++) { // 计算Hessian矩阵和梯度向量 for (int i = 0; i < n; i++) { grad[i] = c[i]; for (int j = 0; j < n; j++) { grad[i] += Q[i, j] * x[j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { H[i, j] = Q[i, j]; } } // 计算S向量 for (int i = 0; i < m; i++) { S[i] = 0; for (int j = 0; j < n; j++) { S[i] += A[i, j] * x[j]; } S[i] -= b[i]; } // 计算停止迭代的判据 double stop = 0; for (int i = 0; i < m; i++) { stop += Math.Max(0, S[i]) * Math.Max(lam[i], 0); } stop += sigma * Math.Abs(stop); // 如果停止迭代的判据小于精度要求,则停止迭代 if (stop < eps) { break; } // 更新拉格朗日乘子 for (int i = 0; i < m; i++) { if (S[i] > 0) { lam[i] += mu * S[i]; } } // 更新x的值 double[,] QL = new double[n, n]; double[] cL = new double[n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { QL[i, j] = H[i, j]; } cL[i] = grad[i]; for (int j = 0; j < m; j++) { if (lam[j] > 0) { QL[i, i] += lam[j] * A[j, i] * A[j, i]; cL[i] += lam[j] * A[j, i] * S[j]; } } } double[] dx = QPSolver(QL, cL, A, b); // 计算步长 double alpha = 1; for (int i = 0; i < n; i++) { if (dx[i] < 0) { alpha = Math.Min(alpha, -x[i] / dx[i]); } } for (int i = 0; i < m; i++) { if (S[i] < 0) { alpha = Math.Min(alpha, -lam[i] / (S[i] - tau * lam[i])); } } // 更新x和mu的值 for (int i = 0; i < n; i++) { x[i] += alpha * dx[i]; } for (int i = 0; i < m; i++) { if (S[i] > 0) { lam[i] += alpha * mu * S[i]; } } mu *= rho; } return x; } // 二次规划求解器 static double[] QPSolver(double[,] Q, double[] c, double[,] A, double[] b) { int n = c.Length; // 变量个数 int m = b.Length; // 不等式约束个数 // 构造KKT矩阵 double[,] KKT = new double[n + m, n + m]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { KKT[i, j] = Q[i, j]; } KKT[i, i] += 1e-8; for (int j = 0; j < m; j++) { KKT[i, n + j] = A[j, i]; KKT[n + j, i] = A[j, i]; } } for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { KKT[n + i, n + j] = (i == j) ? 1e-8 : 0; } } // 构造右端向量 double[] rhs = new double[n + m]; for (int i = 0; i < n; i++) { rhs[i] = -c[i]; } for (int i = 0; i < m; i++) { rhs[n + i] = b[i]; } // 调用线性规划求解器求解KKT矩阵 double[] sol = LinearProgramming(KKT, rhs); // 返回x的值 double[] x = new double[n]; for (int i = 0; i < n; i++) { x[i] = sol[i]; } return x; } // 线性规划求解器 static double[] LinearProgramming(double[,] A, double[] b) { int m = b.Length; // 约束个数 int n = A.GetLength(1); // 变量个数 // 初始化单纯形表 double[,] simplexTable = new double[m + 1, n + m + 1]; for (int j = 0; j < n; j++) { simplexTable[0, j] = 0; for (int i = 0; i < m; i++) { simplexTable[i + 1, j] = A[i, j]; } } for (int i = 0; i < m; i++) { simplexTable[i + 1, n + i] = 1; } simplexTable[0, n] = -1; // 执行单纯形算法 while (true) { // 找到入基变量 int pivotCol = -1; for (int j = 0; j <= n + m; j++) { if (simplexTable[0, j] < 0) { pivotCol = j; break; } } if (pivotCol == -1) { break; // 单纯形算法结束 } // 找到出基变量 int pivotRow = -1; double minRatio = double.MaxValue; for (int i = 1; i <= m; i++) { if (simplexTable[i, pivotCol] > 0) { double ratio = simplexTable[i, n + m] / simplexTable[i, pivotCol]; if (ratio < minRatio) { minRatio = ratio; pivotRow = i; } } } if (pivotRow == -1) { throw new Exception("无界解"); // 问题无界 } // 进行行变换 double pivotValue = simplexTable[pivotRow, pivotCol]; for (int j = 0; j <= n + m; j++) { simplexTable[pivotRow, j] /= pivotValue; } for (int i = 0; i <= m; i++) { if (i != pivotRow) { double factor = simplexTable[i, pivotCol]; for (int j = 0; j <= n + m; j++) { simplexTable[i, j] -= factor * simplexTable[pivotRow, j]; } } } } // 构造解向量 double[] sol = new double[n]; for (int j = 0; j < n; j++) { int pivotRow = -1; for (int i = 1; i <= m; i++) { if (simplexTable[i, j] == 1) { if (pivotRow == -1) { pivotRow = i; } else { throw new Exception("多解"); // 问题有多个解 } } else if (simplexTable[i, j] != 0) { throw new Exception("无解"); // 问题无解 } } if (pivotRow != -1) { sol[j] = simplexTable[pivotRow, n + m]; } } return sol; } } } ``` 程序的输入部分为二次规划的参数,包括变量个数`n`、二次项系数矩阵`Q`、一次项系数向量`c`、不等式约束系数矩阵`A`和不等式约束右端向量`b`。程序的求解部分为SQO算法,包了迭代优化过程、梯度和Hessian矩阵的计算、S向量的计算、停止迭代的判据的计算、拉格朗日乘子的更新、x向量的更新、步长的计算等步骤。程序的输出部分为最优解。 需要注意的是,程序中的QPSolver函数是一个二次规划求解器,采用了线性规划求解器来求解KKT矩阵。由于线性规划问题的求解是一个NP-hard问题,因此程序可能会在某些情况下运行时间较长,甚至可能无法求解。在实际应用中,可以考虑使用更加高效的二次规划求解器来优化程序的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值