您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Python&Matlab如何實(shí)現(xiàn)灰狼優(yōu)化算法的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
灰狼優(yōu)化算法是一種群智能優(yōu)化算法,它的獨(dú)特之處在于一小部分擁有絕對(duì)話語(yǔ)權(quán)的灰狼帶領(lǐng)一群灰狼向獵物前進(jìn)。在了解灰狼優(yōu)化算法的特點(diǎn)之前,我們有必要了解灰狼群中的等級(jí)制度。
灰狼群一般分為4個(gè)等級(jí):處于第一等級(jí)的灰狼用α表示,處于第二階級(jí)的灰狼用β表示,處于第三階段的灰狼用δ表示,處于第四等級(jí)的灰狼用ω表示。按照上述等級(jí)的劃分,灰狼α對(duì)灰狼β、δ和ω有絕對(duì)的支配權(quán);灰狼ω對(duì)灰狼δ和ω有絕對(duì)的支配權(quán);灰狼δ對(duì)灰狼ω有絕對(duì)的支配權(quán)。
GWO 優(yōu)化過(guò)程包含了灰狼的社會(huì)等級(jí)分層、跟蹤、包圍和攻擊獵物等步驟,其步驟具體情況如下所示。
當(dāng)設(shè)計(jì) GWO 時(shí),首先需構(gòu)建灰狼社會(huì)等級(jí)層次模型。計(jì)算種群每個(gè)個(gè)體的適應(yīng)度,將狼群中適應(yīng)度最好的三匹灰狼依次標(biāo)記為α、β、δ而剩下的灰狼標(biāo)記為ω 。也就是說(shuō),灰狼群體中的社會(huì)等級(jí)從高往低排列依次為α、β、δ及 ω。GWO 的優(yōu)化過(guò)程主要由每代種群中的最好三個(gè)解(即 α、β、δ)來(lái)指導(dǎo)完成。
灰狼群體通過(guò)以下幾個(gè)公式逐漸接近并包圍獵物:
式中,t是當(dāng)前的迭代代數(shù),A和C是系數(shù)向量,Xp和X分別是獵物的位置向量和灰狼的位置向量。A和C的計(jì)算公式如下:
式中,a是收斂因子,隨著迭代次數(shù)從2線性減小到0,r1和r 2服從[ 0,1]之間的均勻分布。
狼群中其他灰狼個(gè)體Xi根據(jù)α、β和百的位置Xa、XB和Xo來(lái)更新各自的位置:
式中,Da,Dβ和D6分別表示a,β和5與其他個(gè)體間的距離;Xa,Xβ和X6分別代表a,β和5的當(dāng)前位置;C1,C2,C3是隨機(jī)向量,X是當(dāng)前灰狼的位置。
灰狼個(gè)體的位置更新公式如下:
構(gòu)建攻擊獵物模型的過(guò)程中,根據(jù)2)中的公式,a值的減少會(huì)引起 A 的值也隨之波動(dòng)。換句話說(shuō),A 是一個(gè)在區(qū)間[-a,a](備注:原作者的第一篇論文里這里是[-2a,2a],后面論文里糾正為[-a,a])上的隨機(jī)向量,其中a在迭代過(guò)程中呈線性下降。當(dāng) A 在[-1,1]區(qū)間上時(shí),則捜索代理(Search Agent)的下一時(shí)刻位置可以在當(dāng)前灰狼與獵物之間的任何位置上。
灰狼主要依賴α、β、δ的信息來(lái)尋找獵物。它們開(kāi)始分散地去搜索獵物位置信息,然后集中起來(lái)攻擊獵物。對(duì)于分散模型的建立,通過(guò)|A|>1使其捜索代理遠(yuǎn)離獵物,這種搜索方式使 GWO 能進(jìn)行全局搜索。GWO 算法中的另一個(gè)搜索系數(shù)是C。從2.2中的公式可知,C向量是在區(qū)間范圍[0,2]上的隨機(jī)值構(gòu)成的向量,此系數(shù)為獵物提供了隨機(jī)權(quán)重,以便増加(|C|>1)或減少(|C|<1)。這有助于 GWO 在優(yōu)化過(guò)程中展示出隨機(jī)搜索行為,以避免算法陷入局部最優(yōu)。值得注意的是,C并不是線性下降的,C在迭代過(guò)程中是隨機(jī)值,該系數(shù)有利于算法跳出局部,特別是算法在迭代的后期顯得尤為重要。
Step1:種群初始化:包括種群數(shù)量N,最大迭代次數(shù)Maxlter,調(diào)控參數(shù)a,A,C.
Step2:根據(jù)變量的上下界來(lái)隨機(jī)初始化灰狼個(gè)體的位置X。
Step3:計(jì)算每一頭狼的適應(yīng)度值,并將種群中適應(yīng)度值最優(yōu)的狼的位置信息保存Xα,將種群中適應(yīng)度值次優(yōu)的狼的位置信息保存為Xβ,將種群中適應(yīng)度第三優(yōu)的灰狼的位置信息保存為Xγ。
Step4:更新灰狼個(gè)體X的位置。
step5:更新參數(shù)a,A和C。
Step6:計(jì)算每一頭灰狼的適應(yīng)度值,并更新三匹頭狼的最優(yōu)位置。
Step7:判斷是否到達(dá)最大迭代次數(shù)Maxlter,若滿足則算法停止并返回Xa的值作為最終得到的最優(yōu)解,否則轉(zhuǎn)到Step4。
#=======導(dǎo)入線管庫(kù)====== import random import numpy #完整代碼見(jiàn)微信公眾號(hào):電力系統(tǒng)與算法之美 #輸入關(guān)鍵字:灰狼算法 def GWO(objf, lb, ub, dim, SearchAgents_no, Max_iter): #===初始化 alpha, beta, and delta_pos======= Alpha_pos = numpy.zeros(dim) # 位置.形成30的列表 Alpha_score = float("inf") # 這個(gè)是表示“正負(fù)無(wú)窮”,所有數(shù)都比 +inf 小;正無(wú)窮:float("inf"); 負(fù)無(wú)窮:float("-inf") Beta_pos = numpy.zeros(dim) Beta_score = float("inf") Delta_pos = numpy.zeros(dim) Delta_score = float("inf") # float() 函數(shù)用于將整數(shù)和字符串轉(zhuǎn)換成浮點(diǎn)數(shù)。 #====list列表類型============= if not isinstance(lb, list): # 作用:來(lái)判斷一個(gè)對(duì)象是否是一個(gè)已知的類型。 其第一個(gè)參數(shù)(object)為對(duì)象,第二個(gè)參數(shù)(type)為類型名,若對(duì)象的類型與參數(shù)二的類型相同則返回True lb = [lb] * dim # 生成[100,100,.....100]30個(gè) if not isinstance(ub, list): ub = [ub] * dim #========初始化所有狼的位置=================== Positions = numpy.zeros((SearchAgents_no, dim)) for i in range(dim): # 形成5*30個(gè)數(shù)[-100,100)以內(nèi) Positions[:, i] = numpy.random.uniform(0, 1, SearchAgents_no) * (ub[i] - lb[i]) + lb[ i] # 形成[5個(gè)0-1的數(shù)]*100-(-100)-100 Convergence_curve = numpy.zeros(Max_iter) #========迭代尋優(yōu)===================== for l in range(0, Max_iter): # 迭代1000 for i in range(0, SearchAgents_no): # 5 #====返回超出搜索空間邊界的搜索代理==== for j in range(dim): # 30 Positions[i, j] = numpy.clip(Positions[i, j], lb[j], ub[ j]) # clip這個(gè)函數(shù)將將數(shù)組中的元素限制在a_min(-100), a_max(100)之間,大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于a_min。 #===========以上的循環(huán)里,Alpha、Beta、Delta=========== a = 2 - l * ((2) / Max_iter); # a從2線性減少到0 for i in range(0, SearchAgents_no): for j in range(0, dim): r1 = random.random() # r1 is a random number in [0,1]主要生成一個(gè)0-1的隨機(jī)浮點(diǎn)數(shù)。 r2 = random.random() # r2 is a random number in [0,1] A1 = 2 * a * r1 - a; # Equation (3.3) C1 = 2 * r2; # Equation (3.4) # D_alpha表示候選狼與Alpha狼的距離 D_alpha = abs(C1 * Alpha_pos[j] - Positions[ i, j]); # abs() 函數(shù)返回?cái)?shù)字的絕對(duì)值。Alpha_pos[j]表示Alpha位置,Positions[i,j])候選灰狼所在位置 X1 = Alpha_pos[j] - A1 * D_alpha; # X1表示根據(jù)alpha得出的下一代灰狼位置向量 r1 = random.random() r2 = random.random() A2 = 2 * a * r1 - a; # C2 = 2 * r2; D_beta = abs(C2 * Beta_pos[j] - Positions[i, j]); X2 = Beta_pos[j] - A2 * D_beta; r1 = random.random() r2 = random.random() A3 = 2 * a * r1 - a; C3 = 2 * r2; D_delta = abs(C3 * Delta_pos[j] - Positions[i, j]); X3 = Delta_pos[j] - A3 * D_delta; Positions[i, j] = (X1 + X2 + X3) / 3 # 候選狼的位置更新為根據(jù)Alpha、Beta、Delta得出的下一代灰狼地址。 Convergence_curve[l] = Alpha_score; if (l % 1 == 0): print(['迭代次數(shù)為' + str(l) + ' 的迭代結(jié)果' + str(Alpha_score)]); # 每一次的迭代結(jié)果 #========函數(shù)========== def F1(x): s=numpy.sum(x**2); return s #===========主程序================ func_details = ['F1', -100, 100, 30] function_name = func_details[0] Max_iter = 1000#迭代次數(shù) lb = -100#下界 ub = 100#上屆 dim = 30#狼的尋值范圍 SearchAgents_no = 5#尋值的狼的數(shù)量 x = GWO(F1, lb, ub, dim, SearchAgents_no, Max_iter)
% 主程序 GWO clear close all clc %%完整代碼見(jiàn)微信公眾號(hào):電力系統(tǒng)與算法之美 %輸入關(guān)鍵字:灰狼算法 SearchAgents_no = 30 ; % 種群規(guī)模 dim = 10 ; % 粒子維度 Max_iter = 1000 ; % 迭代次數(shù) ub = 5 ; lb = -5 ; %% 初始化三匹頭狼的位置 Alpha_pos=zeros(1,dim); Alpha_score=inf; Beta_pos=zeros(1,dim); Beta_score=inf; Delta_pos=zeros(1,dim); Delta_score=inf; Convergence_curve = zeros(Max_iter,1); %% 開(kāi)始循環(huán) for l=1:Max_iter for i=1:size(Positions,1) %% 返回超出搜索空間邊界的搜索代理 Flag4ub=Positions(i,:)>ub; Flag4lb=Positions(i,:)<lb; Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb; %% 計(jì)算每個(gè)搜索代理的目標(biāo)函數(shù) fitness=sum(Positions(i,:).^2); %% 更新 Alpha, Beta, and Delta if fitness<Alpha_score Alpha_score=fitness; % Update alpha Alpha_pos=Positions(i,:); end if fitness>Alpha_score && fitness<Beta_score Beta_score=fitness; % Update beta Beta_pos=Positions(i,:); end if fitness>Alpha_score && fitness>Beta_score && fitness<Delta_score Delta_score=fitness; % Update delta Delta_pos=Positions(i,:); end end a=2-l*((2)/Max_iter); % a decreases linearly fron 2 to 0 %% 更新搜索代理的位置,包括omegas for i=1:size(Positions,1) for j=1:size(Positions,2) r1=rand(); % r1 is a random number in [0,1] r2=rand(); % r2 is a random number in [0,1] A1=2*a*r1-a; % Equation (3.3) C1=2*r2; % Equation (3.4) D_alpha=abs(C1*Alpha_pos(j)-Positions(i,j)); % Equation (3.5)-part 1 X1=Alpha_pos(j)-A1*D_alpha; % Equation (3.6)-part 1 r1=rand(); r2=rand(); A2=2*a*r1-a; % Equation (3.3) C2=2*r2; % Equation (3.4) D_beta=abs(C2*Beta_pos(j)-Positions(i,j)); % Equation (3.5)-part 2 X2=Beta_pos(j)-A2*D_beta; % Equation (3.6)-part 2 r1=rand(); r2=rand(); A3=2*a*r1-a; % Equation (3.3) C3=2*r2; % Equation (3.4) D_delta=abs(C3*Delta_pos(j)-Positions(i,j)); % Equation (3.5)-part 3 X3=Delta_pos(j)-A3*D_delta; % Equation (3.5)-part 3 Positions(i,j)=(X1+X2+X3)/3;% Equation (3.7) end end Convergence_curve(l)=Alpha_score; disp(['Iteration = ' num2str(l) ', Evaluations = ' num2str(Alpha_score)]); end %========可視化============== figure('unit','normalize','Position',[0.3,0.35,0.4,0.35],'color',[1 1 1],'toolbar','none') %% 目標(biāo)空間 subplot(1,2,1); x = -5:0.1:5;y=x; L=length(x); f=zeros(L,L); for i=1:L for j=1:L f(i,j) = x(i)^2+y(j)^2; end end surfc(x,y,f,'LineStyle','none'); xlabel('x_1'); ylabel('x_2'); zlabel('F') title('Objective space') %% 狼群算法 subplot(1,2,2); semilogy(Convergence_curve,'Color','r','linewidth',1.5) title('Convergence_curve') xlabel('Iteration'); ylabel('Best score obtained so far'); axis tight grid on box on legend('GWO') display(['The best solution obtained by GWO is : ', num2str(Alpha_pos)]); display(['The best optimal value of the objective funciton found by GWO is : ', num2str(Alpha_score)]);
感謝各位的閱讀!關(guān)于“Python&Matlab如何實(shí)現(xiàn)灰狼優(yōu)化算法”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。