量化软件下载:赫兹量化中种群优化算法---蝙蝠算法
1. 概述
蝙蝠是种神奇的动物。 科学家认为,最早的蝙蝠出现在 65-100 亿年前,曾与恐龙并肩生活。 蝙蝠是唯一有翅膀的哺乳动物。 蝙蝠的种类拥有 1300 多种。 除了极地高寒地区之外,它们几乎无处不在。 白天间,它们躲在避难所里。 为了在黑暗的洞穴中导航,并在天黑后狩猎,蝙蝠依靠回声定位,该系统允许它们依靠声波检测物体。 它们通过发出高频声波的回声定位,该声波向前移动,直到它击中物体,并被反射回来。 回声定位是一种声纳:蝙蝠发出响亮而短促的脉冲声波。 当声波到达物体时,回声会在短时间内反射回到蝙蝠的耳朵,这就是蝙蝠在空间中定位自己,并判定猎物位置的方式。
蝙蝠算法(BA)是杨(Yang)在 2010 年推出的一种启发式算法,它模仿蝙蝠的回声定位行为进行全局优化。 元启发式通常受到自然和物理过程的启发,现在被用作解决许多复杂优化问题的最强大的技术之一。 优化是从许多有效选项中选取最佳元素成为一组特定准则,这在计算效率和全局优化的可能性方面展现出许多不同的优点和缺点。
特征优化通过提供的“目标”函数,依据输入的参数,为建模和解决许多特定问题提供了一个正式的框架。 目标是找到组合参数的值,并返回最佳值。 这个框架足够抽象,因此可以将各种问题解释为“特征优化”问题。
然而,传统的特征优化仅能解决一些小问题,而在实践中这些往往不顶用。 故此,科学家们正在将注意力转向自然界,其为解决这些问题提供了丰富的模型。 通过对自然生物系统进行建模,提出了许多智能群体优化算法,可以非常规方法解决应用问题。 它们因其优异的性能而广泛用于各种优化问题。 BA 是一种新颖的现代种群算法,它使用人造蝙蝠作为搜索代理者,模拟真实蝙蝠的自然声波脉冲音量和发射频率,来执行搜索过程。
2. 算法说明
在基本的蝙蝠算法中,每个蝙蝠都被视为一个“无质量和无大小”的粒子,代表解空间中的有效解。 对于不同的适应度函数,每只蝙蝠都有对应的特征值,通过对比特征值来判定当前的最优个体。 然后更新声波的频率、速度、脉冲发射速度、和种群中每只蝙蝠的体积,继续迭代演化,逼近当前最优解,最终找到全局最优解。 该算法更新每只蝙蝠的频率、速度和位置。
标准算法需要五个基本参数:频率、音量、纹波、以及音量和纹波的比率。 频率用于平衡历史最佳位置对当前位置的影响。 当搜索频率范围较大时,单只蝙蝠就能远离群体的历史位置进行搜索,反之亦然。
与前面考虑的参数相比,该算法有很多参数:
input double MIN_FREQ_P = 0.0; input double MAX_FREQ_P = 1.0; input double MIN_LOUDNESS_P = 0.0; input double MAX_LOUDNESS_P = 1.5; input double MIN_PULSE_P = 0.0; input double MAX_PULSE_P = 1.0; input double ALPHA_P = 0.3; input double GAMMA_P = 0.3;
在实现 BA 算法时,我遇到了这样一个事实,即在众多来源中,各篇文章的作者以完全不同的方式描述算法。 区别仅在于关键点描述中所用的术语,和基本算法特征,因此我将讲述自己如何理解它。 回声定位的基本物理原理可以在用在算法当中,但有明显的保留和约定。 我们假设蝙蝠所用的频率范围从 MinFreq 到 MaxFreq 的声波脉冲。 频率会影响蝙蝠的速度。 还用到了音量概念的条件,这会影响蝙蝠从当前位置的局部搜索状态到最佳解附近的全局搜索状态的转换。 在整个优化过程中,脉动频率增加,而声波的音量减小。
BA 算法伪代码(图例 1):
1. 蝙蝠种群初始化。 2. 生成频率、速度和新解。 3. 搜索局部解。 4. 更新全局解。 5. 降低音量,提升脉动频率。 6. 重复步骤 2,直到满足停止条件。

编辑切换为居中
图例 1. BA 算法框图
我们开始讲述代码。 为了讲述“蝙蝠”搜索代理者,我们需要一个结构,在其中是每次迭代时的状态完整描述所需的所有特征。 position [] 数组用于存储空间中的最佳位置坐标,而 auxPosition [] 数组用于当前“操作”坐标。 speed [] 数组在按照坐标计算速度矢量时是必需的。 frequency - 声音脉冲的频率,initPulseRate - 初始脉冲速率(从优化一开始每个蝙蝠都是单独的),pulseRate - 当前迭代时的脉冲速率,loudness - 声波脉冲的音量,fitness - 最后一次移动后的适应度函数值,fitnessBest - 代理者所有迭代的适应度函数的最佳值。
//—————————————————————————————————————————————————————————————————————————————— struct S_Bat { double position []; double auxPosition []; double speed []; double frequency; double initPulseRate; double pulseRate; double loudness; double fitness; double fitnessBest; }; //——————————————————————————————————————————————————————————————————————————————
蝙蝠算法类包含搜索代理者所需的结构数组、欲探索空间的边界和步长、算法找到的最佳坐标、适应度函数的最佳值、和存储算法参数的常量,以及公开的初始化方法、算法进行操作所需的两个公开方法、和特定于算法的私密方法。
//—————————————————————————————————————————————————————————————————————————————— class C_AO_BA { //============================================================================ public: S_Bat bats []; //bats public: double rangeMax []; //maximum search range public: double rangeMin []; //manimum search range public: double rangeStep []; //step search public: double cB []; //best coordinates public: double fB; //FF of the best coordinates public: void Init (const int paramsP, const int batsNumberP, const double min_FREQ_P, const double max_FREQ_P, const double min_LOUDNESS_P, const double max_LOUDNESS_P, const double min_PULSE_P, const double max_PULSE_P, const double alpha_P, const double gamma_P, const int maxIterP); public: void Flight (int epoch); public: void Preparation (); //============================================================================ private: void Walk (S_Bat &bat); private: void AproxBest (S_Bat &bat, double averageLoudness); private: void AcceptNewSolutions (S_Bat &bat); private: int currentIteration; private: int maxIter; private: double MIN_FREQ; private: double MAX_FREQ; private: double MIN_LOUDNESS; private: double MAX_LOUDNESS; private: double MIN_PULSE; private: double MAX_PULSE; private: double ALPHA; private: double GAMMA; private: int params; private: int batsNumber; private: bool firstFlight; private: double SeInDiSp (double In, double inMin, double inMax, double step); private: double RNDfromCI (double min, double max); private: double Scale (double In, double InMIN, double InMAX, double OutMIN, double OutMAX, bool revers); }; //——————————————————————————————————————————————————————————————————————————————
在算法设置参数的 Init() 公开方法中,为数组分配内存,将变量重置为最小值以存储最佳拟合,并重置初始迭代的标志。 一般来说,这种方法并不复杂,而且很特别。