對於粒子群演算法的一些理解 含有已編譯通過的例項

2021-08-29 12:30:13 字數 2253 閱讀 2051

最近做大創開始學習遺傳演算法,粒子群演算法等,在大佬的帶領下,開始寫點部落格,因為是第一次寫,而且自己學的也不好(捏個是重點),就當寫給自己看啦。

粒子群演算法跟遺傳演算法一樣,都是從自然界的自然現象得到啟發,而被大牛創造出來的,在一代代的改進中逐漸趨於完善,也慢慢作用於越來越多的領域中。

粒子群演算法據說是從鳥群尋食中得到的啟發,一群鳥在乙個不知道食物分布的地方覓食,它們會漸漸集中到食物最多的地方去,當然,如果地方太大的話,也可能會出現多個集中鳥比較多的地方。

這裡頭有幾個官方術語

較優解。於是:

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

下文**參考該博主**寫出,這個部落格講pso很讚哎!

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,:)xmax | popx(i,:)pbestvalue(i)

pbest(i,:) = popx(i,:);

pbestvalue(i) = func_fitness(popx(i,:));

elseif pbestvalue(i)>gbestvalue

gbest = pbest(i,:);

gbestvalue = pbestvalue(i);

endend

%每代最優解對應的目標函式值

tbest(t) = func_objvalue(gbest);%目標函式

endfigure

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

對於切片的一些理解

使用技巧 type struct 乙個切片是由資料指標加上長度和容量組成的,類似與c 中的vector。var a int 等價於nil b int 表示乙個空的切片,不等於nil c int len,cap都為3的切片 d c 2 cap為3,len為2。與c共享一片記憶體位址 e c 0 2 c...

對於java 集合的一些理解

list set繼承自collection儲存引用型別 且只能乙個乙個儲存 arraylist linkedlist vector 都是繼承自list arraylist linkedlist初始化為10 擴容後為1.5倍 vector 為2倍 arraylist 底層採用的資料結構為陣列儲存元素,...

對於多執行緒的一些理解

實現多執行緒的兩種方法 繼承thread類 實現runnable介面 jdk1.5之後提供了乙個心得callable介面 在啟動多執行緒的時候必須通過start 方法,而不能直接呼叫run 方法 原因 先來看下start 方法在thread類中的定義 public synchronized void...