資源描述:
《基于MATLAB的粒子群優(yōu)化算法的應(yīng)用示例》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、對(duì)于函數(shù)f=x*sin(x)*cos(2*x)?2*x*sin(3*x),求其在區(qū)間[0,20]上該函數(shù)的最大值。?初始化種群已知位置限制[0,20],由于一維問(wèn)題較為簡(jiǎn)單,因此可以取初始種群N為50,迭代次數(shù)為100,當(dāng)然空間維數(shù)d也就是1。位置和速度的初始化即在位置和速度限制內(nèi)隨機(jī)生成一個(gè)Nxd的矩陣,對(duì)于此題,位置初始化也就是在0?20內(nèi)隨機(jī)生成一個(gè)50x1的數(shù)據(jù)矩陣,而對(duì)于速度則不用考慮約束,一般直接在0?1內(nèi)隨機(jī)生成一個(gè)50x1的數(shù)據(jù)矩陣。此處的位置約束也可以理解為位置限制,而速度限制是保
2、證粒了步長(zhǎng)不超限制的,一般設(shè)置速度限制為卜1,1]。粒子群的另一個(gè)特點(diǎn)就是記錄每個(gè)個(gè)體的歷史最優(yōu)和種群的歷史最優(yōu),因此而二者對(duì)應(yīng)的最優(yōu)位置和最優(yōu)值也需要初始化。其中每個(gè)個(gè)體的歷史最優(yōu)位置可以先初始化為當(dāng)前位置,而種群的歷史最優(yōu)位置則可初始化為原點(diǎn)。對(duì)于最優(yōu)值,如果求最大值則初始化為負(fù)無(wú)窮,相反地初始化為正無(wú)窮。每次搜尋都需要將當(dāng)前的適應(yīng)度和最優(yōu)解同歷史的記錄值進(jìn)行對(duì)比,如果超過(guò)歷史最優(yōu)值,則更新個(gè)體和種群的歷史最優(yōu)位置和最優(yōu)解。?速度與位置的更新速度和位置更新是粒子群算法的核心,其原理表達(dá)式和更新方
3、式如下:J怙=W?匕d+C]?Sd一XQ+C2-r2?5gd—X沏)[x沏=x汩+j每次更新完速度和位置都需要考慮速度和位置的限制,需要將其限制在規(guī)定范圍內(nèi),此處僅舉出一個(gè)常規(guī)方法,即將超約束的數(shù)據(jù)約束到邊界(當(dāng)位置或者速度超出初始化限制時(shí),將其拉回靠近的邊界處)。當(dāng)然,你不用擔(dān)心他會(huì)停住不動(dòng),因?yàn)槊總€(gè)粒子還有慣性和其他兩個(gè)參數(shù)的影響。代碼如下:clc;clear;closeall;%%初始化種群f=@(x)x.*sin(x).*cos(2*x)?2*x?*sin(3*x);%函數(shù)表達(dá)式figure
4、(l);ezplot(f,[0,0.01,20]);N=50;%初始種群個(gè)數(shù)d=1;%空間維數(shù)ger=100;%最大迭代次數(shù)limit=
5、0,20];%設(shè)置位置參數(shù)限制vlimit=[-l,1];%設(shè)置速度限制w=0.8;%慣性權(quán)重cl=0.5;%自我學(xué)習(xí)因子c2=0.5;%群體學(xué)習(xí)因子fori=l:dx=1)+(limit(i,2)-limit(i,1))*rand(N,d);%初始不中群的位置endv=rand(N,d);%初始種群的速度xm=x;%每個(gè)個(gè)體的歷史最佳位置ym=zeros(l,d
6、);%種群的歷史最佳位置fxm=zeros(N,1);%每個(gè)個(gè)體的歷史最佳適應(yīng)度f(wàn)ym=-inf;%種群歷史最佳適應(yīng)度holdonplot(xm,f(xm),ToJ;titleC初始狀態(tài)圖');figure(2)%%群體更新iter=1:record=zeros(ger,1);%記錄器whileiterv二gerfx=f(x);%個(gè)體當(dāng)前適應(yīng)度f(wàn)ori=1:Niffxm(i)7、iffymvlimit(2))=vlimit(2);v(vlimit(2))=limit(2);x(x8、rd(iter)=fym;%最大值記錄%x0=0:0.01:20;%plot(x0,f(x0),b;x,f(x),,ro,);title(,狀態(tài)位置變化J%pause(O.l)iter=iter+1;endfigure(3);plot(record);title(!收斂過(guò)程')xO=0:0.01:20;figure(4);plot(x0,f(xO),fb-',x,f(x),'ro');title('最終狀態(tài)位置')disp(『最大值:um2str(fym)]);disp([‘變量取值:um2
9、str(ym)]);