优化算法:人工蜂鸟算法AHA

目录

灵感

原理

 初始化

引导觅食Guided foraging

 领土觅食Territorial foraging

 迁移觅食Migration foraging

 AHA伪代码

AHA与ABC的概念比较

结论

参考文献与算法下载


灵感

        人工蜂鸟算法(Artificial hummingbird algorithm: AHA)的灵感主要来源于蜂鸟的飞行技巧、记忆能力和觅食策略。

        蜂鸟是一种令人惊叹的动物,被认为是世界上最小的鸟类。如果用大脑与身体的比例来衡量它们的智力,蜂鸟将是地球上最聪明的动物,包括人类。全世界大约有360种蜂鸟,大多数种类的体长只有7.5到13厘米蜂蜂鸟是最小的蜂鸟,平均身长5.5厘米,体重1.95克蜂鸟拍打翅膀的频率是所有鸟类中最高的,每秒可达80次。一般来说,蜂鸟以各种昆虫为食,比如蚊子、象鼻虫和蚜虫。为了给飞行提供足够的能量,蜂鸟每天还会吃大量的花蜜和花内的甜液体。图1显示了一只觅食的蜂鸟

        蜂鸟的特别之处在于它们惊人的觅食记忆。蜂鸟的大脑中有一个海马体,它在学习和记忆中起着至关重要的作用,比迄今为止任何其他鸟类的海马体都要大得多。蜂鸟体型虽小,但极其聪明,大脑与身体的比例比其他任何鸟类都要大,这证明了蜂鸟拥有惊人的记忆力[61]。事实上,每只蜂鸟都能记住某一地区某朵花的具体信息,包括花蜜的位置、花蜜的质量和含量[62]、花蜜的补充率[63]以及它们最后一次访问这朵花的时间。鸟儿也记得食物来源的时空信息。有了这些信息,蜂鸟实际上可以有效地进行计划,避免重复最近采样的花朵[61]。个体经历记忆的使用和存储被称为情景记忆(episodic memory),以前常被用来区分动物和人类[64]。有了这种独特的技能,蜂鸟成为高效的觅食者,并倾向于访问它们很久没有访问过的花朵,以获得更大的回报。

        蜂鸟的另一项特殊技能是飞行能力。它们小巧的身体和高频的翅膀拍动使它们成为鸟类中最好的飞行者。由于有灵活的肩关节,蜂鸟可以将翅膀旋转180度,并保持它们的翅膀以8字形运动。这种独特的飞行方式帮助蜂鸟从下划和上划中获得力量[65],而其他鸟类只是简单地拍打翅膀,从下划中获得升力。蜂鸟可以被认为是鸟类世界的直升机,因为它们经常可以被观察到像直升机一样上升。蜂鸟可以精确地向任何方向飞行。蜂鸟除了能像其他鸟类一样飞行外,还能以不同的姿态飞行,包括前后、上下、左右[66]。斜向飞行也是一种特殊的飞行姿势,蜂鸟掌握的飞行姿势与其他鸟类不同。

        在寻找食物时,它们可以在潜在的食物资源周围盘旋。令人难以置信的是,蜂鸟可以在空中的一个地方停留一段时间。蜂鸟具有很强的候鸟性;由于天气恶劣或食物短缺,他们通常会飞行数千英里迁徙到偏远地区。

原理

