最佳化問題,求解一維函數F(x)=x^2的極值
粒子群演算法相關參數初值定義如下:
particle 個數N=200
迭代次數period=1000次
Vmax=5粒子飛行速度最大值
X=10*rand(1,N)-5,隨機產生N個-5~+5之間的數
V=zeros(1,N),所有粒子飛行速度初值均為0
C1=C2=2
W=0.8
G_best=1000,寫大一點,否則會一下子就收斂
P_best=X ,一開始,個體的最佳值即一開始當前的位置
[程式碼]
%一維函數F(x)=x^2,給定範圍找最小值
clear all
clc
%初始化
N=200; %partical 個數
Period=1000; % 迭代次數
Vmax=5;
X=10*rand(1,N)-5; %產生N個數的隨機值,範圍介於-5~+5
P_best=X; %個體最優值,初始狀態取X相同值
G_best=1000;
V=zeros(1,N);
C1=2;
C2=2;
W=0.8;
cnt=1;
for i=1:Period
for j=1:N
V(2,j)=W*V(1,j)+C1*rand(1)*(P_best(1,j)-X(1,j))+C2*rand(1)*(G_best-X(1,j));
if(abs(V(2,j)>Vmax))
V(2,j)=sign(V(2,j))*Vmax;
end
X(2,j)=X(1,j)+V(2,j);
P_best_fitness=fitness(P_best(1,j));
current_particle_fitness=fitness(X(2,j));
if(current_particle_fitness<P_best_fitness)
P_best(1,j)=X(2,j);
end
end
V(1,:)=V(2,:);
X(1,:)=X(2,:);
for j=1:N
P_best_fitness=fitness(P_best(1,j));
G_best_fitness=fitness(G_best);
if(P_best_fitness<G_best_fitness)
G_best=P_best(1,j);
end
end
G_best_dot(cnt)=G_best;
cnt=cnt+1;
end
plot(G_best_dot)
G_best
副函數fitness:function fit=fitness(X)
fit=X^2;
end
[執行結果]
從圖中可看出最佳值收斂,且經計算得到G_best=-3.9680e-021
換句話說,電腦分析當-3.9680e-021可得函數F(-3.9680e-021)的最小值。當然,迭代的分析,必然存在誤差,但其結果仍令人滿意,與期望值0極為接近。