1 前言 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法,是一种搜索全局最优解的有效方法。该算法基于迭代优化,初始化为一组随机解,然后迭代搜寻最优解,且在最优解
1 前言蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法,是一种搜索全局最优解的有效方法。该算法基于迭代优化,初始化为一组随机解,然后迭代搜寻最优解,且在最优解周围通过随机飞行产生局部新解,加强局部搜索速度。该算法具有实现简单、参数少等特点。 该算法主要用于目标函数寻优,基于蝙蝠种群利用产生的声波搜索猎物和控制飞行方向的特征来实现函数的寻优。以一只蝙蝠作为基本单元,且每只蝙蝠都有一个适应值来对函数解空间进行优化。每只蝙蝠可以调整自身发射声波的响度、频率等对空间进行搜索,使整个种群的活动逐步由无序变为有序。但蝙蝠算法在寻优末段容易陷入局部的极值,本文引入变速度权重因子修正系数(和粒子群参数调整的自适应过程相似),尽可能避免局部极值的困境,从而达到全局寻优的效果。 2 蝙蝠算法原理细讲首先在自变量范围内产生蝙蝠的随机位置; 然后每个蝙蝠向周围某处移动,飞行靠声波反馈来更变方向,又向周围移动是随机的,蝙蝠下一时刻移动到某一位置有一定的出现频率,所以本文在运动公式中加了声波和频率两个因素。每一时刻的位移看作是一次飞行,每次飞行的距离很短(距离长短反映出搜素精度)。 每只蝙蝠初始位置是随机的,在初始位置时刻其中一只蝙蝠对应的函数最值,算法开始会记录该位置,然后所有蝙蝠逐渐向该位置靠近,飞行方向大致向当前最值方向(即该方向的位置该蝙蝠的出现频率更高),但是在飞行方向也是随机飞行的,相当于逐步搜索过去。蝙蝠飞行过程中不会因为当前飞行出现的最大值位置而改变种群的飞行趋势,这样可以尽量避免算法陷入局部极值。 算法每飞行一次就记录一次种群所处位置的最值,最后找出记录中的最值。 算法有两个参数可以影响最终的结果:种群数量和飞行次数。其中种群数量的影响是最大的。 3 详细步骤3.1 初始化相关参数 蝙蝠的位置为Xi,飞行速度Vi,声音响度为Ai,频率yi范围,设有目标函数为 : 3.2 更改脉冲频率产生的解并更变蝙蝠位置与飞行速度 蝙蝠i在t-1时的位置和飞行速度分别表示为和,群体当前找到的最优位置为。接着根据自身发出不同的音响搜寻猎物,通过接受反馈信息来调整位置xi和飞行速度v(i)。其飞行的速度更变公式如下: w(t)其中为时刻变速惯性权重因子,作用是使蝙蝠的前期搜索对后期搜索提供参照,wmax为w(t)的最大值、wmin为w(t)的最小值;,一般取2,Tmax为最大迭代次数;为当前位置最优解;y(i)为频率满足正态均匀分布的一个随机数,β是一个随机变量,且。开始运行时,蝙蝠在随机进行频率分配。 为控制蝙蝠所处位置在自变量范围内,本文针对该情况设置了边界规则:如果下次运动的位置超出了自变量范围,那么下次飞行的位置为投影在的边界上的位置。 3.3 搜寻局部最优解 3.4 通过蝙蝠多次飞行产生多个新解,进行全局搜索,若得到的新解 那么接受该解。 3.5 排列所有蝙蝠的位置,并找出当前最优值及对应的位置 3.6 设当前最优解为,然后使所有蝙蝠继续向下一时刻运动,并返回步骤2重新计算。 3.7 时刻结束,输出:最优解 4 Python实现4.1 代码
4.2 结果5 Matlab实现5.1 代码
5.2 结果5.3 展望如果是其他函数怎么办呢? 函数z=21.5+u(1)*sin(4*pi*u(1))+u(2)*sin(20*pi*u(2))中的两个自变量对应程序中的是Sol(i,1)=-3+(12.1+3)*rand(1,1);%x自变量范围【-3,12.1】和Sol(i,2)=4.1+(5.8-4.1)*rand(1,1);%y自变量【4.1,5.8范围】,两自变量产生的是列矩阵,而程序中Sol(i,:) 提取的是矩阵中的行,所以如果对该函数增减自变量,或者想求其他含有多个自变量的函数,程序中只用修改以下程序部分,其他参数也可以自行更改(注:自变量的范围和个数增加了,那么种群个数和飞行次数务必要增加): Sol(i,1)=-3+(12.1+3)*rand(1,1);%x自变量范围【-3,12.1】 Sol(i,2)=4.1+(5.8-4.1)*rand(1,1);%y自变量【4.1,5.8范围】 和 % x自变量范围 u=-3; o=12.1; % y自变量范围 p=4.1; l=5.8; |
2019-06-18
2019-07-04
2021-05-23
2021-05-27
2021-05-27