pso演算法代碼
『壹』 咨詢一個最簡單的PSO演算法的程序
%------基本粒子群優化演算法(Particle Swarm Optimization)-----------
%------作用:求解優化問題
%------初始格式化----------
format long;
c1=1.4962; %學習因子1
c2=1.4962; %學習因子2
w=0.7298; %慣性權重
MaxDT=1000; %最大迭代次數
D=10; %搜索空間維數(未知數個數)
N=40; %初始化群體個體數目
eps=10^(-6); %設置精度(在已知最小值時候用)
%------初始化種群的個體(可以在這里限定位置和速度的范圍)------------
for i=1:N
for j=1:D
x(i,j)=randn; %隨機初始化位置
v(i,j)=randn; %隨機初始化速度
end
end
%------先計算各個粒子的適應度,並初始化Pi和Pg----------------------
for i=1:N
p(i)=fitness(x(i,:),D);
y(i,:)=x(i,:);
end
pg=x(1,:); %Pg為全局最優
for i=2:N
if fitness(x(i,:),D)
pg=x(i,:);
end
end
%------進入主要循環,按照公式依次迭代,直到滿足精度要求------------
for t=1:MaxDT
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:),D)<p(i)
p(i)=fitness(x(i,:),D);
y(i,:)=x(i,:);
end
if p(i)
pg=y(i,:);
end
end
Pbest(t)=fitness(pg,D);
end
%------最後給出計算結果
disp('*************************************************************')
disp('函數的全局最優位置為:')
Solution=pg
disp('最後得到的優化極值為:')
Result=fitness(pg,D)
disp('*************************************************************')
%------演算法結束---
如果想要適應度函數源程序(fitness.m),可以再聯系
『貳』 如圖,如何用這個PSO演算法或遺傳演算法來求函數極值,用C語言編寫代碼
需要很多的子函數 %子程序:新物種交叉操作,函數名稱存儲為crossover.m function scro=crossover(population,seln,pc); BitLength=size(population,2); pcc=IfCroIfMut(pc);%根據交叉概率決定是否進行交叉操作,1則是,0則否 if pcc==1 chb=round(rand*(BitLength-2))+1;%在[1,BitLength-1]范圍內隨機產生一個交叉位 scro(1,:)=[population(seln(1),1:chb) population(seln(2),chb+1:BitLength)] scro(2,:)=[population(seln(2),1:chb) population(seln(1),chb+1:BitLength)] else scro(1,:)=population(seln(1),:); scro(2,:)=population(seln(2),:); end %子程序:計算適應度函數,函數名稱存儲為fitnessfun.m function [Fitvalue,cumsump]=fitnessfun(population); global BitLength global boundsbegin global boundsend popsize=size(population,1);%有popsize個個體 for i=1:popsize x=transform2to10(population(i,:));%將二進制轉換為十進制 %轉化為[-2,2]區間的實數 xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1); Fitvalue(i)=targetfun(xx);%計算函數值,即適應度 end %給適...
望採納!
『叄』 二進制PSO演算法
PSO演算法中每一粒子都被看是潛在的最優解,具體實現思路是先將粒子初始化,對於每個粒子都有一個當前位置以及根據適應度值做粒子更新的速度(Kennedy et al.,1995),通過迭代計算得到最優解。PSO粒子速度計算和對應位置更新的原理如式(8.1)、式(8.2)所示:
高光譜遙感影像信息提取技術
式中:xid是粒子;c1,c2是學習因子;w是慣性因子,是粒子速度保持更新之前粒子速度的能力;pid是目前單個粒子最優位置;pgd是整個粒子群目前得到的最優位置;rand是0~1之間的隨機數。
二進制PSO首先將粒子初始化為0和1組成的序列。二進制PSO演算法是對式(8.2)作些改變,其位置更新如式(8.3)所示(程志剛等,2007):
高光譜遙感影像信息提取技術
式中: 是 Sigmoid 函數。
『肆』 粒子群(PSO)演算法的matlab程序
%不知道你具體的問題是什麼,下面是一個最基本的pso演算法解決函數極值問題,如果是一些大型的問題,需要對速度、慣性常數、和自適應變異做進一步優化,希望對你有幫助
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;
%下面是主程序
%% 清空環境
clc
clear
%% 參數初始化
%粒子群演算法中的兩個參數
c1 = 1.49445;
c2 = 1.49445;
maxgen=200; % 進化次數
sizepop=20; %種群規模
Vmax=1;%速度限制
Vmin=-1;
popmax=5;%種群限制
popmin=-5;
%% 產生初始粒子和速度
for i=1:sizepop
%隨機產生一個種群
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; %全局最佳適應度值
%% 迭代尋優
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);%ceil朝正無窮大方向取整
pop(j,k)=rand;
end
%適應度值
fitness(j)=fun(pop(j,:));
%個體最優更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
%群體最優更新
if fitness(j) < fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
yy(i)=fitnesszbest;
end
%% 結果分析
plot(yy)
title(['適應度曲線 ' '終止代數=' num2str(maxgen)]);
xlabel('進化代數');ylabel('適應度');
以上回答你滿意么?
『伍』 什麼是粒子群演算法
粒子群演算法,也稱粒子群優化演算法(Partical Swarm Optimization),縮寫為 PSO, 是近年來發展起來的一種新的進化演算法((Evolu2tionary Algorithm - EA)。PSO 演算法屬於進化演算法的一種,和遺傳演算法相似,它也是從隨機解出發,通過迭代尋找最優解,它也是通過適應度來評價解的品質,但它比遺傳演算法規則更為簡單,它沒有遺傳演算法的「交叉」(Crossover) 和「變異」(Mutation) 操作,它通過追隨當前搜索到的最優值來尋找全局最優。這種演算法以其實現容易、精度高、收斂快等優點引起了學術界的重視,並且在解決實際問題中展示了其優越性。設想這樣一個場景:一群鳥在隨機搜索食物。在這個區域里只有一塊食物。所有的鳥都不知道食物在那裡。但是他們知道當前的位置離食物還有多遠。那麼找到食物的最優策略是什麼呢。最簡單有效的就是搜尋目前離食物最近的鳥的周圍區域。 PSO從這種模型中得到啟示並用於解決優化問題。PSO中,每個優化問題的解都是搜索空間中的一隻鳥。我們稱之為「粒子」。所有的粒子都有一個由被優化的函數決定的適應值(fitness value),每個粒子還有一個速度決定他們飛翔的方向和距離。然後粒子們就追隨當前的最優粒子在解空間中搜索。 PSO 初始化為一群隨機粒子(隨機解)。然後通過迭代找到最優解。在每一次迭代中,粒子通過跟蹤兩個"極值"來更新自己。第一個就是粒子本身所找到的最優解,這個解叫做個體極值pBest。另一個極值是整個種群目前找到的最優解,這個極值是全局極值gBest。另外也可以不用整個種群而只是用其中一部分作為粒子的鄰居,那麼在所有鄰居中的極值就是局部極值。 粒子公式 在找到這兩個最優值時,粒子根據如下的公式來更新自己的速度和新的位置: v[] = w * v[] + c1 * rand() * (pbest[] - present[]) + c2 * rand() * (gbest[] - present[]) (a) present[] = persent[] + v[] (b) v[] 是粒子的速度, w是慣性權重,persent[] 是當前粒子的位置. pbest[] and gbest[] 如前定義 rand () 是介於(0, 1)之間的隨機數. c1, c2 是學習因子. 通常 c1 = c2 = 2. 程序的偽代碼如下 For each particle ____Initialize particle END Do ____For each particle ________Calculate fitness value ________If the fitness value is better than the best fitness value (pBest) in history ____________set current value as the new pBest ____End ____Choose the particle with the best fitness value of all the particles as the gBest ____For each particle ________Calculate particle velocity according equation (a) ________Update particle position according equation (b) ____End While maximum iterations or minimum error criteria is not attained 在每一維粒子的速度都會被限制在一個最大速度Vmax,如果某一維更新後的速度超過用戶設定的Vmax,那麼這一維的速度就被限定為Vmax
『陸』 粒子群演算法
粒子群演算法(particle swarm optimization,PSO)是計算智能領域中的一種生物啟發式方法,屬於群體智能優化演算法的一種,常見的群體智能優化演算法主要有如下幾類:
除了上述幾種常見的群體智能演算法以外,還有一些並不是廣泛應用的群體智能演算法,比如螢火蟲演算法、布穀鳥演算法、蝙蝠演算法以及磷蝦群演算法等等。
而其中的粒子群優化演算法(PSO)源於對鳥類捕食行為的研究,鳥類捕食時,找到食物最簡單有限的策略就是搜尋當前距離食物最近的鳥的周圍。
設想這樣一個場景:一群鳥在隨機的搜索食物。在這個區域里只有一塊食物,所有的鳥都不知道食物在哪。但是它們知道自己當前的位置距離食物還有多遠。那麼找到食物的最優策略是什麼?最簡單有效的就是搜尋目前離食物最近的鳥的周圍區域。
Step1:確定一個粒子的運動狀態是利用位置和速度兩個參數描述的,因此初始化的也是這兩個參數;
Step2:每次搜尋的結果(函數值)即為粒子適應度,然後記錄每個粒子的個體歷史最優位置和群體的歷史最優位置;
Step3:個體歷史最優位置和群體的歷史最優位置相當於產生了兩個力,結合粒子本身的慣性共同影響粒子的運動狀態,由此來更新粒子的位置和速度。
位置和速度的初始化即在位置和速度限制內隨機生成一個N x d 的矩陣,而對於速度則不用考慮約束,一般直接在0~1內隨機生成一個50x1的數據矩陣。
此處的位置約束也可以理解為位置限制,而速度限制是保證粒子步長不超限制的,一般設置速度限制為[-1,1]。
粒子群的另一個特點就是記錄每個個體的歷史最優和種群的歷史最優,因此而二者對應的最優位置和最優值也需要初始化。其中每個個體的歷史最優位置可以先初始化為當前位置,而種群的歷史最優位置則可初始化為原點。對於最優值,如果求最大值則初始化為負無窮,相反地初始化為正無窮。
每次搜尋都需要將當前的適應度和最優解同歷史的記錄值進行對比,如果超過歷史最優值,則更新個體和種群的歷史最優位置和最優解。
速度和位置更新是粒子群演算法的核心,其原理表達式和更新方式:
每次更新完速度和位置都需要考慮速度和位置的限制,需要將其限制在規定范圍內,此處僅舉出一個常規方法,即將超約束的數據約束到邊界(當位置或者速度超出初始化限制時,將其拉回靠近的邊界處)。當然,你不用擔心他會停住不動,因為每個粒子還有慣性和其他兩個參數的影響。
粒子群演算法求平方和函數最小值,由於沒有特意指定函數自變數量綱,不進行數據歸一化。
『柒』 pso的離散演算法
很多優化問題涉及到離散或二值的變數,典型的例子包括調度問題或路由問題。而PSO演算法的更新公式和過程是面向連續空間並為其設計的,因此需要做一些修改使之適應離散空間的情況。編碼的修改可能很簡單,難點在於定義速度的意義和確定軌跡的變化。
Kennedy定義了第一個離散二進製版本的PSO演算法。微粒使用二進制字元串進行編碼。通過使用sigmoid函數,速度被限制在[0, 1]區間之內,並被解釋為「概率的變化」。Yang對該方法在量子空間進行了擴展。
Mohan提出了幾種二進制方法(直接方法、量子方法、正則方法、偏差向量方法以及混合方法),但是從有限的實驗中沒有得出什麼結論。Clerc對一些專用於某些約束優化問題如TSP問題的PSO演算法變種進行了試驗,結果顯示該方法比較有前途。Pang使用模糊矩陣來表示微粒的位置和速度,對PSO演算法的算符進行了重定義,並將其應用到TSP問題的求解。Pampara將PSO演算法與信號處理中的角調制技術結合起來,將高維二進制問題降維為一個在連續空間中定義的四維問題,並通過求解該四維問題來獲得原問題的解。Afshinmanesh重新定義了離散PSO演算法中的加法與乘法,並使用人工免疫系統中的陰性選擇來實現速度限制Vmax。
Hu提出了一種改進PSO演算法來處理排列問題。微粒被定義為一組特定值的排列,速度基於兩個微粒的相似度重新定義,微粒根據由它們的速度所定義的隨機率來變換到一個新的排列。引入了一個變異因子來防止當前的pBest陷入局部最小。在n皇後問題上的初步研究顯示改進的PSO演算法在解決約束滿意問題方面很有前途。
Migliore對原始的二進制PSO演算法進行了一些改進,提出了可變行為二進制微粒群演算法(VB-BPSO)和可變動態特性二進制微粒群演算法(VD-BPSO)。VB-BPSO演算法按照連續PSO演算法的速度更新公式的思想設計了一個新的速度更新公式,用來確定微粒位置向量每一位為1的概率。而VD-BPSO演算法則是根據一定規則在兩組不同參數確定的VB-BPSO演算法之間切換。Migliore應用該演算法設計出一種簡單魯棒的自適應無源天線。
Parsopoulos以標准函數為例測試微粒群優化演算法解決整數規劃問題的能力。Salman將任務分配問題抽象為整數規劃模型並提出基於微粒群優化演算法的解決方法。兩者對迭代產生的連續解均進行舍尾取整後評價其質量。但是PSO演算法生成的連續解與整數規劃問題的目標函數評價值之間存在多對一的映射,以整型變數表示的目標函數不能准確反映演算法中連續解的質量,而由此導致的冗餘解空間與相應的冗餘搜索降低了演算法的收斂效率。
高尚採用交叉策略和變異策略,將PSO演算法用來解決集合劃分問題。趙傳信重新定義了微粒群位置和速度的加法與乘法操作,並將PSO演算法應用到0/1背包問題求解中。EL-Gallad在PSO演算法中引入探索和勘探兩個運算元,用於求解排序問題。Firpi提出了BPSO演算法的一種保證收斂的版本(但是並未證明其保證收斂性),並將其應用到特徵選擇問題。
上述離散PSO演算法都是間接的優化策略,根據概率而非演算法本身確定二進制變數,未能充分利用PSO演算法的性能。在處理整數變數時,PSO演算法有時候很容易陷入局部最小。原始PSO演算法的思想是從個體和同伴的經驗進行學習,離散PSO演算法也應該借鑒該思想。高海兵基於傳統演算法的速度—位移更新操作,在分析微粒群優化機理的基礎上提出了廣義微粒群優化模型(GPSO),使其適用於解決離散及組合優化問題。GPSO 模型本質仍然符合微粒群優化機理,但是其微粒更新策略既可根據優化問題的特點設計,也可實現與已有方法的融合。基於類似的想法,Goldbarg將局部搜索和路徑重連過程定義為速度運算元,來求解TSP問題。
『捌』 求把MATLAB的pso源代碼演算法修改為 qpso演算法 要求返回參數相同
下面的代碼是量子群優化演算法,你參照著改下:
popsize=20;
MAXITER=2000;
dimension=30;
irange_l=-5.12;
irange_r=5.12;
xmax=10;
sum1=0;
sum2=0;
mean=0;
st=0;
runno=10;
data1=zeros(runno,MAXITER);
for run=1:runno
T=cputime;
x=(irange_r- irange_l)*rand(popsize,dimension,1) + irange_l;
pbest=x;
gbest=zeros(1,dimension);
for i=1:popsize
f_x(i)=f3(x(i,:));
f_pbest(i)=f_x(i);
end
g=min(find(f_pbest==min(f_pbest(1:popsize))));
gbest=pbest(g,:);
f_gbest=f_pbest(g);
MINIUM=f_pbest(g);
for t=1:MAXITER
beta=(1-0.5)*(MAXITER-t)/MAXITER+0.5;
mbest=sum(pbest)/popsize;
for i=1:popsize
fi=rand(1,dimension);
p=fi.*pbest(i,:)+(1-fi).*gbest;
u=rand(1,dimension);
b=beta*(mbest-x(i,:));
v=-log(u);
y=p+((-1).^ceil(0.5+rand(1,dimension))).*b.*v;
x(i,:)=y;
x(i,:)=sign(y).*min(abs(y),xmax);
f_x(i)=f3(x(i,:));
if f_x(i)<f_pbest(i)
pbest(i,:)=x(i,:);
f_pbest(i)=f_x(i);
end
if f_pbest(i)<f_gbest
gbest=pbest(i,:);
f_gbest=f_pbest(i);
end
MINIUM=f_gbest;
end
data1(run,t)=MINIUM;
if MINIUM>1e-007
mean=t;
end
end
sum1=sum1+mean;
sum2=sum2+MINIUM;
%MINIUM
time=cputime-T;
st=st+time;
end
av1=sum1/10; %輸出平均收驗代數
av2=sum2/10; %輸出平均最優解
st/10 %就是最後anw輸出的解