本节提出了一种基于蜂鸟智能行为的仿生优化算法AHA。AHA的三个主要组成部分解释如下。

        食物来源:在现实生活中,蜂鸟为了从一组食物来源中选择一个合适的食物来源,通常会对食物来源的性质进行评估,包括单株花的花蜜质量和含量、补充花蜜的速度、最后一次访问花的时间等。为了简单起见,AHA假设每个食物来源都有相同数量和相同类型的花;食物源是一个解向量,食物源的花蜜填充率用函数适应度值表示。适应度值越高,食物源的灌浆率越高。

        蜂鸟:每只蜂鸟总是被分配到一个特定的食物来源,然后这只蜂鸟和食物来源有相同的位置。蜂鸟可以记住这种特定食物来源的位置和花蜜补充率,并与种群中的其他蜂鸟分享信息。此外,对于每只蜂鸟来说,它还能记住自己多长时间没有访问每个食物来源。

        访问表:访问表记录了不同蜂鸟对每个食物源的访问级别,表示同一蜂鸟上次访问某个食物源到目前为止的时间。蜂鸟访问级别高的食物来源将优先访问该蜂鸟。为了获得更多的花蜜,一个蜂鸟在访问次数相同的食物源中,更倾向于访问补充花蜜率最高的食物源。每只蜂鸟都可以通过访问表找到它的目标食物来源。访问表通常在每次迭代期间更新。

AHA算法是一种基于群的元启发式方法,旨在解决优化问题。本节提供了三个数学模型,模拟蜂鸟的三种觅食行为:引导觅食、领地觅食和迁徙觅食。这三种觅食行为如图2所示。与大多数基于群的优化器相似,所提算法的结构可以分为三个主要阶段。算法1给出了AHA的总体结构。

 初始化

        蜂鸟初始化:n只蜂鸟被放置在n个食物源上,随机初始化如下

其中Low和U p分别是d维问题的上界和下界,r是[0,1]中的随机向量,xi表示作为给定问题解的第i个食物源的位置。

        访问表:食物来源访问表初始化如下:

访问表初始化含义,i代表蜂鸟,j代表食物点。由于每次,蜂鸟i与食物点j的值进行比较,因此对角线的访问值统一为空null。

 其中i = j, VTi,j = null表示蜂鸟在特定的食物来源进食;对于i̸= j, VTi,j = 0表示在当前迭代中第i只蜂鸟刚刚访问了第j个食物源。

