Matlab群體智能優化算法之海象優化算法(WO)

文章目錄

    • 一、靈感來源
    • 二、算法的初始化
    • 三、GTO的數學模型
      • Phase1:危險信號和安全信號
      • Phase2:遷移(探索)
      • Phase3:繁殖(開發)
    • 四、流程圖
    • 五、偽代碼
    • 六、算法復雜度
    • 七、WO搜索示意圖
    • 八、實驗分析和結果
      • 23個常見的基礎測試函數
      • CEC2021測試函數
      • 實際工程優化問題

Walrus optimizer: A novel nature-inspired metaheuristic algorithm

Walrus optimizer: A novel nature-inspired metaheuristic algorithm

摘要:該文獻Introduction介紹了為什么做這個元啟發式算法的原因;Related works列舉了2021-2023年一些算法。我將按照自己理解完全復現這篇文章,包括理論介紹、完整的實驗部分。個人能力有限,如有不足,還請見諒。參考文獻:Han M, Du Z, Yuen K, et al. Walrus Optimizer: A novel nature-inspired metaheuristic algorithm[J]. Expert Systems with Applications, 2023: 122413.

注:僅記錄學習,如有侵權,聯系刪除。

  • 1、所寫內容只是個人理解,如有錯誤,還請包涵
  • 2、所用主題為slandarer提供的墨滴模板
  • 3、CSDN:勉為其難免免
  • 4、微信公眾號:飄散在人間的一縷青絲

一、靈感來源

??海象是海洋中除鯨魚外最大的哺乳動物。海象主要生活在北極或附近的溫帶水域,海象是群居動物,過著兩棲生活。海象群的數量從幾十到幾百到幾千不等。它的身體是圓柱形的,粗壯而肥胖,頭部扁平,槍口末端鈍。在上唇周圍有大約400根長而硬的胡須,帶有血管和神經,導致觸覺敏銳。海象最獨特的特征是那對白色、發育良好的上犬齒,它們在其一生中不斷生長,形成象牙。象牙可用于自衛,在泥沙中挖掘蛤蜊、蝦和螃蟹等食物,或在冰上攀爬時支撐身體。

??海象龐大的身體看起來很笨重,但在水中很靈活。在眾多的海洋動物中,海象是最好的潛水員。他們可以在水中潛水 20 分鐘,深度為 500 m。海象潛入海底后可以在水下停留長達 2 小時,一旦需要新鮮空氣,它們可以在 3 分鐘內浮出水面。

??海象具有很強的社區意識,如下所示:

??(1)、當繁殖季節開始時,海象會在海灘上建立自己的領地。最好的位置被最強壯的男性占據。領土的面積根據男性占據的女性數量而變化。

??(2)、海象習慣于生活在陽光無法到達的海洋深水區。像蝙蝠和海豚一樣,海象缺乏獨特的視力;它們依靠合理的定位進行覓食,并通過與同齡人交流來共享食物信息。

??(3)、海象有很強的社交習慣,當它們在水中遇到虎鯨時,它們會采取集體防御策略來保護自己并幫助受傷的虎鯨。長期的生存斗爭經驗使海象無法放松警惕。在這一點上,兩只海象充當警衛。一旦他們的同類受傷,他們就會去幫忙。

??受海象遷徙、繁殖、棲息和覓食行為的啟發(如圖1所示),我們首次提出了一種新的元啟發式算法WO算法。這里需要澄清兩個假設:

??(1)、海象種群通過危險和安全信號來判斷種群行為。

??(2)、海象種群的行為和角色劃分在海象算法中建模。具體來說,海象算法假設雄性、雌性和幼年海象之間的社會結構和相互作用。

海象行為和種群劃分

??創新之處在于,海象群中的“義警”是影響象群方向的決定性因素。“治安隊員”發出的[危險信號]及[安全信號],在[行動計劃]的執行過程中起著關鍵作用。在WO中,“危險信號”用于確定WO是執行勘探階段還是開發階段。當“危險信號”滿足一定條件時,海象群遷移到解空間內的新域,這是算法早期階段的探索階段。相反,海象群繁殖,這是算法后期的開發階段。“安全信號”在開發階段起著關鍵作用,它影響著海象是選擇棲息行為還是覓食。其中,雄性海象、雌性海象和幼年海象在棲息行為中相互作用,使種群朝著有利于生存的方向移動;覓食行為包括典型的聚集和逃跑現象,這些現象由“危險信號”控制。在有序的警務環境中,海象群可以避免被捕食者捕獲或死亡(落入局部最佳狀態),并實現種群增長(尋找全局最佳狀態)。

二、算法的初始化

