自然現象中,軟冰的形成過程由 Set al. [42] 提出,軟冰是空氣中的過冷水滴在接觸固體物體并凍結時形成的。這種現象發生在特定的氣候條件下,當水蒸氣尚未凝結時,導致冰覆蓋的表面呈現出獨特的樹枝狀和葉子狀景觀。它在軟冰的生長和優化過程中,類似于冰的生長過程。它旨在模擬軟冰的隨機性和結構發展,將其轉化為解決復雜問題的搜索策略。該算法主要由三種主要策略組成:軟冰搜索策略、硬冰穿刺機制和正向貪婪選擇機制。
(1) 軟冰搜索策略
軟冰搜索策略是RIME算法的探索階段。它旨在模擬軟冰在微風條件下的隨機和擴展性增長。類似于這些冰粒子附著在表面上的方式,軟冰搜索策略允許RIME算法中的個體代理在搜索空間內附著于潛在解。該策略通過動態更新機制實現,引導代理朝向最優解。
公式(1)在搜索空間中代理的位置更新機制中起著關鍵作用。該公式如下:
X i j n e w = X ( b e s t , j ) + r 1 × cos ? ( θ ) × β (1) X_{ij}^{new} = X_{(best,j)} + r_1 \times \cos(\theta) \times \beta \tag{1} Xijnew?=X(best,j)?+r1?×cos(θ)×β(1)
× [ h × ( U b j ? L b j ) + L b j ] , r 2 < E \times [h \times (U_{bj} - L_{bj}) + L_{bj}], \quad r_2 < E ×[h×(Ubj??Lbj?)+Lbj?],r2?<E
其中隨機分量 r 1 r_1 r1? 和 h h h 通過引入代理運動的不確定性來促進探索,而對齊系數 E = ( t / T ) E = \sqrt{(t/T)} E=(t/T)? 調節整個迭代過程中探索與開發之間的平衡。 cos ? ( θ ) \cos(\theta) cos(θ) 與縮放因子 β \beta β 一起添加了定向變異性,有助于微調搜索過程中識別的有前景區域 X ( b e s t , j ) X_{(best,j)} X(best,j)?。該方程體現了軟冰搜索策略的本質,通過平衡隨機游走特征的探索與向已知良好適應度區域的定向運動,類似于軟冰在微風中積累的方式。
(2) 硬冰穿刺機制
硬冰穿刺機制是RIME算法中設計的一種方法,旨在加強當前已知最佳解附近的搜索。它類似于自然環境中硬冰通過快速凍結的過冷水滴在高風環境中形成固體表面沉積物的過程。公式(2)描述了這種穿刺機制:
X i j n e w = X ( b e s t , j ) , r 3 < F n o r m ( S i ) (2) X_{ij}^{new} = X_{(best,j)}, \quad r_3 < F^{norm}(S_i) \tag{2} Xijnew?=X(best,j)?,r3?<Fnorm(Si?)(2)
在這種機制中,如果滿足隨機條件 r 3 = F n o r m ( S i ) r_3 = F^{norm}(S_i) r3?=Fnorm(Si?),則代理 i i i 的位置被積極更新為當前最佳解的位置。這代表了搜索空間中的穿刺,允許算法突破當前探索區域并匯聚到具有更高潛力的區域。硬冰穿刺類似于解的合并,更強的生長覆蓋較弱的結構,從而通過促進算法向已知最佳解的收斂來增強算法的探索能力。
(3) 正向貪婪選擇機制
正向貪婪選擇機制是RIME算法中幫助選擇最優秀代理的關鍵組成部分。受貪婪選擇最佳可用選項概念的啟發,該機制直接比較潛在解的適應度并采用更優者。它確保只有那些導致更好適應度值的更新被接受,因此術語為正向。這種正向貪婪方法確保代理種群不斷朝著更好的適應度值移動,促進算法的總體收斂。與隨機或概率選擇方法不同,這種確定性策略通過在搜索過程中始終偏愛改進,確保朝著優化目標的穩步進展。
RIME算法的偽代碼在算法1中呈現。算法的流程圖如圖1所示。
3.1 動機
根據NFL,沒有優化算法對所有問題都表現最佳。該定理強調了開發適應性算法以解決特定問題特征的重要性。RIME算法,受冰的形成啟發,在收斂性和搜索能力方面表現出色。然而,像許多其他MA一樣,它在復雜場景中,如高維數據集中的FS,難以保持多樣性并避免局部最優。為了解決這些挑戰,我們提出了ACGRIME算法,它結合了三種策略:混沌理論、自適應權重和高斯突變。這些增強功能提高了算法在探索解空間時的能力,同時保持有效開發有前景區域的能力。混沌理論集成到ACGRIME中以引入不可預測性并防止過早收斂。混沌系統的基本原理,如邏輯映射產生的,避免了局部最優并確保了解空間的廣泛探索。
另一方面,自適應權重動態調整探索和開發階段在整個優化過程中的影響。它確保算法在初始階段廣泛探索搜索空間,并隨著搜索進程的進行逐漸專注于開發找到的最佳解。進行動態調整的能力對于保持靈活性和響應性至關重要,使算法能夠不斷適應并提高性能。最后,高斯突變以其精確性而聞名,能夠產生小的、受控的變化。通過利用高斯分布的特性,該策略引入了對當前解的微小、漸進的更改。這些小步驟對于解空間的詳細搜索至關重要,使算法能夠逐步細化和增強解決方案。高斯分布的窄而長尾特性有助于維持多樣化的解池,解決全局優化任務中保持多樣性的常見挑戰。
此外,為了擴展ACGRIME在離散優化問題中的適用性,我們開發了其二進制形式(bACGRIME)。這種變體專門針對FS,提供了一種有效的方法來識別相關特征,同時保持或提高分類準確性。總體而言,ACGRIME算法旨在創建一個更強大的優化算法,能夠解決更復雜的問題,提高收斂速度和平衡探索-開發動態。通過進行廣泛的實驗和與其他先進算法的比較,我們證明了ACGRIME和bACGRIME在這些領域中的有效性。
3.2 混沌理論
當應用于元啟發式優化時,混沌理論作為一種機制來增強搜索過程,通過避免過早收斂并鼓勵探索[69]。混沌系統的內在不可預測性使其適合于全面探索解空間。在ACGRIME中,混沌通過邏輯映射引入,這是一種迭代的、非線性動態系統,表現出混沌行為,對于某些參數值。
邏輯映射由公式(4)表示:
X n + 1 = μ X n ( 1 ? X n ) (4) X_{n+1} = \mu X_n(1 - X_n) \tag{4} Xn+1?=μXn?(1?Xn?)(4)
其中 X n + 1 X_{n+1} Xn+1? 是第 n + 1 n+1 n+1 次迭代的值, μ \mu μ 是控制參數。通過用隨機起始值初始化混沌序列并將參數 τ \tau τ 設置為 4,算法利用邏輯映射的內在混沌動態來增強搜索過程。這種混沌序列被ACGRIME利用,以動態調整優化過程中的行為,確保在探索和開發之間保持平衡。
3.3 自適應權重
ACGRIME中的自適應權重策略是一種方法,用于隨時間調制不同算法組件的影響。它旨在動態控制探索和開發階段的影響,權重通常隨著算法的進展而減少。這確保算法在初始階段廣泛探索搜索空間,并隨著搜索進程的進行逐漸專注于開發找到的最佳解。類似的策略已成功應用于其他優化技術,如PSO中混沌慣性權重的使用來提高收斂速度和解決方案精度[70]。在ACGRIME的自適應權重策略中,混沌動態的應用模仿了這些成功策略。該策略用于修改和增強軟冰搜索策略的性能。
權重通過依賴于優化過程階段的自適應函數進行調整。
3.4 高斯突變
高斯突變在MA中被用作關鍵操作,以微調搜索最優解。起源于Back和Schwefel[71]的工作。高斯突變的本質在于其能夠產生接近父實體的后代。這種接近性通過高斯分布的窄而長尾特性實現,允許進行增量、精確的變化。這些小步驟對于解空間內的詳細搜索至關重要,它們有助于維持多樣化的解池,這是全局優化任務中的常見挑戰。
在ACGRIME算法中,高斯突變通過高斯密度函數實現,如公式(6)所示:
M g a u s s = X × ( 1 + r a n d ( 1 ) × k ) (6) M_{gauss} = X \times (1 + rand(1) \times k) \tag{6} Mgauss?=X×(1+rand(1)×k)(6)
其中 X X X 是從邏輯映射派生的原始候選解向量,并為突變提供動態縮放因子,以確保突變強度在整個優化過程中變化。這種混沌動態的使用有助于通過提供非線性和不可預測的突變尺度,以及 rand ( 1 ) \text{rand}(1) rand(1) 生成均值為0、標準差為1的正態分布隨機數,從而在突變步驟中添加更多隨機性,從而在探索和開發之間實現更健康的平衡。
3.5 ACGRIME框架
本研究提出了RIME算法的改進版本,稱為ACGRIME,通過整合混沌理論、自適應權重和高斯突變三種主要策略來增強RIME的收斂能力及其避免局部最優的能力。混沌理論的引入通過動態平衡優化過程中的探索和開發進一步增強了RIME,并使其能夠適應搜索景觀的變化。此外,高斯突變策略為種群引入了變異性和多樣性。這種突變策略,受混沌動態影響,有助于防止停滯并維持解池的健康多樣性。這在導航復雜、多模態景觀時尤其關鍵,這些景觀具有高風險收斂到次優解。
這些策略通過增強RIME算法的全局搜索能力和防止過早收斂的魯棒性來改進原始RIME算法。ACGRIME算法通過邏輯映射和自適應權重策略結合混沌,使其能夠適應搜索景觀的變化。此外,高斯突變不斷多樣化搜索空間并增強解質量,幫助在探索和開發階段之間保持平衡。因此,ACGRIME是一個更強大且適應性強的工具,用于解決復雜優化問題,如FS,并在速度和解決方案質量方面優于其前身。提供的偽代碼在算法1中概述了ACGRIME算法的實現步驟。此外,圖2展示了ACGRIME算法的清晰流程圖。
function [Best_rime, Convergence_curve] = ACGRIME_v1(N, MaxFEs, lb, ub, dim, fobj)Best_rime = zeros(1, dim);Best_rime_rate = inf; % change this to -inf for maximization problemsRimepop = initialization(N, dim, ub, lb);Lb = lb .* ones(1, dim);Ub = ub .* ones(1, dim);FEs = 0; % Number of function evaluationsConvergence_curve = [];Rime_rates = zeros(1, N);newRime_rates = zeros(1, N);Time =1;ChaosValue = rand(); % Initial value for Logistic mapa = 4; % Parameter for Logistic mapfor i = 1:NRime_rates(1, i) = fobj(Rimepop(i, :));FEs = FEs + 1;if Rime_rates(1, i) < Best_rime_rateBest_rime_rate = Rime_rates(1, i);Best_rime = Rimepop(i, :);endendwhile FEs < MaxFEs% Apply Logistic map for chaosChaosValue = a * ChaosValue * (1 - ChaosValue);E = sqrt(ChaosValue * FEs/MaxFEs);newRimepop = Rimepop;normalized_rime_rates = normr(Rime_rates);w1 = (1-FEs/MaxFEs)^(1-tan(pi*(ChaosValue * rand-0.5))*FEs/MaxFEs); % Adaptive weightingfor i = 1:Nfor j = 1:dimr1 = rand();r2 = rand();r3 = rand();c1 = 2*exp(-(4*FEs/MaxFEs)^2);c2 = rand();if r2 < Eif c2 < 0.5newRimepop(i, j) = Best_rime(1, j) + w1 * c1 * ((Ub(j) - Lb(j)) * r1 + Lb(j));elsenewRimepop(i, j) = Best_rime(1, j) - w1 * c1 * ((Ub(j) - Lb(j)) * r1 + Lb(j));endendif r3 < normalized_rime_rates(i)newRimepop(i, j) = Best_rime(1, j);endend% Gaussian Mutationx = newRimepop(i, :);m_gaus = x * (1 + ChaosValue * randn(1));Flag4ub = m_gaus > ub;Flag4lb = m_gaus < lb;m_gaus = (m_gaus .* (~(Flag4ub + Flag4lb))) + ub .* Flag4ub + lb .* Flag4lb;m_gaus_fitness = fobj(m_gaus);fitness_s = fobj(x);m_gaus_fitness_comb = [m_gaus_fitness, fitness_s];[~, m] = min(m_gaus_fitness_comb);if m == 1newRimepop(i, :) = m_gaus;endendfor i = 1:NFlag4ub = newRimepop(i, :) > ub;Flag4lb = newRimepop(i, :) < lb;newRimepop(i, :) = (newRimepop(i, :) .* (~(Flag4ub + Flag4lb))) + ub .* Flag4ub + lb .* Flag4lb;newRime_rates(1, i) = fobj(newRimepop(i, :));FEs = FEs + 1;if newRime_rates(1, i) < Rime_rates(1, i)Rime_rates(1, i) = newRime_rates(1, i);Rimepop(i, :) = newRimepop(i, :);if newRime_rates(1, i) < Best_rime_rateBest_rime_rate = Rime_rates(1, i);Best_rime = Rimepop(i, :);endendendConvergence_curve(Time)=Best_rime_rate;Time=Time+1;end
end