【優化演算法】動態粒子群演算法的動態環境尋優演算法【含Matlab原始碼 1125期】
一、簡介
粒子群演算法源於複雜適應系統(Complex Adaptive System,CAS)。CAS理論於1994年正式提出,CAS中的成員稱為主體。比如研究鳥群系統,每個鳥在這個系統中就稱為主體。主體有適應性,它能夠與環境及其他的主體進行交流,並且根據交流的過程“學習”或“積累經驗”改變自身結構與行為。整個系統的演變或進化包括:新層次的產生(小鳥的出生);分化和多樣性的出現(鳥群中的鳥分成許多小的群);新的主題的出現(鳥尋找食物過程中,不斷髮現新的食物)。
所以CAS系統中的主體具有4個基本特點(這些特點是粒子群演算法發展變化的依據):
首先,主體是主動的、活動的。
主體與環境及其他主體是相互影響、相互作用的,這種影響是系統發展變化的主要動力。
環境的影響是巨集觀的,主體之間的影響是微觀的,巨集觀與微觀要有機結合。
最後,整個系統可能還要受一些隨機因素的影響。
粒子群演算法就是對一個CAS系統---鳥群社會系統的研究得出的。
粒子群演算法( Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy於1995年提出,它的基本概念源於對鳥群覓食行為的研究。設想這樣一個場景:一群鳥在隨機搜尋食物,在這個區域裡只有一塊食物,所有的鳥都不知道食物在哪裡,但是它們知道當前的位置離食物還有多遠。那麼找到食物的最優策略是什麼呢?最簡單有效的就是搜尋目前離食物最近的鳥的周圍區域。
PSO演算法就從這種生物種群行為特性中得到啟發並用於求解優化問題。在PSO中,每個優化問題的潛在解都可以想象成d維搜尋空間上的一個點,我們稱之為“粒子”(Particle),所有的粒子都有一個被目標函式決定的適應值(Fitness Value ),每個粒子還有一個速度決定他們飛翔的方向和距離,然後粒子們就追隨當前的最優粒子在解空間中搜索。Reynolds對鳥群飛行的研究發現。鳥僅僅是追蹤它有限數量的鄰居但最終的整體結果是整個鳥群好像在一箇中心的控制之下.即複雜的全域性行為是由簡單規則的相互作用引起的。
二、原始碼
%% 動態粒子群演算法 %% 清空環境 clear clc %% 設定雙峰引數 % 設定con1引數 X1 = 25; Y1 = 25; H1 =410; %設定con2引數 H2=zeros(1,1200); i=1:200; H2(i)=450-fix(i/5); i=201:700; H2(i)=410; i=701:1000; H2(i)=350 + fix((i-500)/10)*3; i=1001:1200; H2(i) = 500; X2=zeros(1,1200); i=1:1200; Y2(i)=-25; i=1:500; X2(i)=-25 + (i-1)*25/500; i=501:1000; X2(i)=0; i=1001:1200; X2(i)=(i-1000)*25/200; %% 初始化粒子和敏感粒子 % 種群規模 n = 20; % 粒子和敏感粒子 pop = unidrnd(501,[n,2]); popTest = unidrnd(501,[5*n,2]); % 數字高度 h = DF1function(X1,Y1,H1,X2(1),Y2(1),H2(1)); V = unidrnd(100,[n,2])-50; Vmax=25;Vmin=-25; %% 粒子和敏感粒子適應度值 fitness=zeros(1,n); fitnessTest=zeros(1,n); for i=1:n fitness(i)=h(pop(i,1),pop(i,2)); fitnessTest(i)=h(popTest(i,1),popTest(i,2)); end oFitness=sum(fitnessTest); %敏感粒子 [value,index]=max(fitness); popgbest=pop; popzbest=pop(index,:); fitnessgbest=fitness; fitnesszbest=fitness(index); %% 演算法引數 vmax = 10; vmin = -10; popMax=501; popMin=1; m = 2; nFitness = oFitness; Tmax=100; %每次迭代次數 fitnessRecord=zeros(1,1200); %% 迴圈尋找最優點 for k = 1:1200 k % 新數字地圖 h = DF1function(X1,Y1,H1,X2(k),Y2(k),H2(k)); % 敏感粒子變化 for i=1:5*n fitnessTest(i)=h(popTest(i,1),popTest(i,2)); end oFitness=sum(fitnessTest); % 變化超過閾值,重新初始化 if abs(oFitness - nFitness)>1 index=randperm(20); pop(index(1:10),:)=unidrnd(501,[10,2]); V(index(1:10),:)=unidrnd(100,[10,2])-50; end % 粒子搜尋 for i=1:Tmax for j=1:n % 速度更新 V(j,:)=V(j,:)+floor(rand*(popgbest(j,:)-pop(j,:)))+floor(rand*(popzbest - pop(j,:))); index1=find(V(j,:)>Vmax); V(j,index1)=Vmax; index2=find(V(j,:)<Vmin); V(j,index2)=Vmin; % 個體更新 pop(j,:)=pop(j,:)+V(j,:); index1=find(pop(j,:)>popMax); pop(j,index1)=popMax; index2=find(pop(j,:)<popMin); pop(j,index2)=popMin; % 新適應度值 fitness(j)=h(pop(j,1),pop(j,2)); % 個體極值更新 if fitness(j) > fitnessgbest(j) popgbest(j,:) = pop(j,:); fitnessgbest(j) = fitness(j); end % 群體極值更新 if fitness(j) > fitnesszbest popzbest= pop(j,:); fitnesszbest = fitness(j); end end end fitnessRecord(k)=fitnesszbest; fitnesszbest=0; fitnessgbest=zeros(1,20); end
三、執行結果
四、備註
版本:2014a
完整程式碼或代寫加QQ1564658423