??X代表WO種群矩陣, X i = ( x i , 1 , x i , 2 , . . . , x i , m ) X_{i}=(x_{i,1},x_{i,2},...,x_{i,m}) Xi?=(xi,1?,xi,2?,...,xi,m?)是WO的第i個成員(候選解)。
??F代表適應度函數值。
X = [ X 1 ? X i ? X N ] N × m = [ x 1 , 1 ? x 1 , j ? x 1 , m ? ? ? ? x i , 1 ? x i , j ? x i , m ? ? ? ? x N , 1 ? x N , j ? x N , m ] N × m X=\left[\begin{array}{c} X_{1} \\ \vdots \\ X_{i} \\ \vdots \\ X_{N} \end{array}\right]_{N \times m}=\left[\begin{array}{ccccc} x_{1,1} & \cdots & x_{1, j} & \cdots & x_{1, m} \\ \vdots & \ddots & \vdots & & \vdots \\ x_{i, 1} & \cdots & x_{i, j} & \cdots & x_{i, m} \\ \vdots & & \vdots & \ddots & \vdots \\ x_{N, 1} & \cdots & x_{N, j} & \cdots & x_{N, m} \end{array}\right]_{N \times m} X= ?X1??Xi??XN?? ?N×m?= ?x1,1??xi,1??xN,1???????x1,j??xi,j??xN,j???????x1,m??xi,m??xN,m?? ?N×m?
x i , j = l b j + rand? ? ( u b j ? l b j ) , i = 1 , 2 , … , N , j = 1 , 2 , … , m x_{i, j}=lb_{j}+\text { rand } \cdot\left(ub_{j}-lb_{j}\right), i=1,2, \ldots, N, j=1,2, \ldots, m xi,j?=lbj?+?rand??(ubj??lbj?),i=1,2,,N,j=1,2,,m
F = [ F 1 ? F i ? F N ] N × 1 = [ F ( X 1 ) ? F ( X i ) ? F ( X N ) ] N × 1 F=\left[\begin{array}{c} F_{1} \\ \vdots \\ F_{i} \\ \vdots \\ F_{N} \end{array}\right]_{N \times 1}=\left[\begin{array}{c} F\left(X_{1}\right) \\ \vdots \\ F\left(X_{i}\right) \\ \vdots \\ F\left(X_{N}\right) \end{array}\right]_{N \times 1} F= ?F1??Fi??FN?? ?N×1?= ?F(X1?)?F(Xi?)?F(XN?)? ?N×1?

??式中: x i , j x_{i, j} xi,j?代表第i個成員的第j個變量的值;N是種群大小;m是維度;rand代表[0,1]之間的隨機數; l b j lb_{ j} lbj?代表下限; u b j ub_{ j} ubj?代表上限。

三、GTO的數學模型

??海象種群分為成年和幼體,分別占種群的90%和10%。在成年海象中,雄性與雌性的比例為1:1。

Phase1:危險信號和安全信號

??海象在覓食和棲息時都非常警惕。會有1至2只海象作為警衛在周圍巡邏,一旦發現意外情況,會立即發出危險信號。其中危險信號和安全信號定義如下:

Dangersignal? = A ? R α = 1 ? t / T A = 2 × α R = 2 × r 1 ? 1 \begin{aligned} & \text { Dangersignal }=A^* R \\ & \alpha=1-t / T \\ & A=2 \times \alpha \\ & R=2 \times r_1-1 \end{aligned} ??Dangersignal?=A?Rα=1?t/TA=2×αR=2×r1??1?

??其中 A A A R R R是危險因子, α \alpha α隨著迭代次數的增加,從1減小到0。 Levy? ( Dim? ) \text { Levy }(\text { Dim }) ?Levy?(?Dim?)Levy飛行 T T T是最大迭代次數。

??WO中危險信號對應的安全信號定義如下:
Safetysignal? = r 2 \begin{aligned} & \text { Safetysignal }=r_2 \\ \end{aligned} ??Safetysignal?=r2??
??其中 r 1 r_1 r1? r 2 r_2 r2?是在[0,1]內的隨機數。

Phase2:遷移(探索)

??當危險因子過高時,海象群會遷移到更適合種群生存的地區。在此階段,海象位置更新如下:

X i , j t + 1 = X i , j t + Migrationstep? X_{i, j}^{t+1}=X_{i, j}^t+\text { Migrationstep } Xi,jt+1?=Xi,jt?+?Migrationstep?
Migrationstep? = ( X m t ? X n t ) ? β ? r 3 2 \text { Migrationstep } =\left(X_m^t-X_n^t\right) \bullet \beta \bullet r_3{ }^2 ?Migrationstep?=(Xmt??Xnt?)?β?r3?2
β = 1 ? 1 1 + exp ? ( ? t ? T 2 T × 10 ) \beta=1-\frac{1}{1+\exp \left(-\frac{t-\frac{T}{2}}{T} \times 10\right)} β=1?1+exp(?Tt?2T??×10)1?
??其中 X i , j t + 1 X_{i, j}^{t+1} Xi,jt+1?是i個個體在第j個維度上的更新位置, X i , j t X_{i, j}^{t} Xi,jt?是當前位置,Migration_step是海象運動的步長,從種群中隨機選擇兩個警惕者,其位置對應于 X m t X_m^t Xmt? X m n X_m^n Xmn?, β \beta β是遷移步長控制因子,它隨著迭代變化為平滑曲線, r 3 r_3 r3?是在[0,1]內的隨機數。

Phase3:繁殖(開發)

??與遷徙相反,當風險因素較低時,海象群傾向于在洋流中繁殖。在繁殖過程中,主要有兩種行為,陸上棲息和水下覓食。數學模型如下。

??(1)棲息行為

??雄性、雌性和幼年海象是我們對種群成員的分類。他們有不同的方式來更新他們的立場。

??第 1 步:雄性海象的重新分布

??采用Halton序列分布進行雄性海象位置更新,可以擴大種群的搜索分布

??第 2 步:更新雌性海象的位置

??雌性海象受到雄性海象 Male? i , j t \text { Male }_{i, j}^t ?Male?i,jt?和領頭海象 X best? t X_{\text {best }}^t Xbest?t?的影響。隨著迭代過程的進行,雌性海象逐漸減少對配偶的影響,而更多地受到領導者的影響。

