該演算法的靈感主要來自宇宙學中的三個概念:白洞、黑洞和蟲洞。 這三個概念的數學模型分別用於探索、開發和區域性搜尋。 2015年發表在SCI權威期刊《神經計算與應用》上。擁有近 2000+ 次引用,它仍然有很大的潛力。 多元宇宙優化演算法利用白洞和蟲洞的概念來探索搜尋空間,相反,蟲洞在多元宇宙優化演算法中協助搜尋空間的發展。 假設每個解都是乙個宇宙,並且每個解中的變數都是宇宙中的物件。 在求解優化問題的過程中,多元宇宙優化演算法應用了以下規則:物體可以通過白洞和黑洞隧道在不同的宇宙之間移動。 當在白洞和黑洞隧道之間建立兩個宇宙時,宇宙有膨脹率,膨脹率較高的宇宙有白洞,膨脹率較低的宇宙被認為有黑洞,通過粒子從白洞轉移到黑洞位置的原理,對宇宙中的粒子進行模擬通過蟲洞。這種機制使得宇宙之間可以輕易地交換物體,無論宇宙中物質的膨脹速度如何,宇宙中的所有物質都會隨機地通過蟲洞移動,到達宇宙的最佳位置。 其中,整個宇宙的迭代次數,可以確保平均暴脹率的提高。 在每次迭代中,根據其通貨膨脹率的分類,依靠輪盤機制來建立乙個白洞。 演算法個體的組成如下:
其中 d 是變數的數量,n 是宇宙的數量(候選解)。
step1.初始化控制引數:Universe數n,引數wep、tdr、閾值h和最大迭代次數itermax;
step2.初始化宇宙群,找到當前宇宙黑洞及其位置,計算其適應度值;
step3.根據步驟2中得到的計算值,初始化最優值和最優記錄點。
step4.所有個體都從白洞轉移到黑洞。 以當前最優宇宙定位點為中心,根據轉移聚合規則生成新的最優定位點,並替換原有點。
step5.計算各點的擬合度,記錄最優值和最優宇宙點。
step6.黑洞個人更新。 設定WEP,如果黑洞的2R WEP和更新後的個體適應度值優於原來,則按照更新後的公式(23)更新個人,否則不會更新。
step7.記錄最佳值和最佳值。
step8.評估整個宇宙群落並分析結果。
step9.如果迭代次數小於指定的迭代次數,請執行步驟4,否則執行步驟10。
step10.如果滿足演算法的最終先決條件,則輸出最優解並完成結束,否則繼續步驟 4。
為了驗證結果,將MVO演算法與灰狼優化演算法GWO、粒子群優化演算法PSO、遺傳演算法GA和引力搜尋演算法GSA進行了對比。 結果證明,該演算法能夠提供非常有競爭力的結果,並且在大多數測試平台上優於文獻中的最佳演算法。 實際案例研究的結果也證明了MVO在解決具有未知搜尋空間的實際問題方面的潛力。
function[best_universe_inflation_rate,best_universe,convergence_curve]=mvo(n,max_time,lb,ub,dim,fobj)%two variables for s**ing the position and inflation rate (fitness) of the best universebest_universe=zeros(1,dim);best_universe_inflation_rate=inf;%initialize the positions of universesuniverses=initialization(n,dim,ub,lb);%minimum and maximum of wormhole existence probability (min and max in% eq.(3.3) in the **wep_max=1;wep_min=0.2;convergence_curve=zeros(1,max_time);%iteration(time) countertime=1;%main loopwhile time %eq. (3.3) in the **wep=wep_min+time*((wep_max-wep_min)/max_time); tr**elling distance rate (formula): eq. (3.4) in the **tdr=1-((time)^(1/6)/(max_time)^(1/6));inflation rates (i) (fitness values) inflation_rates=zeros(1,size(universes,1));for i=1:size(universes,1) %boundary checking (to bring back the universes inside search % space if they go beyoud the boundaries flag4ub=universes(i,:)ub; flag4lb=universes(i,:)universes(i,:)=(universes(i,:)flag4ub+flag4lb)))ub.*flag4ub+lb.*flag4lb; %calculate the inflation rate (fitness) of universes inflation_rates(1,i)=fobj(universes(i,:)elitism if inflation_rates(1,i) best_universe_inflation_rate=inflation_rates(1,i); best_universe=universes(i,:)end end [sorted_inflation_rates,sorted_indexes]=sort(inflation_rates); for newindex=1:n sorted_universes(newindex,:)=universes(sorted_indexes(newindex),:end %normaized inflation rates (ni in eq. (3.1) in the **normalized_sorted_inflation_rates=normr(sorted_inflation_rates); universes(1,:)= sorted_universes(1,:)update the position of universes for i=2:size(universes,1)%starting from 2 since the firt one is the elite back_hole_index=i; for j=1:size(universes,2) r1=rand();if r1 white_hole_index=roulettewheelselection(-sorted_inflation_rates);%for maximization problem -sorted_inflation_rates should be written as sorted_inflation_rates if white_hole_index==-1 white_hole_index=1; end %eq. (3.1) in the **universes(back_hole_index,j)=sorted_universes(white_hole_index,j); end if (size(lb,2)==1) %eq. (3.2) in the **if the boundaries are all the same r2=rand();if r2 r3=rand();if r3<0.5 universes(i,j)=best_universe(1,j)+tdr*((ub-lb)*rand+lb); end if r3>0.5 universes(i,j)=best_universe(1,j)-tdr*((ub-lb)*rand+lb); end end end if (size(lb,2)~=1) %eq. (3.2) in the **if the upper and lower bounds are %different for each variables r2=rand();if r2 r3=rand();if r3<0.5 universes(i,j)=best_universe(1,j)+tdr*((ub(j)-lb(j))*rand+lb(j));end if r3>0.5 universes(i,j)=best_universe(1,j)-tdr*((ub(j)-lb(j))*rand+lb(j));end end end end end %update the convergence curve convergence_curve(time)=best_universe_inflation_rate; %print the best universe details after every 50 iterations% if mod(time,50)==0% display(['at iteration ', num2str(time), ' the best universes fitness is ', num2str(best_universe_inflation_rate)])end time=time+1;endendfunction choice = roulettewheelselection(weights) accumulation = cumsum(weights); p = rand() accumulation(end); chosen_index = -1; for index = 1 : length(accumulation) if (accumulation(index) >p) chosen_index = index; break; end end choice = chosen_index;end