粒子群演算法參數的優化
① 粒子群優化演算法的參數設置
從上面的例子我們可以看到應用PSO解決優化問題的過程中有兩個重要的步驟: 問題解的編碼和適應度函數PSO的一個優勢就是採用實數編碼, 不需要像遺傳演算法一樣是二進制編碼(或者採用針對實數的遺傳操作.例如對於問題 f(x) = x1^2 + x2^2+x3^2 求解,粒子可以直接編碼為 (x1, x2, x3), 而適應度函數就是f(x). 接著我們就可以利用前面的過程去尋優.這個尋優過程是一個疊代過程, 中止條件一般為設置為達到最大循環數或者最小錯誤
PSO中並沒有許多需要調節的參數,下面列出了這些參數以及經驗設置
粒子數: 一般取 20–40. 其實對於大部分的問題10個粒子已經足夠可以取得好的結果, 不過對於比較難的問題或者特定類別的問題, 粒子數可以取到100 或 200
粒子的長度: 這是由優化問題決定, 就是問題解的長度
粒子的范圍: 由優化問題決定,每一維可是設定不同的范圍
Vmax: 最大速度,決定粒子在一個循環中最大的移動距離,通常設定為粒子的范圍寬度,例如上面的例子里,粒子 (x1, x2, x3) x1 屬於 [-10, 10], 那麼 Vmax 的大小就是 20
學習因子: c1 和 c2 通常等於 2. 不過在文獻中也有其他的取值. 但是一般 c1 等於 c2 並且范圍在0和4之間
中止條件: 最大循環數以及最小錯誤要求. 例如, 在上面的神經網路訓練例子中, 最小錯誤可以設定為1個錯誤分類, 最大循環設定為2000, 這個中止條件由具體的問題確定.
全局PSO和局部PSO: 我們介紹了兩種版本的粒子群優化演算法: 全局版和局部版. 前者速度快不過有時會陷入局部最優. 後者收斂速度慢一點不過很難陷入局部最優. 在實際應用中, 可以先用全局PSO找到大致的結果,再用局部PSO進行搜索.
另外的一個參數是慣性權重, 由Shi 和Eberhart提出, 有興趣的可以參考他們1998年的論文(題目: A modified particle swarm optimizer)。
② 粒子群優化參數尋優
研究PSO參數尋優中,採用粒子群演算法對SVM的參數(懲罰參數C,核函數參數σ)進行最優選擇。PSO是一種進化計算技術,由Eberhart和Kennedy於1995年提出,其思想源於鳥類捕食行為,演算法的數學描述如下(何同弟等,2011):
設在一個D維搜索空間中,由有m個粒子組成的一個群體,其中第i個粒子的位置表示為向量zi=(zi1,zi2,…,ziD),i=1,2,…,m。第i個粒子的飛行速度表示為向量vi=(vi1,vi2,…,viD),其搜索的最佳位置pi=(pi1,pi2,…,piD),整個粒子群搜索到的最優位置pg=(pg1,pg2,…,pgD)。找到這兩個最優位置時,各粒子根據如下公式更新自己的速度和位置:
高光譜遙感影像信息提取技術
式中:i=1,2,…,m;ψ是慣性權重函數,用來控制前面速度對當前速度的影響;c1和c2稱為加速因子,為非負常數;r1和r2是[0,1]的隨機數。
③ 粒子群優化演算法的優化參數范圍怎麼確定
參數設置時:
LB=[0.5 1 0.3 1]';
UB=[1 2 0.8 1.5]';
這樣就確定了參數范圍了
④ 用粒子群演算法優化PID參數
具體說一下,如果演算法編寫沒問題的話,可能是你的適應度函數編寫有問題
⑤ 用粒子群演算法優化PID參數的具體過程是什麼, 最好結合模擬說明一下
這個關鍵是建立評價指標,比如採用超調量、響應時間,或者ITAE等指標最大或者最小,這樣就可以通過粒子群演算法來不斷修正PID參數,從而優化參數了。
一般來講這樣的優化只能離線,不能在線
⑥ 基於參數方程處理等式約束優化的粒子群演算法是怎麼樣的
針對目前已有的粒子群優化演算法求解有等式約束優化問題時對收斂速度和解的精度的影響,提出了一種新的基於參數方程的粒子群優化演算法。它是粒子群在初始化和迭代進化過程中使用求解參數方程的方法處理等式約束設計出的粒子群優化演算法。數值實驗結果表明,新演算法是有效的。它不僅提高了收斂速度和解的精度,而且是一種通用的智能演算法。..
... hahahahahahah
⑦ 粒子群優化的演算法參數
PSO參數包括:群體規模m,慣性權重w,加速常數c1和c2,最大速度Vmax,最大代數Gmax,解空間[Xmin Xmax]。
Vmax決定在當前位置與最好位置之間的區域的解析度(或精度)。如果Vmax太高,微粒可能會飛過好解,如果Vmax太小,微粒不能進行足夠的探索,導致陷入局部優值。該限制有三個目的:防止計算溢出;實現人工學習和態度轉變;決定問題空間搜索的粒度。
慣性權重w使微粒保持運動的慣性,使其有擴展搜索空間的趨勢,有能力探索新的區域。
加速常數c1和c2代表將每個微粒推向pbest和gbest位置的統計加速項的權重。低的值允許微粒在被拉回來之前可以在目標區域外徘徊,而高的值導致微粒突然的沖向或者越過目標區域。
如果沒有後兩部分,即c1 = c2 = 0,微粒將一直以當前的速度飛行,直到到達邊界。由於它只能搜索有限的區域,將很難找到好的解。
如果沒有第一部分,即w = 0,則速度只取決於微粒當前的位置和它們歷史最好位置pbest和gbest,速度本身沒有記憶性。假設一個微粒位於全局最好位置,它將保持靜止。而其它微粒則飛向它本身最好位置pbest和全局最好位置gbest的加權中心。在這種條件下,微粒群將統計的收縮到當前的全局最好位置,更象一個局部演算法。
在加上第一部分後,微粒有擴展搜索空間的趨勢,即第一部分有全局搜索的能力。這也使得w的作用為針對不同的搜索問題,調整演算法全局和局部搜索能力的平衡。
如果沒有第二部分,即c1 = 0,則微粒沒有認知能力,也就是「只有社會(social-only)」的模型。在微粒的相互作用下,有能力到達新的搜索空間。它的收斂速度比標准版本更快,但是對復雜問題,比標准版本更容易陷入局部優值點。
如果沒有第三部分,即c2 = 0,則微粒之間沒有社會信息共享,也就是「只有認知(cognition-only)」的模型。因為個體間沒有交互,一個規模為m的群體等價於m個單個微粒的運行。因而得到解的幾率非常小。
⑧ 粒子群演算法的參數設置
從上面的例子我們可以看到應用PSO解決優化問題的過程中有兩個重要的步驟: 問題解的編碼和適應度函數 不需要像遺傳演算法一樣是二進制編碼(或者採用針對實數的遺傳操作.例如對於問題 f(x) = x1^2 + x2^2+x3^2 求解, 粒子可以直接編碼為 (x1, x2, x3), 而適應度函數就是f(x). 接著我們就可以利用前面的過程去尋優.這個尋優過程是一個疊代過程, 中止條件一般為設置為達到最大循環數或者最小錯誤
PSO中並沒有許多需要調節的參數,下面列出了這些參數以及經驗設置
粒子數: 一般取 20 – 40. 其實對於大部分的問題10個粒子已經足夠可以取得好的結果, 不過對於比較難的問題或者特定類別的問題, 粒子數可以取到100 或 200
粒子的長度: 這是由優化問題決定, 就是問題解的長度
粒子的范圍: 由優化問題決定,每一維可以設定不同的范圍
Vmax: 最大速度,決定粒子在一個循環中最大的移動距離,通常設定為粒子的范圍寬度,例如上面的例子里,粒子 (x1, x2, x3) x1 屬於 [-10, 10], 那麼 Vmax 的大小就是 20
學習因子: c1 和 c2 通常等於 2. 不過在文獻中也有其他的取值. 但是一般 c1 等於 c2 並且范圍在0和4之間
中止條件: 最大循環數以及最小錯誤要求. 例如, 在上面的神經網路訓練例子中, 最小錯誤可以設定為1個錯誤分類, 最大循環設定為2000, 這個中止條件由具體的問題確定.
全局PSO和局部PSO: 我們介紹了兩種版本的粒子群優化演算法: 全局版和局部版. 前者速度快不過有時會陷入局部最優. 後者收斂速度慢一點不過很難陷入局部最優. 在實際應用中, 可以先用全局PSO找到大致的結果,再用局部PSO進行搜索. 代碼來自2008年數學建模東北賽區B題, #includestdafx.h#include<math.h>#include<time.h>#include<iostream>#include<fstream>usingnamespacestd;intc1=2;//加速因子intc2=2;//加速因子doublew=1;//慣性權重doubleWmax=1;//最大慣性權重doubleWmin=0.6;//最小慣性權重intKmax=110;//迭代次數intGdsCnt;//物資總數intconstDim=10;//粒子維數intconstPNum=50;//粒子個數intGBIndex=0;//最優粒子索引doublea=0.6;//適應度調整因子doubleb=0.5;//適應度調整因子intXup[Dim];//粒子位置上界數組intXdown[Dim]=;//粒子位置下界數組intValue[Dim];//初始急需度數組intVmax[Dim];//最大速度數組classPARTICLE;//申明粒子節點voidCheck(PARTICLE&,int);//約束函數voidInput(ifstream&);//輸入變數voidInitial();//初始化相關變數doubleGetFit(PARTICLE&);//計算適應度voidCalculateFit();//計算適應度voidBirdsFly();//粒子飛翔voidRun(ofstream&,int=2000);//運行函數classPARTICLE//微粒類{public:intX[Dim];//微粒的坐標數組intXBest[Dim];//微粒的最好位置數組intV[Dim];//粒子速度數組doubleFit;//微粒適合度doubleFitBest;//微粒最好位置適合度};PARTICLEParr[PNum];//粒子數組intmain()//主函數{ofstreamoutf(out.txt);ifstreaminf(data.txt);//關聯輸入文件inf>>GdsCnt;//輸入物資總數Input(inf);Initial();Run(outf,100);system(pause);return0;}voidCheck(PARTICLE&p,intcount)//參數:p粒子對象,count物資數量{srand((unsigned)time(NULL));intsum=0;for(inti=0;i<Dim;i++){if(p.X>Xup)p.X=Xup;elseif(p.X<Xdown)p.X=Xdown;if(p.V>Vmax)p.V=Vmax;elseif(p.V<0)p.V=0;sum+=p.X;}while(sum>count){p.X[rand()%Dim]--;sum=0;for(inti=0;i<Dim;i++){if(p.X>Xup)p.X=Xup;elseif(p.X<Xdown)p.X=Xdown;if(p.V>Vmax)p.V=Vmax;elseif(p.V<0)p.V=0;sum+=p.X;}}voidInput(ifstream&inf)//以inf為對象輸入數據{for(inti=0;i<Dim;i++)inf>>Xup;for(inti=0;i<Dim;i++)inf>>Value;}voidInitial()//初始化數據{GBIndex=0;srand((unsigned)time(NULL));//初始化隨機函數發生器for(inti=0;i<Dim;i++)Vmax=(int)((Xup-Xdown)*0.035);for(inti=0;i{for(intj=0;j<Dim;j++){Parr.X[j]=(int)(rand()/(double)RAND_MAX*(Xup[j]-Xdown[j])-Xdown[j]+0.5);Parr.XBest[j]=Parr.X[j];Parr.V[j]=(int)(rand()/(double)RAND_MAX*(Vmax[j]-Vmax[j]/2));}Parr.Fit=GetFit(Parr);Parr.FitBest=Parr.Fit;if(Parr.Fit>Parr[GBIndex].Fit)GBIndex=i;}}doubleGetFit(PARTICLE&p)//計算對象適應度{doublesum=0;for(inti=0;i<Dim;i++)for(intj=1;j<=p.X;j++)sum+=(1-(j-1)*a/(Xup-b))*Value;returnsum;}voidCalculateFit()//計算數組內各粒子的適應度{for(inti=0;i{Parr.Fit=GetFit(Parr);}}voidBirdsFly()//粒子飛行尋找最優解{srand((unsigned)time(NULL));staticintk=10;w=Wmax-k*(Wmax-Wmin)/Kmax;k++;for(inti=0;i{for(intj=0;j<Dim;j++){Parr.V[j]=(int)(w*Parr.V[j]);Parr.V[j]+=(int)(c1*rand()/(double)RAND_MAX*(Parr.XBest[j]-Parr.X[j]);Parr.V[j]+=c2*rand()/(double)RAND_MAX*(Parr[GBIndex].XBest[j]-Parr.X[j]));}}Check(Parr,GdsCnt);for(intj=0;j<Dim;j++){Parr.X[j]+=Parr.V[j];Check(Parr,GdsCnt);}CalculateFit();for(inti=0;i{if(Parr.Fit>=Parr.FitBest){Parr.FitBest=Parr.Fit;for(intj=0;j<Dim;j++)Parr.XBest[j]=Parr.X[j];}}GBIndex=0;for(inti=0;i{if(Parr.FitBest>Parr[GBIndex].FitBest&&i!=GBIndex)GBIndex=i;}}voidRun(ofstream&outf,intnum)//令粒子以規定次數num飛行{for(inti=0;i<num;i++){BirdsFly();outf<<(i+1)<<ends<for(intj=0;j<Dim;j++)outf<outf<<endl;}cout<<Done!<<endl;}