對於粒子羣算法的一些理解【含有已編譯通過的實例】

對於粒子羣算法的一些理解【含有已編譯通過的實例】

      最近做大創開始學習遺傳算法,粒子羣算法等,在大佬的帶領下,開始寫點博客,因爲是第一次寫,而且自己學的也不好(捏個是重點),就當寫給自己看啦。
      粒子羣算法跟遺傳算法一樣,都是從自然界的自然現象得到啓發,而被大牛創造出來的,在一代代的改進中逐漸趨於完善,也慢慢作用於越來越多的領域中。
      粒子羣算法據說是從鳥羣尋食中得到的啓發,一羣鳥在一個不知道食物分佈的地方覓食,它們會漸漸集中到食物最多的地方去,當然,如果地方太大的話,也可能會出現多個集中鳥比較多的地方。
這裏頭有幾個官方術語

      個人理解就是一個較優解集支配一個次優解集

      Pareto最優就是在最理想條件下,我們取得了自己最想要的結果,但是很遺憾,因爲現實問題的影響因素太多,所以我們往往陷入局部最優,或者得到一堆

較優解。於是:

在這裏插入圖片描述

      根據我們計算得到的最優解集,我們可以計算出理想的最終優化結果,就像如果發電的模型的話,我們可以得到我們想要的發電的效率啦,參量啦~~~也就是

      下面的是一個在matlab上已經測試通過的 z = x^2 + y^2的pso實現全部代碼,希望對大家有幫助。
下文代碼參考該博主代碼寫出,這個博客講PSO很贊哎!

https://blog.csdn.net/zyqblog/article/details/80829043
close all;
clc;
N = 100;%種羣規模
D = 2;%粒子維度
T = 100;%迭代次數
Xmax = 2000;
Xmin = -2000;
c1 = 1.5; %學習因子1
c2 = 1.5; %學習因子2
w = 0.8; %慣性權重
Vmax = 10; % 最大飛行速度
Vmin = -10;% 最小飛行速度
popx = rand(N,D)*(Xmax-Xmin)+Xmin;% 初試化粒子羣的位置(粒子位置是個D維向量)
popv = rand(N,D)*(Vmax-Vmin)+Vmin;%初始化粒子羣的速度(粒子速度是個D維向量)
%初始化每個歷史最優粒子
pBest = popx;
pBestValue = func_fitness(pBest);
%初始化全局歷史最優粒子
[gBestValue,index] = max(func_fitness(popx));
gBest = popx(index,:);
for t=1:T
    for i=1:N
        %更新個體的位置和速度
        popv(i,:) = w*popv(i,:)+C1*rand*(pBest(i,:)-popx(i,:))+C2*rand*(gBest-popx(i,:));
        popx(i,:) = popx(i,:)+popv(i,:);
        %邊界處理,超過定義域範圍就取該範圍極值
        index = popv(i,:)>Vmax | popv(i,:)<Vmin ;
        popv(i,index) = rand*(Vmax-Vmin)+Vmin ;
        index = find(popx(i,:)>Xmax | popx(i,:)<Xmin);
        popx(i,index) = rand*(Xmax-Xmin) + Xmin;
        %更新粒子歷史最優
        if func_fitness(popx(i,:))>pBestValue(i)
            pBest(i,:) = popx(i,:);
            pBestValue(i) = func_fitness(popx(i,:));
        elseif pBestValue(i)>gBestValue
            gBest = pBest(i,:);
            gBestValue = pBestValue(i);
        end
    end
      %每代最優解對應的目標函數值
      tBest(t) = func_objValue(gBest);%目標函數
end
figure
plot(tBest);
xlabel('迭代次數');
ylabel('適應度值');
title('適應度·進化曲線');
function [result] = func_fitness(pop)
%UNTITLED2 此處顯示有關此函數的摘要
%   此處顯示詳細說明
objValue = func_objValue(pop);
result = 1314 -objValue ;
end
function [result] = func_objValue(pop)
%NTITLED3 此處顯示有關此函數的摘要
%   此處顯示詳細說明
objValue = sum(pop,2);
result = objValue;
end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章