particleswarm函式是matlab自帶的粒子群最佳化演算法,其使用自適應的鄰域模式搜尋最優解,比我們之前自己寫的程式碼要好得多,本章我們來討論一下其思想與引數設定
- 一、自適應的鄰域模式
- 1.全域性模式與鄰域模式
- 2.全域性模式的優劣
- 3.鄰域模式的優劣
- 4.何為“自適應”
- 二、預設引數的選取
- 1.粒子個數SwarmSize
- 2.慣性權重與學習因子
- 3.鄰域內粒子的比例MinNeighborsFraction
- 三、自動退出迭代迴圈
- 1.最大停滯迭代次數與容忍度
- 2.最大迭代次數
- 3.視覺化迭代圖形
- 4.混合函式求解
- 四、程式碼求解極值問題
- 1.函式語法
- 2.問題提出
- 3.程式碼求解
- 五、修改函式的引數
- 1.繪製最佳的函式值隨迭代次數的變化圖
- 2.展示函式的迭代過程
- 3.修改粒子數量
- 4.在粒子群演算法結束後繼續呼叫其他函式進行混合求解
- 5.最大的迭代次數
- 6.領域內粒子的比例
- 7.函式容忍度與最大停滯迭代數
- 六、函式引數修改的建議
一、自適應的鄰域模式
在我們前面對粒子群演算法的最佳化討論中,核心思想就是根據不同的情況,修改慣性權重w,與c1和c2。而matlab自帶的演算法使用的調整引數的方法則更加先進
1.全域性模式與鄰域模式
在觀察鳥群覓食的過程中注意到,通常飛鳥並不一定看到鳥群中其他所有飛鳥的位置和方向,往往只是看到相鄰的飛鳥的位置和方向。因此他在研究粒子群演算法時,同時開發了兩種模式:全域性模式(gbest)和鄰域模式(lbest)
2.全域性模式的優劣
全域性模式是指粒子群在搜尋過程中將所有其他粒子都視為鄰域粒子,它可以看做是鄰域模式的極端情況,基本粒子群演算法即屬於全域性模式。其優點是粒子鄰域個體多,粒子群內的資訊交流速度快,使得粒子群演算法具有較快的收斂速度,但在一定程度上會降低粒子多樣性,易陷人區域性最優。
3.鄰域模式的優劣
鄰域模式是指粒子群在搜尋過程中只將其周圍部分粒子視為鄰域粒子,這種模式使得粒子群可以被分割成多個不同的子群體,有利於在多個區域進行搜尋,避免演算法陷人區域性最優。
4.何為“自適應”
自適應體現在:如果適應度開始停滯時,粒子群搜尋會從鄰域模式向全域性模式轉換。一旦適應度開始下降,則又恢復到鄰域模式,以免陷入區域性最優。當適應度的停滯次數足夠大時,慣性系數開始逐漸變小,從而利於區域性搜尋。搜尋初期使用鄰域模式較好,後期使用全域性模式
二、預設引數的選取
1.粒子個數SwarmSize
預設設定為:min{100,10*nvars}, nvars是變數個數
2.慣性權重與學習因子
慣性權重InertiaRange預設設定的範圍為:[0.1,1.1],個體學習因子SelfAdjustmentWeight與社會學習因子SocialAdjustmentWeight預設設定為:1.49 (和壓縮因子的係數幾乎相同)
3.鄰域內粒子的比例MinNeighborsFraction
預設設定為:0.25,由於採取的是鄰域模式,因此定義了一個“鄰域最少粒子數目”:minNeighborhoodSize = max{2,(粒子數目*鄰域內粒子的比例)的整數部分},在迭代開始後,每個粒子會有一個鄰域,初始時鄰域內的粒子個數(記為Q)就等於“鄰域最少粒子數目”,後續鄰域內的粒子個數Q會自適應調整。
三、自動退出迭代迴圈
Matlab自帶的粒子群函式可以設定幾種自動退出迭代迴圈的方法
1.最大停滯迭代次數與容忍度
MaxStallIterations and FunctionTolerance;前者為最大停滯迭代次數,預設為20,也就是說迭代20次後,適應度沒有最佳化則退出迭代。後者為容忍度,預設為1e-6;
Exit Flag=1;其為跳出引數
2.最大迭代次數
MaxIterations;預設值為200*nvars,若超過這個數,則退出迭代
Exit Flag=0;
3.視覺化迭代圖形
OutputFcn or PlotFcn;在迭代的過程中看到圖形,可以隨時暫停和停止
Exit Flag=-1;
4.混合函式求解
MaxTime;如果是第一種方式退出迭代的話,我們可以將粒子群演算法得到的解作為初始值,繼續呼叫其他的函式來進行混合求解,例如我們熟悉的fmincon函式(我測試發現以第二種退出好像也可以呼叫求他函式混合求解)
Exit Flag=-5
四、程式碼求解極值問題
1.函式語法
由於matlab只能求最小值問題,如果求最大值的話要在目標函式前加負號
[x,fval,exitflag,output] = particleswarm(@Obj_fun2, narvs, x_lb, x_ub)
輸入的第一個引數是我們的一個函式檔案,用@符號來引導;第二個引數則是變數的個數;第三第四個分別為上下界。
輸出的前兩個變數即為我們的變數取值與函式值。第三個變數是一個常數,其意義是告訴我們迭代是從種情況跳出的;
第四個變數為一個結構體,我們只需要關注兩個資訊。(1)iterations為迭代的次數(2)message,告訴我們以何種方式跳出迭代
2.問題提出
求解函式y = x12+x22-x1x2-10x1-4*x2+60在[-15,15]內的最小值(最小值為8)
3.程式碼求解
narvs = 2; % 變數個數
x_lb = [-15 -15]; % x的下界(長度等於變數的個數,每個變數對應一個下界約束)
x_ub = [15 15]; % x的上界
[x,fval,exitflag,output] = particleswarm(@Obj_fun2, narvs, x_lb, x_ub)
五、修改函式的引數
1.繪製最佳的函式值隨迭代次數的變化圖
options = optimoptions('particleswarm','PlotFcn','pswplotbestf')
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
2.展示函式的迭代過程
在matlab下方的輸出框展示每次迭代的結果
options = optimoptions('particleswarm','Display','iter');
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
3.修改粒子數量
options = optimoptions('particleswarm','SwarmSize',50); %預設的是:min(100,10*nvars)
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
4.在粒子群演算法結束後繼續呼叫其他函式進行混合求解
options = optimoptions('particleswarm','HybridFcn',@fmincon);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
5.最大的迭代次數
options = optimoptions('particleswarm','MaxIterations',10000); %,預設的是200*nvars
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
6.領域內粒子的比例
options = optimoptions('particleswarm','MinNeighborsFraction',0.2); %預設是0.25
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
7.函式容忍度與最大停滯迭代數
options = optimoptions('particleswarm','FunctionTolerance',1e-12,'MaxStallIterations',100); % 預設1e-6與20
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)