【優化求解】基於matlab麻雀搜尋演算法求解3D無線感測器網路(WSN)覆蓋優化問題【含Matlab原始碼 599期】
一、簡介
麻雀搜尋演算法(Sparrow Search Algorithm, SSA)是於2020年提出的。SSA 主要是受麻雀的覓食行為和反捕食行為的啟發而提出的。該演算法比較新穎,具有尋優能力強,收斂速度快的優點。
1 演算法原理
建立麻雀搜尋演算法的數學模型,主要規則如下所述:
(1)發現者通常擁有較高的能源儲備並且在整個種群中負責搜尋到具有豐富食物的區域,為所有的加入者提供覓食的區域和方向。在模型建立中能量儲備的高低取決於麻雀個體所對應的適應度值(Fitness Value)的好壞。
(2)一旦麻雀發現了捕食者,個體開始發出鳴叫作為報警訊號。當報警值大於安全值時,發現者會將加入者帶到其它安全區域進行覓食。
(3)發現者和加入者的身份是動態變化的。只要能夠尋找到更好的食物來源,每隻麻雀都可以成為發現者,但是發現者和加入者所佔整個種群數量的比重是不變的。也就是說,有一隻麻雀變成發現者必然有另一隻麻雀變成加入者。
(4)加入者的能量越低,它們在整個種群中所處的覓食位置就越差。一些飢腸轆轆的加入者更有可能飛往其它地方覓食,以獲得更多的能量。
(5)在覓食過程中,加入者總是能夠搜尋到提供最好食物的發現者,然後從最好的食物中獲取食物或者在該發現者周圍覓食。與此同時,一些加入者為了增加自己的捕食率可能會不斷地監控發現者進而去爭奪食物資源。
(6)當意識到危險時,群體邊緣的麻雀會迅速向安全區域移動,以獲得更好的位置,位於種群中間的麻雀則會隨機走動,以靠近其它麻雀。
在模擬實驗中,我們需要使用虛擬麻雀進行食物的尋找,由n只麻雀組成的種群可表示為如下形式:
2 演算法流程
Step1: 初始化種群,迭代次數,初始化捕食者和加入者比列。
Step2:計算適應度值,並排序。
Step3:利用式(3)更新捕食者位置。
Step4:利用式(4)更新加入者位置。
Step5:利用式(5)更新警戒者位置。
Step6:計算適應度值並更新麻雀位置。
Step7:是否滿足停止條件,滿足則退出,輸出結果,否則,重複執行Step2-6;
二、原始碼
clear all clc rng('default'); %% 設定WNS覆蓋引數, %% 預設輸入引數都是整數,如果想定義小數,請自行乘以係數變為整數再做轉換。 %% 比如範圍1*1,R=0.03可以轉換為100*100,R=3; %區域範圍為AreaX*AreaY*AreaZ AreaX = 100; AreaY = 100; AreaZ = 100; N = 20 ;%覆蓋節點數 R = 15;%通訊半徑 %% 設定麻雀優化引數 pop=30; % 種群數量 Max_iteration=30; %設定最大迭代次數 lb = ones(1,3*N); ub = [AreaX.*ones(1,N),AreaY.*ones(1,N),AreaZ.*ones(1,N)]; dim = 3*N;%維度為3N,N個座標點 fobj = @(X)fun(X,N,R,AreaX,AreaY,AreaZ);%適應度函式 [Best_pos,Best_score,SSA_curve]=SSA(pop,Max_iteration,lb,ub,dim,fobj); %開始優化 %_________________________________________________________________________% % 麻雀優化演算法 % %_________________________________________________________________________% function [Best_pos,Best_score,curve]=SSA(pop,Max_iter,lb,ub,dim,fobj) ST = 0.6;%預警值 PD = 0.7;%發現者的比列,剩下的是加入者 SD = 0.2;%意識到有危險麻雀的比重 PDNumber = round(pop*PD); %發現者數量 SDNumber = round(SD*PD);%意識到有危險麻雀數量 if(max(size(ub)) == 1) ub = ub.*ones(1,dim); lb = lb.*ones(1,dim); end %種群初始化 X0=initialization(pop,dim,ub,lb); X = X0; %計算初始適應度值 fitness = zeros(1,pop); for i = 1:pop fitness(i) = fobj(X(i,:)); end [fitness, index]= sort(fitness);%排序 BestF = fitness(1); WorstF = fitness(end); GBestF = fitness(1);%全域性最優適應度值 for i = 1:pop X(i,:) = X0(index(i),:); end curve=zeros(1,Max_iter); GBestX = X(1,:);%全域性最優位置 X_new = X; for i = 1: Max_iter disp(['第',num2str(i),'次迭代']); BestF = fitness(1); WorstF = fitness(end); R2 = rand(1); for j = 1:PDNumber if(R2<ST) X_new(j,:) = X(j,:).*exp(-j/(rand(1)*Max_iter)); else X_new(j,:) = X(j,:) + randn()*ones(1,dim); end end for j = PDNumber+1:pop % if(j>(pop/2)) if(j>(pop - PDNumber)/2 + PDNumber) X_new(j,:)= randn().*exp((X(end,:) - X(j,:))/j^2); else %產生-1,1的隨機數 A = ones(1,dim); for a = 1:dim if(rand()>0.5) A(a) = -1; end end AA = A'*inv(A*A'); X_new(j,:)= X(1,:) + abs(X(j,:) - X(1,:)).*AA'; end end Temp = randperm(pop); SDchooseIndex = Temp(1:SDNumber); for j = 1:SDNumber if(fitness(SDchooseIndex(j))>BestF) X_new(SDchooseIndex(j),:) = X(1,:) + randn().*abs(X(SDchooseIndex(j),:) - X(1,:)); elseif(fitness(SDchooseIndex(j))== BestF) K = 2*rand() -1; X_new(SDchooseIndex(j),:) = X(SDchooseIndex(j),:) + K.*(abs( X(SDchooseIndex(j),:) - X(end,:))./(fitness(SDchooseIndex(j)) - fitness(end) + 10^-8)); end end %邊界控制 for j = 1:pop for a = 1: dim if(X_new(j,a)>ub) X_new(j,a) =ub(a); end if(X_new(j,a)<lb) X_new(j,a) =lb(a); end end end %更新位置 for j = 1:pop if(fitness_new(j) < GBestF) GBestF = fitness_new(j); GBestX = X_new(j,:); end end X = X_new; fitness = fitness_new; %排序更新 [fitness, index]= sort(fitness);%排序 BestF = fitness(1); WorstF = fitness(end); for j = 1:pop X(j,:) = X(index(j),:); end
三、執行結果
四、備註
版本:2014a
完整程式碼或代寫加1564658423