Female? i , j t + 1 = Female? i , j t + α ? ( Male? i , j t ? Female? i , j t ) + ( 1 ? α ) ? ( X best? t ? Female? i , j t ) \begin{aligned} \text { Female }_{i, j}^{t+1}= & \text { Female }_{i, j}^t+\alpha \bullet\left(\text { Male }_{i, j}^t-\text { Female }_{i, j}^t\right)+(1-\alpha) \\ & \bullet\left(X_{\text {best }}^t-\text { Female }_{i, j}^t\right) \end{aligned} ?Female?i,jt+1?=??Female?i,jt?+α?(?Male?i,jt???Female?i,jt?)+(1?α)?(Xbest?t???Female?i,jt?)?

??第 3 步:更新幼年海象的位置

??種群邊緣的幼年海象經常成為虎鯨和北極熊的目標。因此,幼年海象需要更新其當前位置以避免捕食。

Juvenile? i , j t + 1 = ( O ? Juvenile? i , j t ) ? P O = X best? t + Juvenile? i , j t ? L F \begin{aligned} & \text { Juvenile }_{i, j}^{t+1}=\left(O-\text { Juvenile }_{i, j}^t\right) \bullet P \\ & O=X_{\text {best }}^t+\text { Juvenile }_{i, j}^t \bullet L F \end{aligned} ??Juvenile?i,jt+1?=(O??Juvenile?i,jt?)?PO=Xbest?t?+?Juvenile?i,jt??LF?

??P是幼年海象的遇險系數,是[0,1]的隨機數,O是參考安全位置,LF是基于 L ?evy分布的隨機數向量,表示Levy運動。

Levy ? ( a ) = 0.05 × x ∣ y ∣ 1 a σ x = [ Γ ( 1 + α ) sin ? ( π α 2 ) Γ ( 1 + α 2 ) α 2 ( α ? 1 ) 2 ] 1 α , σ y = 1 , α = 1.5 \begin{gathered} \operatorname{Levy}(a)=0.05 \times \frac{x}{|y|^{\frac{1}{a}}} \\ \sigma_x=\left[\frac{\Gamma(1+\alpha) \sin \left(\frac{\pi \alpha}{2}\right)}{\Gamma\left(\frac{1+\alpha}{2}\right) \alpha 2^{\frac{(\alpha-1)}{2}}}\right]^{\frac{1}{\alpha}}, \sigma_y=1, \alpha=1.5 \end{gathered} Levy(a)=0.05×ya1?x?σx?=[Γ(21+α?)α22(α?1)?Γ(1+α)sin(2πα?)?]α1?,σy?=1,α=1.5?

??其中,其中x和y是兩個正態分布變量, x N ( 0 , σ x 2 ) x \mathrm{~N}\left(0, \sigma_x^2\right) x?N(0,σx2?) y N ( 0 , σ x 2 ) y \mathrm{~N}\left(0, \sigma_x^2\right) y?N(0,σx2?) σ x \sigma_x σx? σ y \sigma_y σy?是標準差, Γ ( x ) = ( x + 1 ) ! \Gamma(x)=(x+1) ! Γ(x)=(x+1)!

??(2)覓食行為

??水下覓食包括逃跑和采集行為

??a) 逃跑行為

??海象在水下覓食時也會受到天敵的攻擊,它們會根據同伴發出的危險信號逃離當前的活動區域。這種行為發生在WO的后期迭代中,對種群的一定程度的擾動有助于海象進行全局探索。
在這里插入圖片描述

??其中, X 1 X_1 X1? X 2 X_2 X2?是影響海象聚集行為的兩個權重, X second? t X_{\text {second }}^t Xsecond?t?是第二只海象在當前迭代中的位置, ∣ X second? t ? X i , j t ∣ \left|X_{\text {second }}^t-X_{i, j}^t\right| ?Xsecond?t??Xi,jt? ?表示當前海象與第二只海象之間的距離,a和b為聚集系數, r 5 r_5 r5?為隨機數,位于[0,1], θ \theta θ取的值范圍為0到π。

四、流程圖

??在WO中,危險信號用于確定WO是執行勘探階段還是開發階段。當危險信號絕對值不小于1時,海象群遷移到解空間內的新域,即算法早期的探索階段;相反,海象群繁殖,這是算法后期的開發階段。安全信號在開發階段起著關鍵作用,它影響著個體海象是選擇棲息行為還是覓食行為。其中,覓食行為包括聚集和逃跑兩種典型現象,它們受危險信號的控制。

WO流程圖

五、偽代碼

WO偽代碼

六、算法復雜度

??在求解優化問題時,計算復雜度對于評估算法的效率非常有用,它取決于三個主要過程:初始化、適應度評估和解決方案的更新。初始化過程和更新機制的計算復雜度分別為O(N)和O(N × T)+ O(N × T × D),其中N為種群大小,T為最大迭代次數,D為給定問題的維數。因此,WO的計算復雜度為O(N ×( T +T × D +1))。算法在運行過程中臨時占用的內存空間量可以用空間復雜度來衡量。WO算法的空間復雜度是在其初始化過程中考慮的任何時間使用的最大空間量。因此,WO算法的空間復雜度為 O(N × Dim)。

七、WO搜索示意圖

