今天为大家分享启发式优化算法的第二种算法——粒子群算法(又称鸟群算法),粒子群算法是依据鸟群在觅食过程中信息在在个体和集体中传递的原理进行优化的,具体原理这里同样不进行详细介绍,大家可以参考其他博客,这里直接贴出相关程序:
function Record = PSOfunction(Population,Dim,Inter,PosLimit,VLimit,C1,C2,C3)
%粒子群算法
%{
输入:
Population:初始种群数
Dim:变量维度
Inter:迭代次数
PosLimit:寻优范围
VLimit:速度范围
C1:惯性权重
C2:自我学习因子
C3:集体学习因子
输出:
日期:
20190905_ZD
%}
%随机初始化种群位置
for i = 1:Dim
X(:,i) = PosLimit(i,1) + ( PosLimit(i,2) - PosLimit(i,1) ) * rand(Population,1);
end
%初始化种群速度
V = rand(Population,Dim);
XBest = X;%每个个体的历史最佳位置
XAllBest = zeros(1,Dim);%种群的历史最佳位置
FitnessBest = zeros(Population,1);%每个个体的历史最佳适应度
FitnessAllBest = -inf;%种群历史最佳适应度
%寻优
jj = 1;
Record = zeros(Inter,1);
while jj <= Inter
[Fitness,f] = CalFitness(X);%计算适应度
for i = 1:Population
if FitnessBest(i) < Fitness(i)
FitnessBest(i) = Fitness(i);%更新个体历史最佳适应度
XBest(i,:) = X(i,:);%更新个体历史最佳位置
end
end
if FitnessAllBest < max(Fitness)
[FitnessAllBest,label] = max(Fitness);
XAllBest = X(label,:);
end
V = V*C1+C2*rand*(XAllBest-X)+C3*rand*(repmat(XAllBest,Population,1) - X);%更新速度
%处理速度边界问题
for i=1:Dim
for k = 1:Population
if V(k,i) > VLimit(i,2)
V(k,i) = VLimit(i,2);
end
if V(k,i) < VLimit(i,1)
V(k,i) = VLimit(i,1);
end
end
end
X = X + V;%更新位置
%边界问题处理
for i = 1:Dim
for k = 1:Population
if X(k,i) > PosLimit(i,2)
X(k,i) = PosLimit(i,2);
end
if X(k,i) < PosLimit(i,1)
X(k,i) = PosLimit(i,1);
end
end
end
%绘制
cla
fsurf(f,[0 20 0 20])
hold on
if mod(jj,10) == 0
plot3(X(:,1),X(:,2),f(X(:,1),X(:,2)),'ro');
pause(0.1)
end
Record(jj) = FitnessAllBest;
jj = jj+1;
end
function [Fitness,f] = CalFitness(X)
%计算适应度
%{
输入:
X:参数
输出:
Fitness:适应度
f:函数
日期:
20190905_ZD
%}
f= @(a,b)(a .* sin(a) .* cos(2 * a) - 2 * a .* sin(3 * a)).*(b .* sin(b) .* cos(2 * b) - 2 * b .* sin(3 * b));
Fitness = f(X(:,1),X(:,2));