最佳化問題,求解一維函數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極為接近。
您好!我正在follow您的文章~
回覆刪除想請教您一些問題如下:
1.請問再疊代時 是不算每個粒子pbest和gbest在更新速度和位子這樣嗎?為何您一開始就先將每個粒子更新位子了呢?不好意思...應是我觀念有誤,還請您能更正我不懂的地方,謝謝。
一開始所有的粒子因為亂數分佈,所以不會是最佳解,且我初始值一開始所有粒子飛行速度都是0(zeros),一開始便更新位置和速度很合情合理。
回覆刪除至於p_best根據每一個粒子自身搜尋的過程,如果當前位置比p_best好,其地位就被取代。
g_best根據群體中每一次迭代過程中,從所有粒子,找出最好的,如果p_best的fitness value比g_best好,g_best就會被某一粒子的p_best取代。
有問題再討論。
可以請問您如果我需要寫一個二維的PSO,我的粒子帶入cost function後出來的fitness值是一個常數,要怎麼更新P_best(二維),謝謝您。
回覆刪除先以一維的來說,每一次迭代的過程,每一個X(i)會對應一個fitness(i),再與前一次的P_best(i)做比較,如果fitness(i)比P_best(i)的fitness小,則X(i)就取代P_best(i)
回覆刪除有了一維的概念:
當[x(i),y(i)]對應的fitness(i),與P_best(i)做比較,fitness(i)比P_best(i)的fitness小,則[x(i),y(i)]就取代P_best(i)
基本上P_best(i)代表的是一個線上的點(一維)或是平面上的點(二維),就是座標上的一個點。
如果你是用Matlab,它的矩陣功能很好用。
補充上述:
回覆刪除P_best(i)就是某一次迭代較佳的x(i)或者是[x(i),y(i)]
薛老師您好
回覆刪除我想請問一下 是否使用PSO演算法來追蹤某一條線段軌跡呢??
我的意思是 比如說設計一個S型曲線 然後使用PSO來追蹤此條S曲線軌跡
不知道如果是類似這種方式 PSO的適應函數要如何設計呢??
希望薛老師能幫學生解惑 謝謝
一條S曲線如果有二維(或更高)函數,作法一樣。然而我覺得你的題意
回覆刪除比較傾向於建模方程式,你可以朝最小平方法或灰色預測建模這兩個議題
去研究一下。