【AFSA】人工鱼群算法



2018年05月22日    Author:Guofei

文章归类: 0x60_启发式算法    文章编号: 615

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2018/05/22/afsa.html


算法打包

已经把算法打包了,scikit-opt

PyPI release Build Status codecov PyPI_downloads Stars Forks Join the chat at https://gitter.im/guofei9987/scikit-opt

def func(x):
    x1, x2 = x
    return 1 / x1 ** 2 + x1 ** 2 + 1 / x2 ** 2 + x2 ** 2


from sko.ASFA import ASFA

asfa = ASFA(func, n_dim=2, size_pop=50, max_iter=300,
            max_try_num=100, step=0.5, visual=0.3,
            q=0.98, delta=0.5)
best_x, best_y = asfa.fit()
print(best_x, best_y)

算法介绍

人工鱼群算法(artificial fish swarm algorithm)是李晓磊等人于2002年提出的一类基于动物行为的群体智能优化算法。

算子介绍

AFSA1

变量定义,
目标函数func(X)
人工鱼总数N
人工鱼i的位置$X_i=(x_1,x_2,…,x_n)$
鱼的每一步的最大位移 Step
最大尝试次数 $Try_{num}$
鱼的最大感知范围 visual
拥挤度阈值 delta

1. 觅食行为prey()

觅食分为两步,
第一步在感知范围内随机选取一个点
第二步判断这个随机选择的点是否比当前点更优,如果更优则向此点移动一步,否则再次尝试。

数学表示:
第一步
$X_j=X_i+visual*rand()$
(其中$X_i$是鱼当前所在的点,$X_j$是鱼感知到的点)
第二步
如果$func(X_j)$优于$func(x_i)$,那么从$X_i$向$X_j$移动一步:
$X_i^{t+1}=X_i^t+\dfrac{X_j-X_i^t}{\mid\mid X_j-X_i^t\mid\mid}\times Step\times rand()$
如果不优,回到第一步,直到尝试$Try_{num}$次,如果还是中心不更优,则进入随机行为 move()

2. 聚群行为swarm()

聚群行为会遵守两条原则:

  1. 尽量向伙伴移动
  2. 避免过分拥挤

数学表示: 计算visual范围内其他鱼的数目$n_f$和中心位置$X_c$
如果$\dfrac{func(X_c)}{n_f}>delta \times Y_i$,向中心移动一步:
$X_i^{t+1}=X_i^{t+1}+\dfrac{X_c-X_i^t}{\mid\mid X_c-X_t\mid\mid}\times step \times rand()$
如果不优,则开始觅食行为 prey()

3. 追尾行为follow()

与聚群行为的区别是,追随浓度最高的伙伴的点,而不是视野内的中心点。

数学表示: 计算visual范围内其他鱼的数目$n_f$和最优func对应的$X_j$
如果$\dfrac{func(X_j)}{n_f}>delta \times Y_i$,向这条鱼移动一步:
$X_i^{t+1}=X_i^{t+1}+\dfrac{X_j-X_i^t}{\mid\mid X_j-X_t\mid\mid}\times step \times rand()$
如果不优,则开始觅食行为 prey()

4. 随机行为move()

$X_i^{t+1}=X_i^{t}+visual \times rand()$

算法过程

算法过程比较简单,每次迭代反复调用 swarm(),follow()即可。
swarm,follow中有转向prey()的判断。prey感知几次不成功后,转入move()。所以每个算子都用到了

算法过程:

  1. swarm()
  2. follow()
  3. 返回1继续计算,直到达成算法结束的条件。

您的支持将鼓励我继续创作!