-
粒子群優化算法
PSO是粒子群優化算法(——Particle Swarm Optimization)的英文縮寫,是一種基于種群的随機優化技術,由Eberhart和Kennedy于1995年提出。粒子群算法模仿昆蟲、獸群、鳥群和魚群等的群集行為,這些群體按照一種合作的方式尋找食物,群體中的每個成員通過學習它自身的經驗和其他成員的經驗來不斷改變其搜尋模式。
-
算法優點
思路簡單,程式設計較容易,對連續問題優化效果相當不錯,收斂容易,并且通過參數c1 c2的調節可以使粒子群的學習傾向有所改變進而适應不同的優化問題。
下面我們針對一個二進制函數進行粒子群優化,使用語言:MATLAB
- 初始化
maxgen = 100;
sizepop = 100;
Vmax = 0.6;
Vmin = -0.6;
popmax = 10;
popmin = -10;
c1 = 0.4;
c2 = 1.5;
- 定義匿名函數
- 繪制函數(兩個視角)
[x,y] = meshgrid(-10:0.05:10,-10:0.05:10);
z = 2.*sin(x).*sin(y)./(x.*y);
figure(1);
mesh(x,y,z);
hold on;
figure(2);
mesh(x,y,z);view(0,90);hold on;
- 初始化種群
for i = 1:sizepop
pop(i,:) = -10+20*rand(1,2);
V(i,:) = -0.6+1.2*rand(1,2);
fitness(i) = f(pop(i,:));
end
[bestfitness,bestindex] = min(fitness);
fitnesszbest = bestfitness;
fitnessgbest = fitness;
zbest = pop(bestindex,:); %種群曆史最優解
gbest = pop; %個體曆史最優解
- 尋優過程
for j = 1:sizepop
%-----------速度更新-----------------%
V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
V(j,find(V(j,:)>Vmax)) = Vmax; %限制搜尋速度
V(j,find(V(j,:)<Vmin)) = Vmin;
%----------種群更新------------------%
pop(j,:) = pop(j,:) + V(j,:);
pop(j,find(pop(j,:)>popmax)) = popmax; %限制搜尋範圍
pop(j,find(pop(j,:)<popmin)) = popmin;
%----------更新适應值----------------%
fitness(j) = f(pop(j,:));
end
%----------------個體最優更新-------------%
for j = 1:sizepop
if (fitness(j)<fitnessgbest(j))
gbest(j,:) = pop(j,:);
fitnessgbest(j,:) = fitness(j);
end
if (fitness(j)<fitnesszbest)
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
yy(i) = fitnesszbest; %每一代的最優适應值
- 繪制搜尋動态圖
if (i>1)
delete(G);
delete(H);
end
figure(1);
G = scatter3(pop(:,1),pop(:,2),fitness,40,'r.');
xlim([-10,10]);
ylim([-10,10]);
zlim([-1,3]);
drawnow
hold on
figure(2);
H = scatter3(pop(:,1),pop(:,2),fitness,40,'r.');
hold on;
pause(0.5);
- 輸出結果
zbest
fitnesszbest
- 整體代碼
close all;clear;clc;
maxgen = 100;
sizepop = 100;
Vmax = 0.6;
Vmin = -0.6;
popmax = 10;
popmin = -10;
c1 = 0.4;
c2 = 1.5;
%-----------------定義匿名函數---------------------%
f = @(x)2*sin(x(1))*sin(x(2))/(x(1)*x(2));
%-----------------繪制函數--------------------------%
[x,y] = meshgrid(-10:0.05:10,-10:0.05:10);
z = 2.*sin(x).*sin(y)./(x.*y);
figure(1);
mesh(x,y,z);
hold on;
figure(2);
mesh(x,y,z);view(0,90);hold on;
%------------------初始化種群-----------------------%
for i = 1:sizepop
pop(i,:) = -10+20*rand(1,2);
V(i,:) = -0.6+1.2*rand(1,2);
fitness(i) = f(pop(i,:));
end
[bestfitness,bestindex] = min(fitness);
fitnesszbest = bestfitness;
fitnessgbest = fitness;
zbest = pop(bestindex,:); %種群曆史最優解
gbest = pop; %個體曆史最優解
%---------------尋優--------------------------%
for i = 1:maxgen
for j = 1:sizepop
%-----------速度更新-----------------%
V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
V(j,find(V(j,:)>Vmax)) = Vmax; %限制搜尋速度
V(j,find(V(j,:)<Vmin)) = Vmin;
%----------種群更新------------------%
pop(j,:) = pop(j,:) + V(j,:);
pop(j,find(pop(j,:)>popmax)) = popmax; %限制搜尋範圍
pop(j,find(pop(j,:)<popmin)) = popmin;
%----------更新适應值----------------%
fitness(j) = f(pop(j,:));
end
%----------------個體最優更新-------------%
for j = 1:sizepop
if (fitness(j)<fitnessgbest(j))
gbest(j,:) = pop(j,:);
fitnessgbest(j,:) = fitness(j);
end
if (fitness(j)<fitnesszbest)
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
yy(i) = fitnesszbest; %每一代的最優适應值
%---------------繪制搜尋動态3D圖---------------%
if (i>1)
delete(G);
delete(H);
end
figure(1);
G = scatter3(pop(:,1),pop(:,2),fitness,40,'r.');
xlim([-10,10]);
ylim([-10,10]);
zlim([-1,3]);
drawnow
hold on
figure(2);
H = scatter3(pop(:,1),pop(:,2),fitness,40,'r.');
hold on;
pause(0.5);
end
zbest
fitnesszbest
- 可視化結果
![優化過程](https://img-blog.csdnimg.cn/20200308211151766.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzE0NTk0MQ==,size_16,color_FFFFFF,t_70)