【元启发式优化算法】秃鹰搜索优化算法(BEO)

01.引言

秃鹰搜索算法(BES)通过模拟秃鹰捕鱼的三阶段智能行为实现优化:首先在空间选择阶段定位猎物密集区域,接着在搜索阶段进行精细勘探,最后基于最优位置发起定向俯冲捕猎。研究者采用多维度验证框架,通过基准测试、横向性能对比以及包含均值分析、Wilcoxon检验的统计评估,证实BES在收敛速度、优化精度等指标上显著优于传统方法和其他元启发式算法,尤其在复杂优化问题中展现出卓越的全局搜索能力与稳定性。

02.优化算法的流程

秃鹰搜索算法(BES)作为一种基于群体智能的元启发式优化算法,其流程遵循典型的优化框架:算法初始化阶段随机生成候选解集(秃鹰种群),通过仿生行为规则逐步逼近最优解。核心流程分为仿生驱动的三阶段迭代机制:空间选择阶段通过适应度评估定位高潜力搜索区域,实现全局探索;空间搜索阶段在选定区域内执行螺旋式局部勘探,平衡广度与深度搜索;俯冲捕猎阶段基于前两阶段的最优解进行定向加速收敛,完成精准利用。算法通过迭代更新秃鹰位置向量,数学上表现为候选解在多维空间中的动态调整,其位置更新公式整合了随机扰动因子与历史最优引导项,有效协调探索与开发的矛盾。终止条件通常设置为达到最大迭代次数或收敛精度阈值,最终输出全局最优解。BES通过模拟秃鹰捕猎的生态行为,构建了从粗粒度区域筛选到细粒度精准捕杀的递进式优化机制。

其伪代码如下:

3.论文中算法对比图

04.部分代码

function [Best_score,Best_x,cg_curve]=BES(nPop,MaxIt,low,high,dim,fobj)
%nPop: size of population 
%MaxIt:number of iterations 
%low, high : space of Decision variables
%dim : number of Decision variables
%fobj : funcation 
st=cputime;
% Initialize Best Solution
BestSol.cost = inf;
for i=1:nPop
    pop.pos(i,:) = low+(high-low).*rand(1,dim);
     pop.cost(i)=fobj(pop.pos(i,:));
    if pop.cost(i) < BestSol.cost
        BestSol.pos = pop.pos(i,:);
        BestSol.cost = pop.cost(i);
    end
end
 disp(num2str([0 BestSol.cost]))
for t=1:MaxIt
    %%               1- select_space 
 [pop BestSol s1(t)]=select_space(fobj,pop,nPop,BestSol,low,high,dim);
    %%                2- search in space
    [pop BestSol s2(t)]=search_space(fobj,pop,BestSol,nPop,low,high);
    %%                3- swoop
  [pop BestSol s3(t)]=swoop(fobj,pop,BestSol,nPop,low,high);
        Convergence_curve(t)=BestSol.cost;
        disp(num2str([t BestSol.cost]))
    ed=cputime;
    timep=ed-st;
   Best_score=BestSol.cost ;Best_x=BestSol.pos;cg_curve= Convergence_curve;
end
function [pop BestSol s1]=select_space(fobj,pop,npop,BestSol,low,high,dim)
Mean=mean(pop.pos);
% Empty Structure for Individuals
empty_individual.pos = [];
empty_individual.cost = [];
lm= 2;
s1=0;
for i=1:npop
    newsol=empty_individual;
    newsol.pos= BestSol.pos+ lm*rand(1,dim).*(Mean - pop.pos(i,:));
    newsol.pos = max(newsol.pos, low);
    newsol.pos = min(newsol.pos, high);
    newsol.cost=fobj(newsol.pos);
    if newsol.cost<pop.cost(i)
       pop.pos(i,:) = newsol.pos;
       pop.cost(i)= newsol.cost;
       s1=s1+1;
         if pop.cost(i) < BestSol.cost
          BestSol.pos= pop.pos(i,:);
         BestSol.cost=pop.cost(i); 
         end
    end
end
end
function [pop best s1]=search_space(fobj,pop,best,npop,low,high)
Mean=mean(pop.pos);
a=10;
R=1.5;
% Empty Structure for Individuals
empty_individual.pos = [];
empty_individual.cost = [];
s1=0;
for i=1:npop-1
    A=randperm(npop);