引导觅食Guided foraging

        每只蜂鸟都有一种自然的倾向,即会去采蜜量最大的食物源,这意味着目标食物源需要有较高的补蜜率和较长时间不被蜂鸟光顾。因此,在AHA中,蜂鸟应该确定访问次数最高的食物来源进行引导觅食行为,然后选择其中补充花蜜率最高的作为目标食物来源。确定了目标食物来源后,蜂鸟就会飞向目标食物来源进行进食。

        在觅食过程中,通过引入方向切换向量,充分利用了全向、对角和轴向三种飞行技能,并在AHA算法中建模。这个向量用于控制d维空间中的一个或多个方向是否可用。图3为三维空间的三种飞行行为。

        可以看出,轴向飞行表明蜂鸟可以沿任何坐标轴飞行;对角线飞行允许蜂鸟从矩形的一个角移动到另一个角,由三个坐标轴中的任意两个决定。全向飞行表明任何飞行方向都可以投射到三个坐标轴中的每一个。换句话说,所有的鸟类都是全向飞行,但只有蜂鸟掌握了轴向飞行和对角线飞行。

 

        针对多维度问题,三种飞行姿态,代表一维、多维、全维度改变。

        引导觅食行为和候选食物源的数学方程:

        候选食物源与食物源比较迭代

         图5显示了一组六个食物来源的访问表,其中放置了六只蜂鸟。访问表中的数字是访问级别,表示蜂鸟不访问食物源的时间。例如,蓝色的数字“8”表示蜂鸟x2在8个时间段内没有访问蜂鸟x5所居住的食物来源。算法2给出了AHA的导向觅食策略。

 引导飞行伪代码

         下面的例子(一个最小化问题)展示了如何维护访问表,以及如何在引导觅食策略中为每只蜂鸟选择目标食物来源。

        给定4只蜂鸟,它们的位置和访问表使用等式初始化。(1)和(2)。

        第一种蜂鸟找到的三种食物源访问水平相同,其中蜂鸟x4的食物源补充花蜜率最高。因此,这个源就是目标第一只蜂鸟的食物来源。在方程式。对该蜂鸟进行(6)和(8),由于蜂鸟x1都没有访问过蜂鸟x2和x3的食物源,因此蜂鸟x2和x3的食物源访问级别加1,目标食物源x4初始化为0。图6(a)显示了第一只蜂鸟访问级别的更新和目标食物来源的选择。

        第二只蜂鸟找到的三种食物源访问水平相同,其中蜂鸟x4的食物源补充花蜜率最高。因此,蜂鸟x4的食物来源是第二只蜂鸟的目标食物来源。在方程式。对第二个蜂鸟进行(6)和(8),蜂鸟源x1和x3的访问级别增加1,目标源x4初始化为0。由于候选蜂鸟v2的花蜜填充率优于源蜂鸟x2,所以将候选蜂鸟x2的蜂鸟源替换为候选蜂鸟v2,因此需要将其他蜂鸟源x2的访问级别更改为每一行访问级别增加1的最高访问级别。图6(b)显示了第二只蜂鸟访问级别的更新和目标食物来源的选择。

        对于第三只蜂鸟,蜂鸟x2的食物源因其访问级别最高而成为目标食物源,因此蜂鸟x1和x4的食物源访问级别增加1,目标来源x2的访问级别初始化为0。第三只蜂鸟的访问级别更新和目标食物来源选择如图6(c)所示。

        对于第4只蜂鸟,访问级别最高的蜂鸟x2的食物来源为其目标食物来源,因此将来源x2的访问级别初始化为0,将蜂鸟来源的访问级别初始化为0X1和x3增加1。由于源x4被其候选v4所取代,所以源x4对其他蜂鸟的访问级别需要更改为每一行增加1的最高访问级别。图6(d)显示了第四只蜂鸟访问级别的更新和目标食物来源的选择。经过一次迭代,更新后的蜂鸟访问表如图7所示。

         关于访问表更新的理解:

        1.首先通过访问表数字大小(最高级,大矩阵表内数字)与花蜜率(对应xi的f(x)的值)确定访问the target food source目标食物源。对于蜂鸟,根据食物源进行引导觅食或者根据自身位置进行领域觅食,目标食物源用于进行变化的,同序号蜂鸟与食物源进行比较

        2.之后,与目标食物源进行比较,与自身同样序号食物源进行比较。图a,c,如果小于目标食物源且小于同序号,则食物源群体均保持不变,同一行除了对比点与同序号点以外,访问值均+1;图b如果大于同序号小于访问值,替换掉同序号,同一行除了对比点归0以外,访问值均+1,同一列成为自己所在行的最大值(原最大值+1);图d如果大于同序号且大于访问值,替换掉同序号,同一行除了对比点归0以外,访问值均+1,同一列成为自己所在行的最大值(原最大值+1)。

 领土觅食Territorial foraging

        蜂鸟在到达它的目标食物源,也就是吃了花蜜的地方后,很可能会寻找新的食物源,而不是去其他现有的食物源。因此,蜂鸟可以很容易地移动到自己领地内的邻近地区,在那里可能会发现一个新的食物来源,作为一个可能比当前更好的候选解决方案。模拟蜂鸟在领地觅食策略下的局部搜索和候选食物来源的数学方程为:

 

         其中b为领土因子,服从正态分布N(0,1),均值为0,标准差为1。式(9)可以让任何蜂鸟凭借其特殊的飞行技能,根据自身的位置,很容易地在附近找到新的食物来源。在执行区域觅食策略后,需要更新访问表。算法3给出了AHA的区域觅食策略。

        伪代码:

 迁移觅食Migration foraging

        当蜂鸟经常光顾的地区往往缺乏食物时,蜂鸟通常会迁徙到更远的食物来源觅食。在AHA算法中,定义了一个迁移系数。如果迭代次数超过迁徙系数的预定值,处于灌浆率最差的食物源的蜂鸟将迁移到整个搜索空间中随机产生的新的食物源。这时,这只蜂鸟会放弃旧的来源,留在新的来源进食,然后完成访问表的更新。蜂鸟从补蜜率最差的源头到随机产生的新蜂鸟的迁徙觅食,可得:

