HOME 首頁
SERVICE 服務產(chǎn)品
XINMEITI 新媒體代運營
CASE 服務案例
NEWS 熱點資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    粒子群算法實例(粒子群算法實例復現(xiàn))

    發(fā)布時間:2023-04-14 10:02:49     稿源: 創(chuàng)意嶺    閱讀: 137        

    大家好!今天讓創(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

    本文目錄:

    粒子群算法實例(粒子群算法實例復現(xiàn))

    一、求粒子群算法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;}

    粒子群算法實例(粒子群算法實例復現(xiàn))

    四、什么是粒子群算法

    粒子群算法,也稱粒子群優(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ì)的微觀粒子模型教案)

    標準模型61種粒子(標準模型61種粒子有哪些)

    杭州主城區(qū)域劃分(杭州主城區(qū)域劃分圖最新)

    用包裝盒做的創(chuàng)意作品(用包裝盒做的創(chuàng)意作品圖片)