pop.pos=pop.pos(A,:);
pop.cost=pop.cost(A);
        [x y]=polr(a,R,npop);
    newsol=empty_individual;
   Step = pop.pos(i,:) - pop.pos(i+1,:);
   Step1=pop.pos(i,:)-Mean;
   newsol.pos = pop.pos(i,:) +y(i)*Step+x(i)*Step1;
    newsol.pos = max(newsol.pos, low);
    newsol.pos = min(newsol.pos, high);
    newsol.cost=fobj(newsol.pos);
    if newsol.cost<pop.cost(i)
       pop.pos(i,:) = newsol.pos;
       pop.cost(i)= newsol.cost;
              s1=s1+1;
                  if pop.cost(i) < best.cost
                 best.pos= pop.pos(i,:);
                best.cost=pop.cost(i); 
            end
    end
end
end
function [pop best s1]=swoop(fobj,pop,best,npop,low,high)
Mean=mean(pop.pos);
a=10;
R=1.5;
% Empty Structure for Individuals
empty_individual.pos = [];
empty_individual.cost = [];
s1=0;
for i=1:npop
    A=randperm(npop);
pop.pos=pop.pos(A,:);
pop.cost=pop.cost(A);
        [x y]=swoo_p(a,R,npop);
    newsol=empty_individual;
   Step = pop.pos(i,:) - 2*Mean;
   Step1= pop.pos(i,:)-2*best.pos;
   newsol.pos = rand(1,length(Mean)).*best.pos+x(i)*Step+y(i)*Step1;
    newsol.pos = max(newsol.pos, low);
    newsol.pos = min(newsol.pos, high);
    newsol.cost=fobj(newsol.pos);
    if newsol.cost<pop.cost(i)
       pop.pos(i,:) = newsol.pos;
       pop.cost(i)= newsol.cost;
              s1=s1+1;
                  if pop.cost(i) < best.cost
                 best.pos= pop.pos(i,:);
                best.cost=pop.cost(i); 
            end
    end
end
end
function [xR yR]=swoo_p(a,R,N)
th = a*pi*exp(rand(N,1));
r  =th; %R*rand(N,1);
xR = r.*sinh(th);
yR = r.*cosh(th);
 xR=xR/max(abs(xR));
 yR=yR/max(abs(yR));
end
 
 function [xR yR]=polr(a,R,N)
%// Set parameters
th = a*pi*rand(N,1);
r  =th+R*rand(N,1);
xR = r.*sin(th);
yR = r.*cos(th);
 xR=xR/max(abs(xR));
 yR=yR/max(abs(yR));
 end
end
​

05.本代码效果图

获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复智能优化算本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。

禁忌搜索算法在某些方面存在一些不足,需要进行改进。首先,禁忌搜索对初始解有较强的依赖性,较好的初始解可以帮助算法在解空间中搜索到好的解,而较差的初始解则会减慢算法的收敛速度。因此,可以将禁忌搜索算法与其他优化算法如遗传算法、模拟退火算法等结合,先产生较好的初始解,再使用禁忌搜索算法进行搜索优化。这样可以提高算法的性能和效果。 其次,禁忌搜索算法的迭代搜索过程是串行的,只是单一状态的移动,而非并行搜索。为了进一步改善禁忌搜索的性能,可以改进禁忌搜索算法本身的操作和参数选择,引入并行策略,实现并行禁忌搜索算法。另外,还可以与遗传算法、神经网络算法以及基于问题信息的局部搜索相结合,从而进一步提高算法搜索效率和准确性。 此外,在集中性与多样性搜索并重的情况下,禁忌搜索算法可能存在多样性不足的问题。集中性搜索策略用于加强对当前搜索优良解的邻域进行更充分的搜索,以找到全局最优解。而多样性搜索策略则用于拓宽搜索区域,尤其是未知区域,当搜索陷入局部最优时,多样性搜索可以改变搜索方向,跳出局部最优,从而实现全局最优。增加多样性策略的一种简单处理方式是重新随机初始化算法,或者根据频率信息对一些已知对象进行惩罚。 综上所述,对禁忌搜索算法的改进可以从改进初始解的产生、引入并行策略、与其他优化算法结合以及增加多样性搜索等方面进行。这些改进措施可以提高禁忌搜索算法的性能和效果,使其在实际应用中更加有效地解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Bald eagle search Optimization algorithm秃鹰搜索优化算法 Matlab](https://download.csdn.net/download/weixin_39168167/88262751)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【TS TSP】基于matlab改进的禁忌搜索算法求解旅行商问题【含Matlab源码 241期】](https://blog.csdn.net/TIQCmatlab/article/details/113732930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB科研小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值