一、简介
1 粒子群算法的概念 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解. PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。
2 粒子群算法分析
2.1基本思想
粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。下面的动图很形象地展示了PSO算法的过程:
2 更新规则
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
公式(1)的第一部分称为【记忆项】,表示上次速度大小和方向的影响;公式(1)的第二部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;公式(1)的第三部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。
公式(2)和 公式(3)被视为标准PSO算法。
3 PSO算法的流程和伪代码
二、部分源代码
close all;
clear all;
clc;
tic;
PopSize=500;%种群大小
CityNum = 31;%城市数
OldBestFitness=0;%旧的最优适应度值
Iteration=0;%迭代次数
MaxIteration =2000;%最大迭代次数
IsStop=0;%程序停止标志
Num=0;%取得相同适应度值的迭代次数
c1=0.5;%认知系数
c2=0.7;%社会学习系数
w=0.96-Iteration/MaxIteration;%惯性系数,随迭代次数增加而递减
%节点坐标
load DATA;
weldpoint=DATA.weldpoint;
%初始化各粒子,即产生路径种群
Group=ones(CityNum,PopSize);
for i=1:PopSize
Group(:,i)=randperm(CityNum)';
end
Group=Arrange(Group);
%初始化粒子速度(即交换序)
% for i=1:PopSize
% Velocity(:,i)=randn;
% end
Velocity =zeros(CityNum,PopSize);
for i=1:PopSize
Velocity(:,i)=round(rand(1,CityNum)'*CityNum); %round取整
end
%计算每个城市之间的距离
load('L.mat')
CityBetweenDistance=L;
%计算每条路径的距离
for i=1:PopSize
EachPathDis(i) = PathDistance(Group(:,i)',CityBetweenDistance);
end
IndivdualBest=Group;%记录各粒子的个体极值点位置,即个体找到的最短路径
IndivdualBestFitness=EachPathDis;%记录最佳适应度值,即个体找到的最短路径的长度
[GlobalBestFitness,index]=min(EachPathDis);%找出全局最优值和相应序号
cor_best = Group(:,index)
%寻优
while(IsStop == 0) & (Iteration < MaxIteration)
%迭代次数递增
Iteration = Iteration +1;
%更新全局极值点位置,这里指路径
for i=1:PopSize
GlobalBest(:,i) = Group(:,index);
end
%求pij-xij ,pgj-xij交换序,并以概率c1,c2的保留交换序
pij_xij=GenerateChangeNums(Group,IndivdualBest);
pij_xij=HoldByOdds(pij_xij,c1);
pgj_xij=GenerateChangeNums(Group,GlobalBest);
pgj_xij=HoldByOdds(pgj_xij,c2);
%以概率w保留上一代交换序
%Velocity=HoldByOdds(Velocity,w);
Group = PathExchange(Group,Velocity); %根据交换序进行路径交换
Group = PathExchange(Group,pij_xij);
Group = PathExchange(Group,pgj_xij);
for i = 1:PopSize % 更新各路径总距离
EachPathDis(i) = PathDistance(Group(:,i)',CityBetweenDistance);
end
IsChange = EachPathDis<IndivdualBestFitness;%更新后的距离优于更新前的,记录序号
IndivdualBest(:, find(IsChange)) = Group(:, find(IsChange));%更新个体最佳路径
IndivdualBestFitness = IndivdualBestFitness.*...
( ~IsChange) + EachPathDis.*IsChange;%更新个体最佳路径距离
[GlobalBestFitness, index] = min(EachPathDis);%更新全局最佳路径,记录相应的序号
if GlobalBestFitness==OldBestFitness %比较更新前和更新后的适应度值;
Num=Num+1; %相等时记录加一;
else
OldBestFitness=GlobalBestFitness;%不相等时更新适应度值,并记录清零;
Num=0;
end
if Num >= 20 %多次迭代的适应度值相近时程序停止
IsStop=1;
end
BestFitness(Iteration) =GlobalBestFitness;%每一代的最优适应度
end
%进化曲线
figure(1)
plot((1:Iteration),BestFitness(1:Iteration));
grid on;
title('进化曲线');
%最优解
figure(2)
PathPlot(weldpoint,CityNum,index,IndivdualBest);
hold on
title('globle welding robot path');
load DATA;
NODE=DATA.NODE;
for j=1:size(weldpoint,1) %把焊点标注顺序
c=num2str(j);
text(weldpoint(j,1),weldpoint(j,2),weldpoint(j,3)+5,c);
end
for i=1:numel(NODE)
a = NODE{i};
fill3(a(:,1),a(:,2),a(:,3),[0.6, 0.6, 1]);
end
xlabel('X/mm');ylabel('Y/mm');zlabel('Z/mm');
%机械臂1焊点连线
figure(3)
PathPlot1(weldpoint,CityNum,index,IndivdualBest);
hold on
title('robot1 welding robot path');
load DATA;
NODE=DATA.NODE;
for j=1:size(weldpoint,1) %把焊点标注顺序
c=num2str(j);
text(weldpoint(j,1),weldpoint(j,2),weldpoint(j,3)+5,c);
end
for i=1:numel(NODE)
a = NODE{i};
fill3(a(:,1),a(:,2),a(:,3),[0.6, 0.6, 1]);
end
xlabel('X');ylabel('Y');zlabel('Z');
%机械臂2焊点连线
figure(4)
PathPlot2(weldpoint,CityNum,index,IndivdualBest);
hold on
title('robot2 welding robot path');
load DATA;
NODE=DATA.NODE;
for j=1:size(weldpoint,1) %把焊点标注顺序
c=num2str(j);
text(weldpoint(j,1),weldpoint(j,2),weldpoint(j,3)+5,c);
end
for i=1:numel(NODE)
a = NODE{i};
fill3(a(:,1),a(:,2),a(:,3),[0.6, 0.6, 1]);
end
xlabel('X');ylabel('Y');zlabel('Z');
%最小路径值
GlobalBestFitness
toc
三、运行结果
四、matlab版本及参考文献
1 matlab版本 2014a
2 参考文献 [1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016. [2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017. [3]巫茜,罗金彪,顾晓群,曾青.基于改进PSO的无人机三维航迹规划优化算法[J].兵器装备工程学报. 2021,42(08) [4]邓叶,姜香菊.基于改进人工势场法的四旋翼无人机航迹规划算法[J].传感器与微系统. 2021,40(07) [5]马云红,张恒,齐乐融,贺建良.基于改进A*算法的三维无人机路径规划[J].电光与控制. 2019,26(10) [6]焦阳.基于改进蚁群算法的无人机三维路径规划研究[J].舰船电子工程. 2019,39(03)