??為了可視化所提出的算法的行為,本節顯示了海象群行為的模擬。下圖描繪了30個海象在三維空間中尋找單峰和多峰函數最優解的群體行為。紅點表示全局最佳位置,其余為海象位置。當t=1時,海象在解空間中隨機生成,散射范圍較寬。隨著迭代的繼續,所有海象的搜索范圍逐漸縮小。最后,所有海象都匯聚到紅點上。單模態函數的搜索結果可以表明WO具有較好的開發能力,多模態函數的搜索結果可以反映WO較強的探索能力。(注:與文獻中稍有不同的是我加了一個原函數圖像,Sphere就是常見的測試函數F1,Rastrigin函數是F9,直接修改序號即可)

八、實驗分析和結果

??寫了很久筆記了,也沒有寫完整的實驗。在這篇中,完整的復現一下。包括多次獨立運行、對數據的統計、導入到excel、出圖,鍛煉一下,順便縫縫補補自己以前的爛代碼。整體的思路就按照這篇論文的來寫吧。后續看到好看的圖再補充吧。

??為了適當驗證WO算法的性能,原作者進行了大量實驗。

23個常見的基礎測試函數

??1、定性分析

??使用幾種單峰和多模態標準準則函數對WO的定性結果進行評估,并使用WO的4個不同標準對結果進行評估,包括搜索歷史、第一智能體的軌跡、平均擬合度和收斂曲線。搜索歷史圖顯示了海象個體在迭代期間訪問的所有位置;軌跡圖監控第一只海象在迭代過程中的變化情況;平均適應度圖顯示了海象種群的整體變化;收斂行為圖記錄了總體每次迭代后的最佳解。

??從23個基準測試中選出10個典型函數進行分析。從搜索歷史可以看出,WO在處理不同情況時,包括促進多樣化、探索解決方案空間的有利區域、開發最優位置鄰域等,都呈現出相似的模式。(一旦涉及了位置繪圖可視化,要么每個測試問題的維度設置為2,要么就是畫圖的時候選擇前兩個位置。在此我選擇第二種方法)

??種群大小設置為30,迭代次數設置為400。從23個里面選擇了十個來進行分析。

%% 定性分析23個基準測試函數
clear
clc
close all
populationSize = 30;
Max_iteration = 400;
selet_fcn = [1,3,7,8,10,12,14,15,18,21];
for i=1:length(selet_fcn)-5fn = 1;Function_name=strcat('F',num2str(selet_fcn(i)));[lb,ub,dim,fobj]=Get_Functions_details(Function_name);% dim = 2;% rng('shuffle');%根據當前時間初始化生成器,在每次調用 rng 后會產生一個不同的隨機數序列。[Best_score,Best_pos,PO_cg_curve,All_Pos,fitness1st,fitnessallmean]=WO3(populationSize,Max_iteration,lb,ub,dim,fobj);%% 繪制定性分析圖figure('NumberTitle','off','Color','w','Name','函數圖像','Units','centimeters','Position',[4,15,40,7])tiledlayout(1,5);nexttile%繪制原圖像fun_plot(Function_name)nexttile%搜索歷史圖fun_plot(Function_name);h = gca;h.Children(2).Visible = "off";hold onview(0,90)for i = 1:length(All_Pos)temp = All_Pos{i};scatter(temp(:,1),temp(:,2),12,'k')endtitle('Search history')box ongrid onnexttileplot(fitness1st,'Color',[6, 253, 244]./255,'LineWidth',1.5)title('Trajectory in 1st agents')box ongrid onnexttileplot(fitnessallmean,'Color',[28, 29, 252]./255,'LineWidth',1.5)title('average fitness of all agents')box ongrid onnexttilesemilogx(PO_cg_curve,'Color',[245, 42, 237]./255,'LineWidth',1.5)title('Convergence curve')box ongrid on
end


??關于圖搜索歷史和第一智能體的跡和原文不一樣,理解不到位。暫時先這樣放著,待后續理解更透徹了再修改這個圖。其實這個每跑一次產生的圖都不一樣,感興趣的可以多跑幾次試試。

??2、定量分析

??這部分仿真時,文中未明確說明種群大小和迭代次數,在此我設置種群大小為30,迭代次數為100。文中所提及的ABC、AOS、ChoA、FOA、SHO算法我暫時沒有,在此我換四個其他算法,AEO、ARO、CHIO、FDA、SMA。為了節約時間,我獨立運行了30次,并調用excel的com服務器將結果寫在了excel表中。在此列出前四個函數的表格。對每一行的最小值進行的字體加粗,顏色設置為紅色的處理。