其中xwor为种群中花蜜补充率最差的食物来源。算法4给出了AHA的迁移觅食策略。

在引导觅食策略中,当没有食物源调整位置时,蜂鸟倾向于向不同的食物源移动作为各自的目标食物源,从而导致更高的探索,收敛到局部最优的概率较低。当一个食物源被一个新的食物源更新时,这个更新的食物源比旧的更有可能,因为相同的目标食物源会引导驻扎在其他不同食物源的蜂鸟向它移动,从而导致更高的开发。由式(6)可知,在迭代初期,由于食物源之间距离较远,因此强调探索,而随着迭代次数的增加,距离自适应减小,因此强调开发。

在领地觅食策略中,蜂鸟在其附近区域进行开发过程。

        此外,蜂鸟的迁徙觅食表明蜂鸟已经在搜索空间中实现了探索过程。在AHA中,在考虑是否进行迁移时,除了种群大小和最大迭代次数这两个常见参数外,只需要确定一个控制参数。在最坏的情况下案例中,如果在进行引导觅食和领地觅食时,所有的食物源都没有替代,蜂鸟会根据每次迭代的访问表依次访问每一个食物源作为其目标来源。假设在引导觅食和领土觅食之间选择的概率为50%,并且在引导觅食中访问其他所有来源的概率相同。因此,在最坏的情况下,蜂鸟可能会在2n次迭代后访问与目标源相同的食物源。在这种情况下,需要执行迁移觅食策略来改善停滞和探索搜索空间。因此,对于相对于人口规模的迁移系数,建议定义如下:

 AHA伪代码

AHA首先初始化一组随机解决方案和一个访问表。在每次迭代中,执行引导觅食或领土觅食的概率为50%。引导觅食使蜂鸟能够移动到它们各自的目标食物来源,由访问表和花蜜补充率决定。地盘觅食迫使蜂鸟扰乱自己的邻居。对于每2n次迭代,执行迁移搜索。这三种觅食行为都使用了三种飞行技能,包括全向飞行、对角飞行和轴向飞行。所有操作和计算都是交互进行的,直到达到停止准则。最终,具有最佳花蜜填充率的食物源作为全局最优值的近似值返回。算法5给出了AHA的伪代码。

AHA算法的计算复杂度与初始化、适应度评估(c)、蜂鸟位置更新、蜂鸟种群大小(N)、最大迭代次数(T)、变量维数(d)有关。AHA算法的整体计算复杂度可表示为:

AHA与ABC的概念比较

         AHA和ABC是一种基于群的、生物启发的元启发式算法,虽然形式上看起来很相似,但AHA有其特点。ABC模拟了三种蜜蜂在寻找食物来源时的觅食行为,而AHA更侧重于模拟蜂鸟在觅食过程中的记忆能力和飞行技能。ABC算法的优化过程可分为三个阶段:受雇蜂搜索阶段、围观蜂搜索阶段和侦察蜂搜索阶段。在被雇佣的蜜蜂搜索阶段,群体中的每个个体更新其相对于随机选择的个体的位置,除了它自己。在围观蜂搜索阶段,群体中的每个个体根据适应度值更新其相对于轮盘赌机制选择的个体的位置。两个阶段个体的位置更新均采用随机走路。在侦察蜂搜索阶段,个体达到预定义的限制值的位置被搜索空间中一个新的随机产生的位置所取代。在AHA中,优化过程分为三个阶段,包括引导觅食阶段、区域觅食阶段和迁移觅食阶段。在引导觅食阶段,群体中的每一个个体都会根据访问表选择的个体及其适合度值更新自己的位置,访问表会跟踪其他个体的位置没有被访问的时间,因此,没有被访问时间最长且适合度值更好的个体的位置就成为它的访问目标。在领地觅食阶段,每个个体通过在邻近区域增加扰动来更新其位置。两个阶段个体的位置更新采用三种战斗技能。在迁移觅食阶段,当迭代过程中满足迁移系数时,适应度值最差的个体在搜索空间中的位置被随机生成的新位置所取代。因此,通过上述分析可以发现,ABC和AHA在求解优化问题时采用的方法完全不同。

 上述算法描述表明:

