買書捐殘盟

2011年7月25日 星期一

求解最佳化的問題-使用粒子群演算法,part4

最佳化問題,求解一維函數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極為接近。

7 則留言:

  1. 您好!我正在follow您的文章~
    想請教您一些問題如下:
    1.請問再疊代時 是不算每個粒子pbest和gbest在更新速度和位子這樣嗎?為何您一開始就先將每個粒子更新位子了呢?不好意思...應是我觀念有誤,還請您能更正我不懂的地方,謝謝。

    回覆刪除
  2. 一開始所有的粒子因為亂數分佈,所以不會是最佳解,且我初始值一開始所有粒子飛行速度都是0(zeros),一開始便更新位置和速度很合情合理。
    至於p_best根據每一個粒子自身搜尋的過程,如果當前位置比p_best好,其地位就被取代。
    g_best根據群體中每一次迭代過程中,從所有粒子,找出最好的,如果p_best的fitness value比g_best好,g_best就會被某一粒子的p_best取代。

    有問題再討論。

    回覆刪除
  3. 可以請問您如果我需要寫一個二維的PSO,我的粒子帶入cost function後出來的fitness值是一個常數,要怎麼更新P_best(二維),謝謝您。

    回覆刪除
  4. 先以一維的來說,每一次迭代的過程,每一個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,它的矩陣功能很好用。

    回覆刪除
  5. 補充上述:
    P_best(i)就是某一次迭代較佳的x(i)或者是[x(i),y(i)]

    回覆刪除
  6. 薛老師您好
    我想請問一下 是否使用PSO演算法來追蹤某一條線段軌跡呢??
    我的意思是 比如說設計一個S型曲線 然後使用PSO來追蹤此條S曲線軌跡
    不知道如果是類似這種方式 PSO的適應函數要如何設計呢??
    希望薛老師能幫學生解惑 謝謝

    回覆刪除
  7. 一條S曲線如果有二維(或更高)函數,作法一樣。然而我覺得你的題意
    比較傾向於建模方程式,你可以朝最小平方法或灰色預測建模這兩個議題
    去研究一下。

    回覆刪除