%% 存儲多個算法對比數據 平均值 最優值 最差值 中位數 標準差
clc
clear
close all
%% 加載實驗數據
load 20231107_30_100_30_16_PM.mat
file_path=[pwd,'\AlgorithmComparison.xlsx'];%設置當前路徑
tryexcelApp=actxGetRunningServer('Excel.Application');%如果Excel 服務器已經打開,返回其句柄
catchexcelApp=actxserver('Excel.Application');%如果Excel服務器沒有打開,則創建一個Excel服務器,并返回句柄
end
excelApp.Visible = true; % 使 Excel 可見
%% 添加一個新的工作簿
%如果存在test.xlsx文件,則打開文件,若不存在則創建一個,然后保存
if exist(file_path,'file')workbook=excelApp.Workbooks.Open(file_path);%打開 注意這里打開的必須是絕對路徑
elseworkbook=excelApp.Workbooks.Add;%創建 創建工作簿的時候默認是1 在excel選項中設置workbook.SaveAs(file_path)%保存   
end%% 使用默認的工作表
sheet = workbook.Sheets.Item(1);
%% 設置工作表的名稱
sheet.Name = 'Algorithm Comparison';
%% 合并單元格并設置 "Comparative algorithms" 標題
% 假設總共有12個算法名稱加上'Function'和'target'列,因此共14列
titleRange = sheet.Range('A1:R1'); % 直接指定從A1到N1的范圍
titleRange.MergeCells = true;
titleRange.Value = 'Comparative algorithms';
titleRange.HorizontalAlignment = -4108;%使用 xlCenter 的數值 
titleRange.Font.Bold = true;
titleRange.RowHeight = 50;
titleRange.Font.Size = 24;
% 填充算法名稱 從加載的數據中讀取
for i = 1:length(algorithms)temp = strsplit(algorithms{i},'.');algorithms(i)=temp(1);
end
% algorithms = {'AEO', 'ACO', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA', 'SSA'};
% 從第三列開始填充算法名稱
for i = 1:length(algorithms)% 使用Excel列字母可以使得引用更加清晰colLetter = char('B' + i); % 因為算法從第三列開始,所以是 'B' + irangeStr = sprintf('%s2', colLetter); % 生成范圍字符串,如 'C2', 'D2', 等sheet.Range(rangeStr).Value = algorithms{i};
end
%% 假設有以下函數和指標
functions = {'F1', 'F2', 'F3', 'F4'};
metrics = {'Best', 'Worst', 'Avg', 'Std', 'Median'};
% 為函數名、指標和隨機數據填充表格
% 為函數名、指標和隨機數據填充表格
for i = 1:length(functions)% 合并相同函數名的單元格startRow = (i-1)*length(metrics)+3; % 函數開始的行號endRow = startRow + length(metrics) - 1; % 函數結束的行號mergeRangeStr = sprintf('A%d:A%d', startRow, endRow);mergeRange = sheet.Range(mergeRangeStr);mergeRange.MergeCells = true;mergeRange.Value = functions{i};mergeRange.VerticalAlignment = -4108;   % 垂直居中mergeRange.HorizontalAlignment = -4108; % 水平居中% 為每個指標生成并填充隨機數據for j = 1:length(metrics)metricCell = sprintf('B%d', (i-1)*length(metrics)+j+2);sheet.Range(metricCell).Value = metrics{j};% 為每個指標的算法生成并填充隨機數據% for k = 1:length(algorithms)%     dataCell = sprintf('%s%d', char('B' + k), (i-1)*length(metrics)+j+2);%     sheet.Range(dataCell).Value = rand();% endend
end
sheet.Range('A2').Value = 'Function';
sheet.Range('B2').Value = 'Target';
% 調整列寬
% 調整第一列和第二列的列寬
sheet.Range('A:A').ColumnWidth = 15;
sheet.Range('B:B').ColumnWidth = 15;% 假設算法從第三列開始,一共有12個算法
% 調整算法列的列寬
for i = 3:(2+length(algorithms))colLetter = char('A' + i - 1); % 將列號轉換為列字母sheet.Range([colLetter ':' colLetter]).ColumnWidth = 10;
end
%% 獲取用過的范圍(整個數據區域)
usedRange = sheet.UsedRange;
% 你現在可以對這個范圍進行操作,比如設置單元格的格式
% 設置整個區域的單元格內容居中對齊
usedRange.HorizontalAlignment = -4108; % 水平居中
usedRange.VerticalAlignment = -4108; % 垂直居中
%% 設置字體顏色
% 找到最小值的位置
minall = min(comparealg,[],2);
[minindexX,minindexY]=find(comparealg==minall);minLocations = [minindexX,minindexY]; % 最小值位置矩陣% 轉換最小值位置到 Excel 單元格地址并設置為紅色
for i = 1:size(minLocations, 1)% 計算 Excel 單元格地址rowIndex = minLocations(i, 1) + 2; % +2 是因為數據從 C3 開始colIndex = minLocations(i, 2) + 2; % +2 是因為數據從第三列開始cellAddress = sprintf('%s%d', char('A' + colIndex-1), rowIndex);sheet.Range(cellAddress).Font.Color = 255; % 設置字體顏色為紅色sheet.Range(cellAddress).Font.Bold = true; % 設置字體為加粗
end
% 假設每個函數的數據占據 5 行
numRowsPerFunction = 5;
numFunctions = 4; % F1, F2, F3, F4
startCol = 'A'; % 數據開始的列
endCol = 'R'; % 數據結束的列
startRow = 3; % 數據開始的行% 加粗每個函數數據行的底部邊框
for i = 1:numFunctions% 計算函數數據塊的最后一行lastRow = startRow + i * numRowsPerFunction - 1;% 構建范圍字符串rangeStr = sprintf('%s%d:%s%d', startCol, lastRow, endCol, lastRow);% 獲取范圍range = sheet.Range(rangeStr);% 設置底部邊框樣式為加粗range.Borders.Item('xlEdgeBottom').LineStyle = 1; % Continuous linerange.Borders.Item('xlEdgeBottom').Weight = 4; % Thick weight
end
%% 存數據指定 Excel 范圍
range = sheet.Range('C3:R22');
% 將數據一次性寫入指定范圍
range.Value = comparealg;
%% 保存工作簿 指定為絕對路徑
workbook.Save();%% 清理
workbook.Close();
excelApp.Quit();
excelApp.release;

兩個變量

實驗結果

??3、收斂性分析

??就是一個常規的迭代曲線圖。文獻中這么排版了,在此列出前四個函數。

%% 繪制迭代曲線
clear;clc;close all
addpath Algorithms\
addpath Algorithms\
cd Algorithms\
s = what;
algorithms = s.m;
cd D:\智能優化算法\WO\定量分析
SearchAgents_no = 30;
Max_iteration = 100;
figure('NumberTitle','off', ...'Color','w', ...'Name','迭代曲線對比圖', ...'Units','centimeters', ...'Position',[4,15,40,7])
tiledlayout(1,4)
for j=1:4fn = j;Function_name=strcat('F',num2str(fn));[lb,ub,dim,fobj]=Get_Functions_details(Function_name);[Min_AEO,~, AEO_curve] = AEO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj  );[Min_ARO,~, ARO_curve] = ARO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj );[Min_BOA,~, BOA_curve] =GWO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_BWOA,~, BWOA_curve]=BWOA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_CHIO,~, CHIO_curve]=CHIO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_FDA,~, FDA_curve]=FDA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_GA,~, GA_curve]=GA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_GWO,~, GWO_curve]=GWO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_MFO,~, MFO_curve]=MFO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_PSO,~, PSO_curve]=PSO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_SCSO,~, SCSO_curve]=SCSO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_SMA,~, SMA_curve]=SMA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_SOA,~, SOA_curve]=SOA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_SSA,~, SSA_curve]=SSA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_WO,~, WO_curve]=WO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);[Min_WOA,~, WOA_curve]=WOA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);nexttilesemilogy(AEO_curve)hold onsemilogy(ARO_curve);semilogy(BOA_curve);semilogy(BWOA_curve);semilogy(CHIO_curve);semilogy(FDA_curve);semilogy(GA_curve);semilogy(GWO_curve);semilogy(MFO_curve);semilogy(PSO_curve);semilogy(SCSO_curve);semilogy(SMA_curve);semilogy(SOA_curve);semilogy(SSA_curve);semilogy(WO_curve,'r','LineWidth',2);semilogy(WOA_curve);xlabel('iteration')ylabel('fitness')
end% 填充算法名稱 從加載的數據中讀取
for i = 1:length(algorithms)temp = strsplit(algorithms{i},'.');algorithms(i)=temp(1);
end
legnedpos = gca().Position;
legend(algorithms,'Position',legnedpos+[legnedpos(3)+0.003,0,-0.1,0])

