最近做大創開始學習遺傳演算法,粒子群演算法等,在大佬的帶領下,開始寫點部落格,因為是第一次寫,而且自己學的也不好(捏個是重點),就當寫給自己看啦。
粒子群演算法跟遺傳演算法一樣,都是從自然界的自然現象得到啟發,而被大牛創造出來的,在一代代的改進中逐漸趨於完善,也慢慢作用於越來越多的領域中。
粒子群演算法據說是從鳥群尋食中得到的啟發,一群鳥在乙個不知道食物分布的地方覓食,它們會漸漸集中到食物最多的地方去,當然,如果地方太大的話,也可能會出現多個集中鳥比較多的地方。
這裡頭有幾個官方術語
較優解。於是:
根據我們計算得到的最優解集,我們可以計算出理想的最終優化結果,就像如果發電的模型的話,我們可以得到我們想要的發電的效率啦,參量啦~~~也就是
下文**參考該博主**寫出,這個部落格講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...