-
當前位置:首頁 > 創(chuàng)意學院 > 技術(shù) > 專題列表 > 正文
粒子群算法實例(粒子群算法實例復現(xiàn))
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于粒子群算法實例的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、求粒子群算法MATLAB完整代碼
%% 清空環(huán)境
clear
clc
tic
%% 參數(shù)初始化
% 粒子群算法中的兩個參數(shù)
c1 = 1.49445;
c2 = 1.49445;
maxgen = 200; % 進化次數(shù)
sizepop = 20; % 種群規(guī)模
Vmax = 1;
Vmin = -1;
popmax = 5;
popmin = -5;
%% 產(chǎn)生初始粒子和速度
for i = 1:sizepop
% 隨機產(chǎn)生一個種群
pop(i,:) = 5 * rands(1,2); % 初始種群
V(i,:) = rands(1,2); % 初始化速度
% 計算適應度
fitness(i) = fun(pop(i,:)); % 染色體的適應度
end
% 找最好的染色體
[bestfitness bestindex] = min(fitness);
zbest = pop(bestindex,:); % 全局最佳
gbest = pop; % 個體最佳
fitnessgbest = fitness; % 個體最佳適應度值
fitnesszbest = bestfitness; % 全局最佳適應度值
%% 迭代尋優(yōu)
for i = 1:maxgen
for j = 1:sizepop
% 速度更新
V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
V(j,find(V(j,:)>Vmax)) = Vmax;
V(j,find(V(j,:)<Vmin)) = Vmin;
%種群更新
pop(j,:) = pop(j,:) + 0.5*V(j,:);
pop(j,find(pop(j,:)>popmax)) = popmax;
pop(j,find(pop(j,:)<popmin)) = popmin;
% 自適應變異
if rand > 0.8
k = ceil(2*rand);
pop(j,k) = rand;
end
% 適應度值
fitness(j) = fun(pop(j,:));
end
% 個體最優(yōu)更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
% 群體最優(yōu)更新
if fitness(j) < fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
yy(i) = fitnesszbest;
end
toc
%% 結(jié)果分析
plot(yy);
title(['適應度曲線 ' '終止代數(shù)=' num2str(maxgen)]);
xlabel('進化代數(shù)');
ylabel('適應度');
fun函數(shù)如下
function y = fun(x)
y = -20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2)) - exp((cos(2*pi*x(1))+ cos(2*pi*x(2)))/2) + 20 + 2.71289;
二、粒子群優(yōu)化算法(PSO)的matlab運行程序~~謝謝大家啦!
%不知道你具體的問題是什么,下面是一個最基本的pso算法解決函數(shù)極值問題,如果是一些大型的問題,需要對速度、慣性常數(shù)、和自適應變異做進一步優(yōu)化,希望對你有幫助
function y = fun(x)
y=-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+2.71289;
%下面是主程序
%% 清空環(huán)境
clc
clear
%% 參數(shù)初始化
%粒子群算法中的兩個參數(shù)
c1 = 1.49445;
c2 = 1.49445;
maxgen=200; % 進化次數(shù)
sizepop=20; %種群規(guī)模
Vmax=1;%速度限制
Vmin=-1;
popmax=5;%種群限制
popmin=-5;
%% 產(chǎn)生初始粒子和速度
for i=1:sizepop
%隨機產(chǎn)生一個種群
pop(i,:)=5*rands(1,2); %初始種群
V(i,:)=rands(1,2); %初始化速度
%計算適應度
fitness(i)=fun(pop(i,:)); %染色體的適應度
end
%找最好的染色體
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:); %全局最佳
gbest=pop; %個體最佳
fitnessgbest=fitness; %個體最佳適應度值
fitnesszbest=bestfitness; %全局最佳適應度值
%% 迭代尋優(yōu)
for i=1:maxgen
for j=1:sizepop
%速度更新
V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
V(j,find(V(j,:)>Vmax))=Vmax;
V(j,find(V(j,:)<Vmin))=Vmin;
%種群更新
pop(j,:)=pop(j,:)+0.5*V(j,:);
pop(j,find(pop(j,:)>popmax))=popmax;
pop(j,find(pop(j,:)<popmin))=popmin;
%自適應變異(避免粒子群算法陷入局部最優(yōu))
if rand>0.8
k=ceil(2*rand);%ceil朝正無窮大方向取整
pop(j,k)=rand;
end
%適應度值
fitness(j)=fun(pop(j,:));
%個體最優(yōu)更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
%群體最優(yōu)更新
if fitness(j) < fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
yy(i)=fitnesszbest;
end
%% 結(jié)果分析
plot(yy)
title(['適應度曲線 ' '終止代數(shù)=' num2str(maxgen)]);
xlabel('進化代數(shù)');ylabel('適應度');
三、粒子群算法的參數(shù)設(shè)置
從上面的例子我們可以看到應用PSO解決優(yōu)化問題的過程中有兩個重要的步驟: 問題解的編碼和適應度函數(shù) 不需要像遺傳算法一樣是二進制編碼(或者采用針對實數(shù)的遺傳操作.例如對于問題 f(x) = x1^2 + x2^2+x3^2 求解, 粒子可以直接編碼為 (x1, x2, x3), 而適應度函數(shù)就是f(x). 接著我們就可以利用前面的過程去尋優(yōu).這個尋優(yōu)過程是一個疊代過程, 中止條件一般為設(shè)置為達到最大循環(huán)數(shù)或者最小錯誤
PSO中并沒有許多需要調(diào)節(jié)的參數(shù),下面列出了這些參數(shù)以及經(jīng)驗設(shè)置
粒子數(shù): 一般取 20 – 40. 其實對于大部分的問題10個粒子已經(jīng)足夠可以取得好的結(jié)果, 不過對于比較難的問題或者特定類別的問題, 粒子數(shù)可以取到100 或 200
粒子的長度: 這是由優(yōu)化問題決定, 就是問題解的長度
粒子的范圍: 由優(yōu)化問題決定,每一維可以設(shè)定不同的范圍
Vmax: 最大速度,決定粒子在一個循環(huán)中最大的移動距離,通常設(shè)定為粒子的范圍寬度,例如上面的例子里,粒子 (x1, x2, x3) x1 屬于 [-10, 10], 那么 Vmax 的大小就是 20
學習因子: c1 和 c2 通常等于 2. 不過在文獻中也有其他的取值. 但是一般 c1 等于 c2 并且范圍在0和4之間
中止條件: 最大循環(huán)數(shù)以及最小錯誤要求. 例如, 在上面的神經(jīng)網(wǎng)絡訓練例子中, 最小錯誤可以設(shè)定為1個錯誤分類, 最大循環(huán)設(shè)定為2000, 這個中止條件由具體的問題確定.
全局PSO和局部PSO: 我們介紹了兩種版本的粒子群優(yōu)化算法: 全局版和局部版. 前者速度快不過有時會陷入局部最優(yōu). 后者收斂速度慢一點不過很難陷入局部最優(yōu). 在實際應用中, 可以先用全局PSO找到大致的結(jié)果,再用局部PSO進行搜索. 代碼來自2008年數(shù)學建模東北賽區(qū)B題, #includestdaf(x).h#include<math.h>#include<time.h>#include<iostream>#include<fstream>usingnamespacestd;intc1=2;//加速因子intc2=2;//加速因子doublew=1;//慣性權(quán)重doubleWmax=1;//最大慣性權(quán)重doubleWmin=0.6;//最小慣性權(quán)重intKmax=110;//迭代次數(shù)intGdsCnt;//物資總數(shù)intconstDim=10;//粒子維數(shù)intconstPNum=50;//粒子個數(shù)intGBIndex=0;//最優(yōu)粒子索引doublea=0.6;//適應度調(diào)整因子doubleb=0.5;//適應度調(diào)整因子intXup[Dim];//粒子位置上界數(shù)組intXdown[Dim]=;//粒子位置下界數(shù)組intValue[Dim];//初始急需度數(shù)組intVmax[Dim];//最大速度數(shù)組classPARTICLE;//申明粒子節(jié)點voidCheck(PARTICLE&,int);//約束函數(shù)voidInput(ifstream&);//輸入變量voidInitial();//初始化相關(guān)變量doubleGetFit(PARTICLE&);//計算適應度voidCalculateFit();//計算適應度voidBirdsFly();//粒子飛翔voidRun(ofstream&,int=2000);//運行函數(shù)classPARTICLE//微粒類{public:intX[Dim];//微粒的坐標數(shù)組intXBest[Dim];//微粒的最好位置數(shù)組intV[Dim];//粒子速度數(shù)組doubleFit;//微粒適合度doubleFitBest;//微粒最好位置適合度};PARTICLEParr[PNum];//粒子數(shù)組intmain()//主函數(shù){ofstreamoutf(out.txt);ifstreaminf(data.txt);//關(guān)聯(lián)輸入文件inf>>GdsCnt;//輸入物資總數(shù)Input(inf);Initial();Run(outf,100);system(pause);return0;}voidCheck(PARTICLE&p,intcount)//參數(shù):p粒子對象,count物資數(shù)量{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為對象輸入數(shù)據(jù){for(inti=0;i<Dim;i++)inf>>Xup;for(inti=0;i<Dim;i++)inf>>Value;}voidInitial()//初始化數(shù)據(jù){GBIndex=0;srand((unsigned)time(NULL));//初始化隨機函數(shù)發(fā)生器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()//計算數(shù)組內(nèi)各粒子的適應度{for(inti=0;i{Parr.Fit=GetFit(Parr);}}voidBirdsFly()//粒子飛行尋找最優(yōu)解{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)//令粒子以規(guī)定次數(shù)num飛行{for(inti=0;i<num;i++){BirdsFly();outf<<(i+1)<<ends<for(intj=0;j<Dim;j++)outf<outf<<endl;}cout<<Done!<<endl;}
四、什么是粒子群算法
粒子群算法,也稱粒子群優(yōu)化算法,是近年來發(fā)展起來的一種新的進化算法,粒子群算法屬于進化算法的一種,和模擬退火算法相似,它也是從隨機解出發(fā),通過迭代尋找最優(yōu)解,它也是通過適應度來評價解的品質(zhì);
但它比遺傳算法規(guī)則更為簡單,它沒有遺傳算法的交叉和變異操作,它通過追隨當前搜索到的最優(yōu)值來尋找全局最優(yōu),這種算法以其實現(xiàn)容易、精度高、收斂快等優(yōu)點引起了學術(shù)界的重視,并且在解決實際問題中展示了其優(yōu)越性,粒子群算法是一種并行算法。
以上就是關(guān)于粒子群算法實例相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
物質(zhì)的微觀粒子模型(物質(zhì)的微觀粒子模型教案)
用包裝盒做的創(chuàng)意作品(用包裝盒做的創(chuàng)意作品圖片)