•AHA是一种生物启发的元启发式方法,以蜂鸟的觅食和飞行为动力,用于解决全局优化问题。

•该算法模拟了蜂鸟的三种觅食策略:引导觅食、领地觅食和迁徙觅食。

•提出的三种飞行技能,包括全向飞行、对角飞行和轴向飞行,被整合到引导觅食、领土觅食的策略中,以执行有效的搜索。

•访问表记录了不同蜂鸟对每种食物来源的访问级别。AHA需要维护访问表,以便每只蜂鸟都能找到自己的目标食物来源并访问该来源。

•访问表可以提高蜂鸟对所有食物源的遍历访问,减少对同一食物源的重复访问。

•在引导觅食策略中,每只蜂鸟需要确定自己的目标食物源,即在相同最高访问级别的食物源中,补充花蜜率最好的食物源。

•引导搜索策略专注于迭代早期的探索,但侧重于迭代后期的开发。

•领土觅食策略有助于开发和迁移致力于探索。

•AHA实现非常简单,只需要调整很少的参数

结论

        本文从蜂鸟的飞行技能和觅食行为出发,提出了一种新的仿生优化技术——AHA算法,用于处理不同的优化任务。通过对三种觅食行为、食物来源记忆函数和三种飞行模式的联合模拟,求解全局优化问题。

        改进工作:因此,在今后的工作中,改进算法有几个研究方向。这个原始版本可以使用各种策略来推广。一方面,一些随机算子可以集成到AHA中,以开发一个改进的版本,包括有用的启发式,如确定性算子、混沌映射和局部搜索行为。另一方面,AHA可以配备一些来自其他优化技术的搜索组件来设计一个混合版本。此外,还可以开发其他的AHA变体来解决二元或多目标问题。

确定性算子、混沌映射和局部搜索行为

        确定性算子是指在确定性系统中,对于任意一个初始状态,其下一状态都是唯一的。混沌映射是一种由简单的确定性系统产生的随机性序列,被用于生成混沌序列。一般混沌序列具有以下主要特征:非线性、对初值的敏感依赖性、遍历性、随机性、奇异吸引子(混沌吸引子)、分数维持性、整体稳定局部不稳定、长期不可预测性、轨道不稳定性及分叉、普适性和Feigenbaum常数。局部搜索行为是指在当前点的邻域内搜索,找到邻域内的最优解。将当前函数值与邻域内最优解的函数值作比较,如果当前函数值更小,则停止搜索,输出当前解作为局部最优解;否则,将该取到邻域内最优解设为当前点解。

模型代码:

###############################################################################
# Python code of AHA.                                                         #
# The python code is based on the following papers:                           #
# W. Zhao, L. Wang and S. Mirjalili, Artificial hummingbird algorithm: A      #
# new bio-inspired optimizer with its engineering applications, Computer      #
# Methods in Applied Mechanics and Engineering (2021) 114194, https:          #
# //doi.org/10.1016/j.cma.2021.114194.                                        #
###############################################################################
import numpy as np
# from torch import randperm
from matplotlib.pyplot import *
from pylab import *
import random

def fun_range(fun_index):
    d = 30
    if fun_index == 1:
        l = [-100]
        u = [100]
    elif fun_index == 2:
        l = [-30]
        u = [30]
    elif fun_index == 3:
        l = [-500]
        u = [500]
    elif fun_index == 4:
        l = [-512]
        u = [512]
        d = 2
    elif fun_index == 5:
        l = [-5, 0]
        u = [10, 15]
        d = 2
    elif fun_index == 6:
        l = [-50]
        u = [50]
    return l, u, d


