基于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)化曲線
figure
semilogy(curve,'Color','r','LineWidth',2)
grid on
title('收斂曲線')
xlabel('迭代次數(shù)');
ylabel('最佳適應(yīng)度');
axis tight
legend('DOA')
display(['最優(yōu)解: ', num2str(best_x)]);
display(['最小值: ', num2str(best_score)]);
end3.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語(yǔ)言字符串函數(shù)strstr,strtok,strerror的使用和實(shí)現(xiàn)
C語(yǔ)言中的字符串處理函數(shù)如strtok、strstr和strerror對(duì)于字符串的處理有著重要的作用,strtok函數(shù)用于分割字符串,它通過(guò)sep參數(shù)指定的分隔符來(lái)分割str參數(shù)指定的字符串,并返回分割后的每個(gè)子字符串2024-10-10
C++解析特殊符號(hào)tab、換行符號(hào)實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于C++解析特殊符號(hào)tab、換行符號(hào)的相關(guān)資料,這個(gè)功能在我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到,需要的朋友可以參考下2021-05-05
超詳細(xì)分析C語(yǔ)言動(dòng)態(tài)內(nèi)存管理問(wèn)題
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語(yǔ)言中動(dòng)態(tài)內(nèi)存的管理2022-04-04
C++ OpenCV實(shí)戰(zhàn)之網(wǎng)孔檢測(cè)的實(shí)現(xiàn)
這篇文章主要介紹了如何利用C++和OpenCV實(shí)現(xiàn)網(wǎng)孔檢測(cè),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,感興趣的小伙伴可以了解一下2022-05-05
C語(yǔ)言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要介紹了C語(yǔ)言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
C++無(wú)痛實(shí)現(xiàn)日期類(lèi)的示例代碼
凡是要寫(xiě)類(lèi)必須要提到六大默認(rèn)成員(六位大爺):構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、賦值重載函數(shù)、取地址重載函數(shù)(包括const對(duì)象和普通對(duì)象);那么這次的日期類(lèi)又需要伺候哪幾位大爺呢?本文就來(lái)詳細(xì)說(shuō)說(shuō)2022-10-10