??4、穩定性分析

??畫了一個箱線圖。在此列出matlab代碼。

%% 穩定性分析
% 繪制箱線圖
clc;clear;close all
% 加載獨立運行得到的數據
load 20231107_30_100_30_16_PM.mat
% 填充算法名稱 從加載的數據中讀取
for i = 1:length(algorithms)temp = strsplit(algorithms{i},'.');algorithms(i)=temp(1);
end
% 繪制小提琴圖
for i=1:4F1 = resultall{i};figure('NumberTitle','off', ...'Color','w', ...'Name','穩定性分析', ...'Units','centimeters', ...'Position',[4,15,30,7])handelbox = boxchart(F1);box onset(gca,'xticklabels',algorithms, ...'LineWidth',2)xlabel('Algorithm')ylabel('Fitness Value')grid onhandelbox.BoxFaceColor = 'w';handelbox.BoxEdgeColor = 'b';handelbox.BoxMedianLineColor = 'r';handelbox.LineWidth = 2;handelbox.MarkerColor = 'r';handelbox.MarkerStyle = ".";handelbox.MarkerSize = 15;title(strcat('F',num2str(i)))
end

??5、靈敏性分析

??這個分析就是來尋找算法的最佳參數設置。文中選取了最大迭代次數,種群個數以及雄性個體占比三個參數。

??原文中,圖7 ( a )和( b )分別展示了F1在不同的最大迭代次數和搜索代理數下的WO收斂曲線。圖7 ( c )展示了WO在F5上的收斂曲線,以及不同比例的雄性個體在群體中的分布。計算結果和可視化表明,當最大迭代次數增加時,WO收斂到最優解。此外,從圖7 ( b )可以看出,當種群數量的數量增加時,迭代次數減少。圖7 ( c )顯示了當p從0.3到0.4時WO的相對穩定的行為。基于此分析,p的最佳值可以被建議為其最大值(即p = 0.45),其中WO的結果最好。

clear ;clc;close all
%% F5 6 12 13 14 15
populationSize = [30,50,80,100];
Max_iteration = [200,500,1000,2000];
p = [0.3,0.35,0.4,0.45];
populationSize=populationSize(4);
p = p(4);
fn=1;
Function_name=strcat('F',num2str(fn));
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
colormap = ['k','m','c','b'];
figure('Color','w')
for i=1:length(Max_iteration)rng('shuffle');[Best_score,Best_pos,WO_cg_curve]=WO(populationSize,Max_iteration(i),lb,ub,dim,fobj,p);semilogy(WO_cg_curve,colormap(i),'LineWidth',2)hold onend
set(gca,'XMinorGrid','on','YMinorGrid','on', ...'LineWidth',1)
legend({'T=200';'T=500';'T=1000';'T=2000'})
xlabel('Iteration')
ylabel('Best score obtained so far')

T(N=100,p=0.45)

