【PSO三维路径规划】基于matlab粒子群算法融合鸡群算法多无人机三维路径规划【含Matlab源码 1792期】
一、无人机简介
无人机的航迹规划是指在综合考虑无人机飞行油耗、威胁、飞行区域以及自身物理条件限制等因素的前提下, 为飞行器在飞行区域内规划出从初始点到目标点最优或者满意的飞行航迹, 其本质是一个多约束的目标优化问题。航迹规划算法是航迹规划的核心。国内外相继开展了相关研究, 提出了许多航迹规划算法, 如模拟退火算法、人工势场法、遗传算法、蚁群算法等。但由于无人机面临的规划空间异常复杂、规划约束条件多且模糊性大, 航迹搜索算法存在寻优能力差、计算量过大、效率不高等问题, 在航迹规划的最优性和实时性方面有待进一步提高。
1 鸡群优化算法流程
CSO算法的具体流程步骤:
步骤1:初始化种群规模N,并设置空间维数D,最大迭代次数T,NR,NH,
NC和NM等参数。
步骤2:计算个体的适应度值,将迭代次数置0,t=0。
步骤3:判断Mod(t, G) 是否为0。若是, 则根据个体适应度值将鸡群中的个
体重新排序,并重新划分等级制度;若不是,直接跳转步骤4。
步骤4:将整个鸡群分组,确定组内的跟随关系和母子关系。
步骤5:按照公式迭代更新公鸡,母鸡和小鸡的位置。
步骤6:计算个体的适应度值,并且更新个体最优和全局最优。
步骤7:置迭代次数t=t+1,若满足迭代停止条件,则转步骤8,否则,转到
步骤3。
步骤8:结束,输出全局最优值。
鸡群算法流程图如图3.1所示。
2 改进鸡群算法流程
改进鸡群算法流程图如图3.2所示。改进CSO算法的具体流程步骤如下:
步骤1:初始化种群规模N,并设置空间维数D,最大迭代次数T,NR,NH,
NC和NM等相关参数。
步骤2:计算个体的适应度值,将迭代次数置0,t=0。
步骤3:判断Mod(t, G) 是否为0。若是, 则根据个体适应度值将鸡群中的个
体重新排序,并重新划分等级制度;若不是,直接跳转步骤4。
步骤4:将整个鸡群分组,确定组内的跟随关系和母子关系。
步骤5:计算动态权值a’,锁定因子['。
步骤6:按照公式迭代更新公鸡,母鸡和小鸡的位置。
步骤7:计算个体的适应度值,并且更新个体最优和全局最优。
步骤8:置迭代次数t=t+1,若满足迭代停止条件,则转步骤8,否则,转到
步骤3。
步骤9:结束,输出全局最优值。
三、部分源代码
clc,clear , close all
feature jit off
%% 模型基本参数
% 载入地形 矩阵
filename = 'TestData1.xlsx' ;
model.x_data = xlsread( filename , 'Xi') ;
model.y_data = xlsread(filename, 'Yi') ;
model.z_data = xlsread( filename , 'Zi') ;
model.x_grid = model.x_data(1,:) ;
model.y_grid =model.y_data(:, 1) ;
model.xs = 10 ; %起点 相关信息
model.ys = 90 ;
model.zs = interp2( model.x_data , model.y_data, model.z_data , ...
model.xs , model.ys ,'linear' ) ; % 高度为插值得到
model.xt = 130 ; % 终点 相关信息
model.yt = 10 ;
model.zt = interp2( model.x_data , model.y_data, model.z_data , ...
model.xt , model.yt , 'linear'); % 高度为插值得到
model.n= 5 ; % 粗略导航点设置
model.nn= 80 ; % 插值法获得的导航点总数
model.Safeh = 0.01 ; % 与障碍物的最低飞行高度
% 导航点 边界值
model.xmin= min( model.x_data( : ) ) ;
model.xmax= max ( model.x_data( : ) ) ;
model.ymin= min( model.y_data( : ) ) ;
model.ymax= max( model.y_data( : ) ) ;
model.zmin= min( model.z_data( : ) ) ;
model.zmax =model.zmin + (1+ 0.1)*( max( model.z_data(:) )-model.zmin ) ;
% 模型的其他参数
model.nVar = 3*model.n ; % 编码长度
model.pf = 10^7 ; % 惩罚系数
% 障碍物 位置坐标及半径
model.Barrier = [10,60 , 8 ;
40, 50,6
60, 50 , 5
100, 30, 8 ] ;
model.Num_Barrier = size(model.Barrier , 1 ); % 障碍物的数目
model.weight1 = 0.5; % 权重1 飞行线路长度权重
model.weight2 = 0.3; % 权重2 飞行最低高度相关权重
model.weight3 = 0.2; % 权重3 最大攻角约束 权重
function PlotSolution(BestSol ,model)
%% 绘图函数
%% 模型基本参数
% 载入地形 矩阵
filename = 'TestData1.xlsx' ;
model.x_data = xlsread( filename , 'Xi') ;
model.y_data = xlsread(filename, 'Yi') ;
model.z_data = xlsread( filename , 'Zi') ;
model.x_grid = model.x_data(1,:) ;
model.y_grid =model.y_data(:, 1) ;
model.xs = 10 ; %起点 相关信息
model.ys = 90 ;
model.zs = interp2( model.x_data , model.y_data, model.z_data , ...
model.xs , model.ys ,'linear' ) ; % 高度为插值得到
model.n= 5 ; % 粗略导航点设置
model.nn= 80 ; % 插值法获得的导航点总数
model.Safeh = 0.01 ; % 与障碍物的最低飞行高度
% 导航点 边界值
model.xmin= min( model.x_data( : ) ) ;
model.xmax= max ( model.x_data( : ) ) ;
model.ymin= min( model.y_data( : ) ) ;
model.ymax= max( model.y_data( : ) ) ;
model.zmin= min( model.z_data( : ) ) ;
model.zmax =model.zmin + (1+ 0.1)*( max( model.z_data(:) )-model.zmin ) ;
figure(1);%subplot(2,2,1)
mesh( model.x_data , model.y_data , model.z_data ); hold on
colorbar; box on ,
set(gcf,'Color',[1 1 1]);
% set(gcf, 'unit' , 'centimeters','position' , [2 2 30 15]);
h3= plot3( BestSol.Sol.xx , BestSol.Sol.yy , BestSol.Sol.zz , '-r'); hold on
% temp = 10^-2 ;
h1 = plot3( model.xs, model.ys, model.zs, 'o' , 'MarkerEdgeColor','r', ...
'MarkerFaceColor','r'); hold on
h2 = plot3( model.xt , model.yt , model.zt, '^' , 'MarkerEdgeColor','r', ...
'MarkerFaceColor','r'); hold on
if isfield( model ,'Barrier')
for ind = 1: model.Num_Barrier
[X,Y,Z] = cylinder( model.Barrier(ind, 3) ,100);
h4= surf(X+model.Barrier(ind, 1),Y+model.Barrier(ind, 2), model.zmin+Z*( max(model.z_data(:))- model.zmin) ) ; hold on
set(h4, 'edgecolor','m','facecolor', 'm') ;
end
end
if ~isfield( model ,'Barrier')
legend( [ h1 , h2 , h3] , '起点' , '终点' , '线路', 'Location','southoutside' , 'Orientation','horizontal')
else
legend( [ h1 , h2 , h3 h4] , '起点' , '终点' , '线路' , '无法通行区域' , 'Location','southoutside', 'Orientation','horizontal')
end
xlabel('x / km','fontsize',10 ,'fontname','Times new roman');
ylabel('y / km','fontsize',10 ,'fontname','Times new roman');
zlabel('z / km','fontsize',10 ,'fontname','Times new roman');
set(gca, 'xlim' , [ model.xmin model.xmax]) ;
set(gca, 'ylim' , [ model.ymin model.ymax]) ;
axis tight
axis normal
hold on
set(gca, 'cameraposition', [-337 , 0 , 14.2])
%%
figure(2);%subplot(2,2,2)
mesh( model.x_data , model.y_data , model.z_data ); hold on
view(2)
% contour( model.x_data , model.y_data , model.z_data ); hold on
colorbar; box on ,
set(gcf,'Color',[1 1 1]);
% set(gcf, 'unit' , 'centimeters','position' , [2 2 30 15]);
h3= plot3( BestSol.Sol.xx , BestSol.Sol.yy , BestSol.Sol.zz , '-r'); hold on
% temp = 10^-2 ;
h1 = plot3( model.xs, model.ys, model.zs, 'o' , 'MarkerEdgeColor','b', ...
'MarkerFaceColor','b'); hold on
h2 = plot3( model.xt , model.yt , model.zt, '^' , 'MarkerEdgeColor','g', ...
'MarkerFaceColor','g'); hold on
% legend( [ h1 , h2 , h3] , '起点' , '终点' , '线路', 'Location','southoutside' , 'Orientation','horizontal')
if isfield( model ,'Barrier')
for ind = 1: model.Num_Barrier
[X,Y,Z] = cylinder( model.Barrier(ind, 3) ,100);
h4= surf(X+model.Barrier(ind, 1),Y+model.Barrier(ind, 2), model.zmin+Z*( max(model.z_data(:))- model.zmin) ) ; hold on
set(h4, 'edgecolor','m','facecolor', 'm') ;
end
end
if ~isfield( model ,'Barrier')
legend( [ h1 , h2 , h3] , '起点' , '终点' , '线路', 'Location','southoutside' , 'Orientation','horizontal')
else
legend( [ h1 , h2 , h3 h4] , '起点' , '终点' , '线路' , '无法通行区域' , 'Location','southoutside', 'Orientation','horizontal')
end
xlabel('x / km','fontsize',10 ,'fontname','Times new roman');
ylabel('y / km','fontsize',10 ,'fontname','Times new roman');
zlabel('z / km','fontsize',10 ,'fontname','Times new roman');
set(gca, 'xlim' , [ model.xmin model.xmax]) ;
set(gca, 'ylim' , [ model.ymin model.ymax]) ;
axis tight
axis normal
hold off
hold on
%%
figure(3);%subplot(2,2,3)
% mesh( model.x_data , model.y_data , model.z_data ); hold on
% view(2)
contour( model.x_data , model.y_data , model.z_data ); hold on
colorbar; box on ,
set(gcf,'Color',[1 1 1]);
% set(gcf, 'unit' , 'centimeters','position' , [2 2 30 15]);
h3= plot3( BestSol.Sol.xx , BestSol.Sol.yy , BestSol.Sol.zz , '-r'); hold on
% temp = 10^-2 ;
h1 = plot3( model.xs, model.ys, model.zs, 'o' , 'MarkerEdgeColor','b', ...
'MarkerFaceColor','b'); hold on
h2 = plot3( model.xt , model.yt , model.zt, '^' , 'MarkerEdgeColor','g', ...
'MarkerFaceColor','g'); hold on
% legend( [ h1 , h2 , h3] , '起点' , '终点' , '线路', 'Location','southoutside' , 'Orientation','horizontal')
if isfield( model ,'Barrier')
for ind = 1: model.Num_Barrier
[X,Y,Z] = cylinder( model.Barrier(ind, 3) ,100);
h4= surf(X+model.Barrier(ind, 1),Y+model.Barrier(ind, 2), model.zmin+Z*( max(model.z_data(:))- model.zmin) ) ; hold on
set(h4, 'edgecolor','m','facecolor', 'm') ;
end
end
if ~isfield( model ,'Barrier')
legend( [ h1 , h2 , h3] , '起点' , '终点' , '线路', 'Location','southoutside' , 'Orientation','horizontal')
else
legend( [ h1 , h2 , h3 h4] , '起点' , '终点' , '线路' , '无法通行区域' , 'Location','southoutside', 'Orientation','horizontal')
end
xlabel('x / km','fontsize',10 ,'fontname','Times new roman');
ylabel('y / km','fontsize',10 ,'fontname','Times new roman');
zlabel('z / km','fontsize',10 ,'fontname','Times new roman');
set(gca, 'xlim' , [ model.xmin model.xmax]) ;
set(gca, 'ylim' , [ model.ymin model.ymax]) ;
axis tight
axis normal
hold off
hold on
%% 收敛曲线
figure(4);%subplot(2,2,4)
% semilogy( BestSol.BestCost ,'LineWidth',2);
plot( BestSol.BestCost ,'LineWidth',2);
xlabel('迭代次数');
ylabel('目标函数');
grid on;
set(gca,'XLim',[0 BestSol.MaxIt]);%X轴的数据显示范围
hold on
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
四、运行结果
五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]巫茜,罗金彪,顾晓群,曾青.基于改进PSO的无人机三维航迹规划优化算法[J].兵器装备工程学报. 2021,42(08)
[4]肖雨荷.基于自适应鸡群—粒子群混合算法的移动机器人路径规划[D].长沙理工大学
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/123632813
- 点赞
- 收藏
- 关注作者
评论(0)