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