该算法的灵感主要来自宇宙学中的三个概念:白洞、黑洞和虫洞。 这三个概念的数学模型分别用于探索、开发和局部搜索。 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