def ben_functions(x, function_index):
    # Sphere
    if function_index == 1:
        s = sum(np.square(x))
    # Rosenbrock
    elif function_index == 2:
        s = sum(100.0 * (x[1:] - x[:-1] ** 2.0) ** 2.0 + (1 - x[:-1]) ** 2.0)
    # Schwefel
    elif function_index == 3:
        s = sum(x * np.sin(np.sqrt(abs(x))))
    # Eggholder
    elif function_index == 4:
        s = -(x[1] + 47.0) * np.sin(np.sqrt(abs(x[0] / 2 + (x[1] + 47.0)))) - x[0] * np.sin(
            np.sqrt(abs(x[0] - (x[1] + 47.0))))
    # Branin
    elif function_index == 5:
        s = ((x[1] - 5.1 / (4 * np.pi ** 2) * x[0] ** 2 + 5 / np.pi * x[0] - 6) ** 2 + 10 * (
                1 - 1 / (8 * np.pi)) * np.cos(x[0]) + 10)
    # Penalized
    elif function_index == 6:
        a = 10
        k = 100
        m = 4
        Dim = len(x)
        s = (pi / Dim) * (10 * ((np.sin(pi * (1 + (x[0] + 1) / 4))) ** 2) + sum(
            (((x[:-1] + 1) / 4) ** 2) * (1 + 10 * ((np.sin(pi * (1 + (x[1:] + 1) / 4)))) ** 2)) + (
                                  (x[Dim - 1] + 1) / 4) ** 2) + sum(
            k * ((x - a) ** m) * (x > a) + k * ((-x - a) ** m) * (x < (-a)))
    return s


def space_bound(X, Up, Low):
    dim = len(X)
    S = (X > Up) + (X < Low)
    res = (np.random.rand(dim) * (np.array(Up) - np.array(Low)) + np.array(Low)) * S + X * (~S)
    return res


