今天爲大家分享啓發式優化算法的第二種算法——粒子羣算法(又稱鳥羣算法),粒子羣算法是依據鳥羣在覓食過程中信息在在個體和集體中傳遞的原理進行優化的,具體原理這裏同樣不進行詳細介紹,大家可以參考其他博客,這裏直接貼出相關程序:
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));