基于Matlab實(shí)現(xiàn)野狗優(yōu)化算法的示例代碼
1.概述
野狗優(yōu)化算法(Dingo Optimization Algorithm, DOA)模仿澳大利亞野狗的社交行為。DOA算法的靈感來(lái)源于野狗的狩獵策略,即迫害攻擊、分組策略和食腐行為。為了提高該方法的整體效率和性能,在DOA中制定了三種與四條規(guī)則相關(guān)聯(lián)的搜索策略,這些策略和規(guī)則在搜索空間的強(qiáng)化(開(kāi)發(fā))和多樣化(探索)之間提供了一種精確的平衡。
該算法的優(yōu)點(diǎn):尋優(yōu)能力強(qiáng),收斂速度快等特點(diǎn)。
2.捕食過(guò)程的數(shù)學(xué)模型
2.1 種群初始化
野狗種群在搜索邊界內(nèi)隨機(jī)初始化:
其中,lbi和ubi分別表示個(gè)體的上下邊界,randi是[0,1]之間的隨機(jī)數(shù)。
2.2 群體攻擊過(guò)程
捕食者通常使用高度智能的狩獵技術(shù),野狗通常單獨(dú)捕食小獵物,如兔子,但當(dāng)捕食大獵物,如袋鼠時(shí),它們會(huì)成群結(jié)隊(duì)。野狗能找到獵物的位置并將其包圍,其行為如上所示:
其中,t代表當(dāng)前的迭代次數(shù),是野狗新位置; na是在[2,SizePop/2]的逆序中生成的隨機(jī)整數(shù),其中SizePop是野狗種群的規(guī)模;
是將攻擊的野狗的子集,其中
是隨機(jī)生成的野狗種群;
是當(dāng)前野狗的位置
是上一次迭代中發(fā)現(xiàn)的最佳野狗;β1是在[-2.2]內(nèi)均勻生成的隨機(jī)數(shù),它是一個(gè)比例因子,可改變野狗軌跡的大小。
2.3 迫害攻擊過(guò)程
野狗通常捕獵小獵物,直到單獨(dú)捕獲為止。行為模擬為:
其中,是野狗新位置,
是上一次迭代中發(fā)現(xiàn)的最佳野狗,β2的值與式2.2中的值相同,β2是在[-1,1]區(qū)間內(nèi)均勻生成的隨機(jī)數(shù),r1是在從1到最大搜索代理(野狗)大小的區(qū)間內(nèi)生成的隨機(jī)數(shù),
是隨機(jī)選擇的第r1個(gè)野狗,其中i≠r1。
2.4 野狗的存活率
在DOA中,野狗的存活率值由下式給出:
其中,fitnessmax和fitnessmin分別是當(dāng)前一代中最差和最佳的適應(yīng)度值,而fitness(i)是第i個(gè)野狗的當(dāng)前適應(yīng)度值。式(5)中的生存向量包含[0,1]區(qū)間內(nèi)的歸一化適應(yīng)度。
3.Matlab代碼實(shí)現(xiàn)
3.1 代碼
%====歡迎關(guān)注公眾號(hào):電力系統(tǒng)與算法之美==== function DOA() %% ====參數(shù)設(shè)置==== popsize=20; % 種群規(guī)模 Iteration=1000; % 迭代次數(shù) lb = -10; % 各維度的下限 ub = 10; % 各維度的上限 dim = 2; % 優(yōu)化變量的個(gè)數(shù) P= 0.5; % Hunting or Scavenger rate. Q= 0.7; % Group attack or persecution? beta1= -2 + 4* rand(); % -2 < beta < 2 beta2= -1 + 2* rand(); % -1 < beta2 < 1 naIni= 2; % minimum number of dingoes that will attack naEnd= popsize /naIni; % maximum number of dingoes that will attack na= round(naIni + (naEnd-naIni) * rand()); % number of dingoes that will attack %% ====初始化種群位置===== Positions=lb + (ub - lb).*rand(popsize, dim); for i=1:size(Positions,1) Fitness(i)=sum(Positions(i,:).^2); % get fitness end [best_score, minIdx]= min(Fitness); % the min fitness value vMin and the position minIdx best_x= Positions(minIdx,:); % the best vector [worst_score, ~]= max(Fitness); % the max fitness value vMax and the position maxIdx curve=zeros(1,Iteration); %% Section 2.2.4 Dingoes'survival rates for i=1:size(Fitness,2) survival(i)= (worst_score-Fitness(i))/(worst_score - best_score); end %% =====開(kāi)始循環(huán)=========== for t=1:Iteration for r=1:popsize if rand() < P % Hunting sumatory=0; c=1; vAttack=[]; while(c<=na) idx =round( 1+ (popsize-1) * rand()); band= 0; for i=1:size(vAttack, 2) if idx== vAttack(i) band=1; break; end end if ~band vAttack(c) = idx; c=c+1; end end for j=1:size(vAttack,2) sumatory= sumatory + Positions(vAttack(j),:)- Positions(r,:); end sumatory=sumatory/na; if rand() < Q % group attack v(r,:)= beta1 * sumatory-best_x; % Strategy 1: Eq.2 else % Persecution r1= round(1+ (popsize-1)* rand()); % v(r,:)= best_x + beta1*(exp(beta2))*((Positions(r1,:)-Positions(r,:))); % end else % Scavenger r1= round(1+ (popsize-1)* rand()); if rand() < 0.5 val= 0; else val=1; end v(r,:)= (exp(beta2)* Positions(r1,:)-((-1)^val)*Positions(r,:))/2; % end if survival(r) <= 0.3 % Section 2.2.4, Algorithm 3 - Survival procedure band=1; while band r1= round(1+ (popsize-1)* rand()); r2= round(1+ (popsize-1)* rand()); if r1 ~= r2 band=0; end end if rand() < 0.5 val= 0; else val=1; end v(r,:)= best_x + (Positions(r1,:)-((-1)^val)*Positions(r2,:))/2; % Section 2.2.4, Strategy 4: Eq.6 end % Return back the search agents that go beyond the boundaries of the search space . Flag4ub=v(r,:)>ub; Flag4lb=v(r,:)<lb; v(r,:)=(v(r,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb; % Evaluate new solutions Fnew= sum(v(r,:).^2); % Update if the solution improves if Fnew <= Fitness(r) Positions(r,:)= v(r,:); Fitness(r)= Fnew; end if Fnew <= best_score best_x= v(r,:); best_score= Fnew; end end curve(t)= best_score; [worst_score, ~]= max(Fitness); for i=1:size(Fitness,2) survival(i)= (worst_score-Fitness(i))/(worst_score - best_score); end end %======結(jié)束優(yōu)化=============== %% 進(jìn)化曲線(xiàn) figure semilogy(curve,'Color','r','LineWidth',2) grid on title('收斂曲線(xiàn)') xlabel('迭代次數(shù)'); ylabel('最佳適應(yīng)度'); axis tight legend('DOA') display(['最優(yōu)解: ', num2str(best_x)]); display(['最小值: ', num2str(best_score)]); end
3.2 結(jié)果
到此這篇關(guān)于基于Matlab實(shí)現(xiàn)野狗優(yōu)化算法的示例代碼的文章就介紹到這了,更多相關(guān)Matlab野狗優(yōu)化算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼
HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無(wú)狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請(qǐng)求,需要的朋友可以參考下2023-11-11C++語(yǔ)言編寫(xiě)寫(xiě)日志類(lèi)
這篇文章主要介紹了C++語(yǔ)言編寫(xiě)寫(xiě)日志類(lèi)的相關(guān)資料,支持寫(xiě)日志級(jí)別設(shè)置、支持多線(xiàn)程、支持可變形參表寫(xiě)日志,需要的朋友可以參考下2015-12-12C++多重繼承引發(fā)的重復(fù)調(diào)用問(wèn)題與解決方法
這篇文章主要介紹了C++多重繼承引發(fā)的重復(fù)調(diào)用問(wèn)題與解決方法,結(jié)合具體實(shí)例形式分析了C++多重調(diào)用中的重復(fù)調(diào)用問(wèn)題及相應(yīng)的解決方法,需要的朋友可以參考下2018-05-05C語(yǔ)言實(shí)現(xiàn)電器銷(xiāo)售管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電器銷(xiāo)售管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C++?Socket實(shí)現(xiàn)TCP與UDP網(wǎng)絡(luò)編程
本文主要介紹了C++?Socket實(shí)現(xiàn)TCP與UDP網(wǎng)絡(luò)編程,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01淺析內(nèi)存對(duì)齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局
當(dāng)在C中定義了一個(gè)結(jié)構(gòu)類(lèi)型時(shí),它的大小是否等于各字段(field)大小之和?編譯器將如何在內(nèi)存中放置這些字段?ANSI C對(duì)結(jié)構(gòu)體的內(nèi)存布局有什么要求?而我們的程序又能否依賴(lài)這種布局2013-09-09C語(yǔ)言中fchdir()函數(shù)和rewinddir()函數(shù)的使用詳解
這篇文章主要介紹了C語(yǔ)言中fchdir()函數(shù)和rewinddir()函數(shù)的使用詳解,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09解析C語(yǔ)言中空指針、空指針常量、NULL & 0的詳解
本篇文章是對(duì)C語(yǔ)言中空指針、空指針常量、NULL & 0 進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05