clear ;clc;close all
%% F5 6 12 13 14 15
populationSize = [30,50,80,100];
Max_iteration = [200,500,1000,2000];
p = [0.3,0.35,0.4,0.45];
Max_iteration =Max_iteration(4);
p = p(4);
fn=1;
Function_name=strcat('F',num2str(fn));
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
colormap = ['k','m','c','b'];
figure('Color','w')
for i=1:length(populationSize)rng('shuffle');[Best_score,Best_pos,WO_cg_curve]=WO(populationSize(i),Max_iteration,lb,ub,dim,fobj,p);semilogy(WO_cg_curve,colormap(i),'LineWidth',2)hold onend
set(gca,'XMinorGrid','on','YMinorGrid','on', ...'LineWidth',1)
% legend({'T=200';'T=500';'T=1000';'T=2000'})
legend({'N=30';'N=50';'N=80';'N=100'})
% legend({'T=200';'T=500';'T=1000';'T=2000'})
xlabel('Iteration')
ylabel('Best score obtained so far')

N(T=2000,p=0.45)

clear ;clc;close all
%% F5 6 12 13 14 15
populationSize = [30,50,80,100];
Max_iteration = [200,500,1000,2000];
p = [0.3,0.35,0.4,0.45];
populationSize=populationSize(4);
Max_iteration =Max_iteration(4);
fn=5;
Function_name=strcat('F',num2str(fn));
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
colormap = ['k','m','c','b'];
figure('Color','w')
for i=1:length(p)rng('shuffle');[Best_score,Best_pos,WO_cg_curve]=WO(populationSize,Max_iteration,lb,ub,dim,fobj,p(i));semilogy(WO_cg_curve,colormap(i),'LineWidth',2)hold onend
set(gca,'XMinorGrid','on','YMinorGrid','on', ...'LineWidth',1)
% legend({'T=200';'T=500';'T=1000';'T=2000'})
% legend({'N=30';'N=50';'N=80';'N=100'})
legend({'P=0.30';'P=0.35';'P=0.40';'P=0.45'})
xlabel('Iteration')
ylabel('Best score obtained so far')

p(T=2000,N=100)

??從上面三幅圖中可以看出,T,N,P三個參數都有影響。種群個數和迭代次數的增加會導致算法時間上的增加,在做具體案例分析時,應該選擇合適的迭代次數和種群個數;P值的影響不會特別大,按照原文獻的介紹,我也用F5測試函數,想要達到文獻的效果。是需要多次運行的,這些P值在解決具體問題的時候,個人覺得不會影響特別大。P在[0.30,0.45]之間都可以。源代碼上P值默認設置的是0.4。

??6、可擴充性分析

??通過改變F1 ~ F13的維度來測試所提出的WO的可擴展性,以確定增加維度對不同測試函數計算結果的影響。測試函數的維度分別為50、100、500。文獻中對其進行了大量分析,用了13個測試函數,做了三個表格,感興趣的可以參考一下。最后對所有算法進行Friedman檢驗,做了一個排名,證明了所提算法的優越性。

這張圖截取自原文獻
??結果表明,WO排在第一位,而SCSO、SHO和WOA分別排在第二位、第三位和第四位。

CEC2021測試函數

??測試函數下載地址

??這節中,作者又換了幾個算法。做了定量分析,收斂性分析和穩定性分析。我不再重復繪圖了。在這簡單說一下CEC系列的函數怎么使用吧。CEC系列的測試函數有很多,一般下載下來就會給你編譯好的matlab可執行文件,后綴名.mexw64。以CEC2017為例

??1. run the following command in Matlab window:
mex cec17_func.cpp -DWINDOWS

??2. Then you can use the test functions as the following example:
f = cec17_func(x,func_num);
here x is a D*pop_size matrix.

一個簡單的說明

實際工程優化問題

六個經典的案例

SNS for Eng Prob

??經典工程優化malab代碼下載鏈接

??注:原文已經進行大量實驗結果分析,感興趣的請閱讀原文,學習學習一篇好的論文是怎么寫的。源代碼也已公開,我就不點運行和截圖了,大家自行下載。

??特別提示:不要買什么基本的算法,這些算法都是全網公開的,優秀的東西從來都不保密,不怕任何人抄襲的,各位不要再交智商稅了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160624.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160624.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FreeRTOS列表和列表項

FreeRTOS內核調度使用了大量的列表(list)和列表項(listitem)數據結構。它的源碼中涉及到很多列表的操作,對于FreeRTOS來說,列表就是它最基礎的一部分,列表被用作FreeRTOS調度器使用,…

力扣.面試題 04.06. 后繼者(java 樹的中序遍歷)

Problem: 面試題 04.06. 后繼者 文章目錄 題目描述思路解題方法復雜度Code 題目描述 設計一個算法,找出二叉搜索樹中指定節點的“下一個”節點(也即中序后繼)。 如果指定節點沒有對應的“下一個”節點,則返回null。 思路 由于題…

lombok @Slf4j注解啥作用

Logger logger Logger.getLogger(Test.class); logger.debug("這是一個調試信息"); logger.info("這是一個info信息");log4j 使用分兩步 第一步:private final Logger logger LoggerFactory.getLogger(當前類名.class); 第二步:記…

Python開發運維:Celery連接Redis

目錄 一、理論 1.Celery 二、實驗 1.Windows11安裝Redis 2.Python3.8環境中配置Celery 三、問題 1.Celery命令報錯 2.執行Celery命令報錯 3.Win11啟動Celery報ValueErro錯誤 一、理論 1.Celery (1) 概念 Celery是一個基于python開發的分布式系統,它是簡單…

