生物地理学优化算法(BBO)详解及Matlab代码实现

前言

随着进化计算领域的飞速发展,现如今每年都会有大量的新型启发式算法提出,如图1所示,先不论这些算法的具体性能如何,可以看出大家对于启发式算法的兴趣还是相当浓厚的。

图1 近年来新提出的启发式算法数量统计图

本次我们学习一下与粒子群算法(PSO),遗传算法(GA)等耳熟能详的经典算法并列的另外一种算法-----生物地理学优化算法(Biogeography-Based Optimization,BBO),BBO算法由Dan Simon教授受生物地理学理论启发所提出,于2008年发表在著名期刊IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION上,含金量十足文章具体信息如图2所示。

图2

BBO算法主要通过迁移变异两种操作实现算法寻优,拥有较为简单的机制以及较好的优化能力,非常值得参考学习。

一、算法原理

BBO算法借鉴了生物地理学模型中物种在不同栖息地之间的相互迁移,以及在每个栖息地中新物种如何出现或者灭绝的概念,这里的栖息地即对应一般启发式算法中的候选解,而候选解所对应的适应度在BBO算法当中则使用每个栖息地的适宜性指数(Habitat Suitability Index,HSI)来定义,至于每个候选解中的具体信息,则是用与HSI相关的特征包括降雨量、植被多样性、地形特征多样性、土地面积和温度等因素来定义。

接下来介绍BBO算法的核心部分:迁移变异

1.迁移

BBO算法使用每个栖息地(候选解)的迁入率(immigration)和迁出率(emigration)在栖息地之间共享信息。

迁入率:新物种迁移到本栖息地的情况。

迁出率:本栖息地的物种迁移到其他栖息地的情况。

在此引入物种数量的概念用于表示一个栖息地中的物种多样性,并将一个栖息地的物种数量与该栖息地的HSI相联系:HSI较高的栖息地意味着物种多样性大,反之则物种多样性较小。

对于HSI较大即物种数量较多的栖息地,其迁入率较低,迁出率较高(物种都具有排外性,物种多的时候,新物种进入这个地方的机会肯定少嘛),对于HSI较小即物种数量较少的栖息地,其迁入率较高,迁出率较低。

我们使用\lambda表示迁入率,\mu表示迁出率,\lambda\mu的计算方式如下:

其中k代表当前栖息地的物种数量,IE分别表示迁入率与迁出率的最大值,S_{\mathrm{max}}代表物种数量的最大值,\lambda\mu与物种数量的关系如图3所示,图中S0代表平衡点。

图3

BBO算法进行迁移操作的具体方法为:对于一个栖息地i,使用其迁入率\lambda来决定是否修改该栖息地的SIV(个体信息),如果选择修改,则使用其他栖息地的迁出率\mu根据轮盘赌原则来决定将哪个栖息地j中的物种迁出到栖息地i,以此实现不同栖息地之间的信息共享。

前文中提到HSI与物种数量挂钩,因此从上述说明中可以得出:高 HSI 解决方案倾向于与低 HSI 解决方案共享其特征信息,注意,这并不意味着这些特征从高 HSI 解中消失,而是共享特征保留在高 HSI 解中,同时在低 HSI 解中作为新特征出现。这类似于某个物种的一部分迁移到一个新的栖息地,而其他部分则留在原来的栖息地。

2.变异

BBO算法采用变异操作增加候选解的多样性。

由于灾难性事件可以极大地改变栖息地的 HSI,还可能导致物种数量与其平衡值不同。因此栖息地的 HSI 可能由于随机事件而发生突变。作者受此启发,在 BBO 算法中将其建模成为变异操作,并使用物种数量概率来确定变异率

变异率的计算方法由式(3)定义:

上式中,S代表当前物种数量,m(S)代表物种数量为S时的变异率,m_{\max}代表设置的最大变异率,P_{s}代表物种数量为S时的概率,P_{\max}表示物种概率的最大值。

物种数量概率P_{s}的计算方法如下:

由式(4)可看出物种数量概率是由物种数量、迁入率、迁出率三部分所共同决定的。

从式(3)中可得出变异率与物种数量概率成反比。原文中又提到:物种数量过低或者过高时,对应的物种数量概率都较低,此时变异率相对较高,中等的物种数量对应的物种数量概率较高(可以理解为中庸者占大多数,极好或者极差的占少数),此时变异率则较低,上述结论也可以由式(5)-(6)推导得出,其中P(\infty)是物种数量概率的向量,对应存放着不同物种数量i的对应概率。

综上所述,BBO算法对不良候选解和良好候选解都使用变异,使其产生一个新的随机解,而对于适中的候选解方案则尽量避免对它们进行变异(尽管仍然存在一些变异概率)。

3.精英策略

BBO算法同样采用精英策略来保存寻优过程中部分较好的候选解,以提升算法性能,这个策略比较常见,就不再赘述。

二、算法实现步骤

介绍完主要原理,现在对BBO算法的流程进行简单概括。

1.初始化BBO参数

        初始化种群规模(注意这里的种群不是上面的物种),问题维度,最大迭代次数MaxIt,最大迁入率I,最大迁出率E,最大变异率m_{\max},精英策略参数K,最大物种数量S_{\mathrm{max}}等。

2.初始化候选解

        根据求解问题的维度,搜索空间上下界等信息初始化种群当中的每个候选解(栖息地),并计算对应的适应度值(HSI)。