def AHA(fun_index, max_it, npop):
    lb, ub, dim = fun_range(fun_index)
    if len(lb) == 1:
        lb = lb * dim
        ub = ub * dim
    pop_pos = np.zeros((npop, dim))
    for i in range(dim):
        pop_pos[:, i] = np.random.rand(npop) * (ub[i] - lb[i]) + lb[i]
    pop_fit = np.zeros(npop)
    for i in range(npop):
        pop_fit[i] = ben_functions(pop_pos[i, :], fun_index)
    best_f = float('inf')
    best_x = []
    for i in range(npop):
        if pop_fit[i] <= best_f:
            best_f = pop_fit[i]
            best_x = pop_pos[i, :]
    his_best_fit = np.zeros(max_it)
    visit_table = np.zeros((npop, npop))
    diag_ind = np.diag_indices(npop)
    visit_table[diag_ind] = float('nan')
    for it in range(max_it):
        # Direction
        visit_table[diag_ind] = float('-inf')
        for i in range(npop):
            direct_vector = np.zeros((npop, dim))
            r = np.random.rand()
            # Diagonal flight
            if r < 1 / 3:
                rand_list = list(range(dim))
                random.shuffle(rand_list)
                rand_dim = rand_list[:dim]
                if dim >= 3:
                    rand_num = np.ceil(np.random.rand() * (dim - 2))
                else:
                    rand_num = np.ceil(np.random.rand() * (dim - 1))

                direct_vector[i, rand_dim[:int(rand_num)]] = 1
            # Omnidirectional flight
            elif r > 2 / 3:
                direct_vector[i, :] = 1
            else:
                # Axial flight
                rand_num = ceil(np.random.rand() * (dim - 1))
                direct_vector[i, int(rand_num)] = 1
            # Guided foraging
            if np.random.rand() < 0.5:
                MaxUnvisitedTime = max(visit_table[i, :])
                TargetFoodIndex = visit_table[i, :].argmax()
                MUT_Index = np.where(visit_table[i, :] == MaxUnvisitedTime)
                if len(MUT_Index[0]) > 1:
                    Ind = pop_fit[MUT_Index].argmin()
                    TargetFoodIndex = MUT_Index[0][Ind]
                newPopPos = pop_pos[TargetFoodIndex, :] + np.random.randn() * direct_vector[i, :] * (
                        pop_pos[i, :] - pop_pos[TargetFoodIndex, :])
                newPopPos = space_bound(newPopPos, ub, lb)
                newPopFit = ben_functions(newPopPos, fun_index)
                if newPopFit < pop_fit[i]:
                    pop_fit[i] = newPopFit
                    pop_pos[i, :] = newPopPos
                    visit_table[i, :] += 1
                    visit_table[i, TargetFoodIndex] = 0
                    visit_table[:, i] = np.max(visit_table, axis=1) + 1
                    visit_table[i, i] = float('-inf')
                else:
                    visit_table[i, :] += 1
                    visit_table[i, TargetFoodIndex] = 0
            else:
                # Territorial foraging
                newPopPos = pop_pos[i, :] + np.random.randn() * direct_vector[i, :] * pop_pos[i, :]
                newPopPos = space_bound(newPopPos, ub, lb)
                newPopFit = ben_functions(newPopPos, fun_index)
                if newPopFit < pop_fit[i]:
                    pop_fit[i] = newPopFit
                    pop_pos[i, :] = newPopPos
                    visit_table[i, :] += 1
                    visit_table[:, i] = np.max(visit_table, axis=1) + 1
                    visit_table[i, i] = float('-inf')
                else:
                    visit_table[i, :] += 1
        visit_table[diag_ind] = float('nan')
        # Migration foraging
        if np.mod(it, 2 * npop) == 0:
            visit_table[diag_ind] = float('-inf')
            MigrationIndex = pop_fit.argmax()
            pop_pos[MigrationIndex, :] = np.random.rand(dim) * (np.array(ub) - np.array(lb)) + np.array(lb)
            visit_table[MigrationIndex, :] += 1
            visit_table[:, MigrationIndex] = np.max(visit_table, axis=1) + 1
            visit_table[MigrationIndex, MigrationIndex] = float('-inf')
            pop_fit[MigrationIndex] = ben_functions(pop_pos[MigrationIndex, :], fun_index)
            visit_table[diag_ind] = float('nan')
        for i in range(npop):
            if pop_fit[i] < best_f:
                best_f = pop_fit[i]
                best_x = pop_pos[i, :]
        his_best_fit[it] = best_f
    return best_x, best_f, his_best_fit


def main():
    # fun_index = 1: Sphere
    # fun_index = 2: Rosenbrock
    # fun_index = 3: Schwefel
    # fun_index = 4: Eggholder
    # fun_index = 5: Branin
    # fun_index = 6: Penalized
    fun_index = 1
    max_it = 1000
    npop = 50
    best_x, best_f, his_best_fit = AHA(fun_index, max_it, npop)
    if best_f > 0:
        yscale('log')
        plot(arange(1, max_it + 1), his_best_fit, 'r')
    else:
        plot(arange(1, max_it + 1), his_best_fit, 'r')
    xlim([0, max_it + 1])
    xlabel('Iterations')
    ylabel('Fitness')
    title('F' + str(fun_index))
    show()
    print('The best solution is: ', best_x)
    print('The fitness is: ', best_f)



if __name__ == '__main__':
    main()

参考文献与算法下载

参考文献:Artificial hummingbird algorithm: A new bio-inspired optimizer with its engineering applications

代码地址1:https://seyedalimirjalili.com/aha

代码地址2:https://www.mathworks.com/matlabcentral/fileexchange/101133-artificial-hummingbird-algorithm?s_tid=srchtitle.

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值