Linux 命令: cut 和 tr

1. 寫在前面 本文主要介紹:Linux "cut "和 “tr” 命令行實用程序概述; 公眾號: 滑翔的紙飛機 2. Linux 命令: cut “cut” 命令是一種命令行工具,允許我們剪切指定文件或管道數據的部分內容,并…

JSP內置對象

一、request對象 1、訪問請求參數 2、在作用域中管理屬性 3、獲取Cookie 4、解決中文亂碼 5、獲取客戶端信息 6、顯示國際化信息 是一個javax.servlet.http.HttpServletRequest對象 request封裝了用戶瀏覽器提交的信息,因此可以調用相應的方法可以獲取這些封…

優先經驗回放(prioritized experience replay)

prioritized experience replay 思路 優先經驗回放出自ICLR 2016的論文《prioritized experience replay》。 prioritized experience replay的作者們認為,按照一定的優先級來對經驗回放池中的樣本采樣,相比于隨機均勻的從經驗回放池中采樣的效率更高&…

UML建模圖文詳解教程——類圖

版權聲明 本文原創作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文參考資料:《UML面向對象分析、建模與設計(第2版)》呂云翔,趙天宇 著 類圖概述 類圖用來描述系統內各種實體的類型以及不同…

Unsupervised MVS論文筆記

Unsupervised MVS論文筆記 摘要1 引言2 相關工作3 實現方法 Tejas Khot and Shubham Agrawal and Shubham Tulsiani and Christoph Mertz and Simon Lucey and Martial Hebert. Tejas Khot and Shubham Agrawal and Shubham Tulsiani and Christoph Mertz and Simon Lucey and …

JAVA小游戲拼圖

第一步是創建項目 項目名自擬 第二部創建個包名 來規范class 然后是創建類 創建一個代碼類 和一個運行類 代碼如下: package heima; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import …

10、信息打點——APP小程序篇抓包封包XP框架反編譯資產提取

APP信息搜集思路 外在——抓包封包——資產安全測試 抓包(Fiddle&茶杯&burp)封包(封包監聽工具),提取資源信息 資產收集——資源提取——ICO、MAD、hash——FOFA等網絡測繪進行資產搜集 外在——功能邏輯 內在…

國際版Amazon Lightsail的功能解析

Amazon Lightsail是一項易于使用的云服務,可為您提供部署應用程序或網站所需的一切,從而實現經濟高效且易于理解的月度計劃。它是部署簡單的工作負載、網站或開始使用亞馬遜云科技的理想選擇。 作為 AWS 免費套餐的一部分,可以免費開始使用 Amazon Lightsail。注冊…

【Python進階】近200頁md文檔14大體系第4篇:Python進程使用詳解(圖文演示)

本文從14大模塊展示了python高級用的應用。分別有Linux命令,多任務編程、網絡編程、Http協議和靜態Web編程、htmlcss、JavaScript、jQuery、MySql數據庫的各種用法、python的閉包和裝飾器、mini-web框架、正則表達式等相關文章的詳細講述。 Python全套筆記直接地址…

PostgreSQL10安裝postgis插件

1.安裝pgsql10 2.下載插件,以Windows為例,地址:Index of /postgis/windows/pg10/ 3.安裝插件,直接安裝,和pgsql的目錄相同即可,一直下一步 4.安裝之后,需要執行sql打開 CREATE EXTENSION po…

028 - STM32學習筆記 - ADC結構體學習(二)

028 - STM32學習筆記 - 結構體學習(二) 上節對ADC基礎知識進行了學習,這節在了解一下ADC相關的結構體。 一、ADC初始化結構體 在標準庫函數中基本上對于外設都有一個初始化結構體xx_InitTypeDef(其中xx為外設名,例如…

Redis設計與實現-數據結構(建設進度17%)

Redis數據結構 引言數據結構stringSDS數據結構原生string的不足 hash 本博客基于《Redis設計與實現》進行整理和補充,該書依賴于Redis 3.0版本,但是Redis6.0版本在一些底層實現上仍然沒有明顯的變動,因此本文將在該書的基礎上,對于…

PostgreSQL基本操作

1.查詢某個表的所在磁盤大小 select pg_size_pretty(pg_relation_size(grb_grid)); 2.插入point類型的記錄 insert into tb_person ("name", "address", "location", "create_time", "area", "girls") values …

Java 兩個線程交替打印1-100

線程題:交替打印1-100 這里演示兩個線程,一個打印奇數,一個打印偶數 方式一:synchronized FixedThreadPool public class example {private static int count 1;private static final Object lock new Object();public stat…

WPF基礎DataGrid控件

WPF DataGrid 是一個用于顯示和編輯表格數據的強大控件。它提供了豐富的功能,包括排序、篩選、分組、編輯、選擇等,使你能夠以類似電子表格的方式呈現和操作數據。 DataGrid 的布局主要由以下部分組成: 列定義 (Columns): DataGrid 列定義了…

YOLO目標檢測——衛星遙感多類別檢測數據集下載分享【含對應voc、coco和yolo三種格式標簽】

實際項目應用:衛星遙感目標檢測數據集說明:衛星遙感多類別檢測數據集,真實場景的高質量圖片數據,數據場景豐富,含網球場、棒球場、籃球場、田徑場、儲罐、車輛、橋、飛機、船等類別標簽說明:使用lableimg標…