3.更新算法参数

        对于每一个栖息地,将其HSI映射为物种数量,并根据式(1)-式(2)计算对应的迁入率\lambda与迁出率\mu,然后根据式(3)-式(5)更新变异率m。

4.迁移、变异

        使用更新后的参数根据第一节中的步骤进行栖息地之间的迁移以及栖息地内部的变异。

5.精英保留

        在迁移操作与变异操作完成后,采用精英策略保留前K个最好(适应度最高)的栖息地,防止优秀解被后续操作损坏。

6.判断迭代是否终止

        根据给定条件(是否达到最大迭代次数或是否达到规定精度)判断算法迭代是否终止,如果继续迭代则返回步骤3更新算法参数,重复执行步骤3-6,直至满足迭代终止条件,输出最终的最优解。

三、Matlab代码实现

由于BBO算法提出的时间比较早,因此可参考的代码也比较多,以MATLAB为例,BBO算法的代码大致可以分为三个版本:

1.由Mostapha Kalami Heris实现的版本,优点是代码较为工整美观,易于读懂,缺点是感觉对原文的思想实现的不够到位。

2.由Seyedali Mirjalili教授实现的版本,这位教授大家可能很熟悉,著名的动物园园长,灰狼算法(GWO)、鲸鱼算法(WOA)、樽海鞘群算法(SSA)等经典算法的提出者。这个版本对原文的复现比较到位,可靠性比较高,但是代码相对可能要多花一点时间去理解。

3.最后一个当然是由原作者Dan Simon教授自己编写的版本了,优点自然不必多说,本人即权威,缺点是代码文件不完整,只能用作参考理解原文的思想,无法直接运行。

这里以第2个版本的代码为例给出部分核心代码,想要了解完整代码或者其他版本的代码可以私信我发你~

1.部分核心代码

定义相关参数,初始化种群:

[OPTIONS, MinCost, AvgCost, InitFunction, CostFunction, FeasibleFunction, ...
    MaxParValue, MinParValue, Population] = Init(DisplayFlag, ProblemFunction, RandSeed);

Population = CostFunction(OPTIONS, Population);

OPTIONS.pmodify = 1; 
OPTIONS.pmutate = 0.005; 

Keep = 2;
lambdaLower = 0.0; 
lambdaUpper = 1; 
dt = 1; 
I = 1; 
E = 1; 
P = OPTIONS.popsize; 

由适应度映射物种数量:

function [Population] = GetSpeciesCounts(Population, P)

for i = 1 : length(Population)
    if Population(i).cost < inf
        Population(i).SpeciesCount = P - i;
    else
        Population(i).SpeciesCount = 0;
    end
end
return;

计算迁入率、迁出率:

function [lambda, mu] = GetLambdaMu(Population, I, E, P)


for i = 1 : length(Population)
    lambda(i) = I * (1 - Population(i).SpeciesCount / P);
    mu(i) = E * Population(i).SpeciesCount / P;
end
return;

计算物种数量概率:

        for j = 1 : length(Population)
            lambdaMinus = I * (1 - (Population(j).SpeciesCount - 1) / P);

            muPlus = E * (Population(j).SpeciesCount + 1) / P;

            if j < length(Population)
                ProbMinus = Prob(j+1);
            else
                ProbMinus = 0;
            end
            if j > 1
                ProbPlus = Prob(j-1);
            else
                ProbPlus = 0;
            end
            ProbDot(j) = -(lambda(j) + mu(j)) * Prob(j) + lambdaMinus * ProbMinus + muPlus * ProbPlus;
        end

        Prob = Prob + ProbDot * dt;
        Prob = max(Prob, 0);
        Prob = Prob / sum(Prob); 

迁移:

    lambdaMin = min(lambda);
    lambdaMax = max(lambda);
    for k = 1 : length(Population)
        if rand > OPTIONS.pmodify
            continue;
        end
       
        lambdaScale = lambdaLower + (lambdaUpper - lambdaLower) * (lambda(k) - lambdaMin) / (lambdaMax - lambdaMin);

        for j = 1 : OPTIONS.numVar
            
            if rand < lambdaScale

                RandomNum = rand * sum(mu);
                Select = mu(1);
                SelectIndex = 1;
                while (RandomNum > Select) & (SelectIndex < OPTIONS.popsize)
                    SelectIndex = SelectIndex + 1;
                    Select = Select + mu(SelectIndex);
                end
                Island(k,j) = Population(SelectIndex).chrom(j);
            else
                Island(k,j) = Population(k).chrom(j);
            end
        end
    end

变异:

        Pmax = max(Prob);
        MutationRate = OPTIONS.pmutate * (1 - Prob / Pmax);

        Population = PopSort(Population);
        for k = round(length(Population)/2) : length(Population)
            for parnum = 1 : OPTIONS.numVar
                if MutationRate(k) > rand
                    Island(k,parnum) = floor(MinParValue + (MaxParValue - MinParValue + 1) * rand);
                end
            end
        end

精英保留:

    n = length(Population);
    for k = 1 : Keep
        Population(n-k+1).chrom = chromKeep(k,:);
        Population(n-k+1).cost = costKeep(k);
    end

2.仿真结果

这里以经典基准函数Quartic为例,最大迭代次数设为500,算法的最优解适应度随迭代变化曲线如下所示:


总结

作为一个比较老的算法,BBO在基准函数上的性能可能并没有后续提出的新型算法表现那么好,但是其作为一种经典算法,结构简单同时质量较高,已经有许多学者将其用于各种优化问题,因此BBO算法仍然具有学习研究的价值。

  • 31
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值