0

【AFSA】人工鱼群算法

 3 years ago
source link: https://www.guofei.site/2018/05/22/afsa.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【AFSA】人工鱼群算法

2018年05月22日

Author: Guofei

文章归类: 6-启发式算法 ,文章编号: 615


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

Edit

算法打包

已经把算法打包了,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的位置Xi=(x1,x2,…,xn)Xi=(x1,x2,…,xn)
鱼的每一步的最大位移 Step
最大尝试次数 TrynumTrynum
鱼的最大感知范围 visual
拥挤度阈值 delta

1. 觅食行为prey()

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

数学表示:
第一步
Xj=Xi+visual∗rand()Xj=Xi+visual∗rand()
(其中XiXi是鱼当前所在的点,XjXj是鱼感知到的点)
第二步
如果func(Xj)func(Xj)优于func(xi)func(xi),那么从XiXi向XjXj移动一步:
Xt+1i=Xti+Xj−Xti∣∣Xj−Xti∣∣×Step×rand()Xit+1=Xit+Xj−Xit∣∣Xj−Xit∣∣×Step×rand()
如果不优,回到第一步,直到尝试TrynumTrynum次,如果还是中心不更优,则进入随机行为 move()

2. 聚群行为swarm()

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

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

数学表示: 计算visual范围内其他鱼的数目nfnf和中心位置XcXc
如果func(Xc)nf>delta×Yifunc(Xc)nf>delta×Yi,向中心移动一步:
Xt+1i=Xt+1i+Xc−Xti∣∣Xc−Xt∣∣×step×rand()Xit+1=Xit+1+Xc−Xit∣∣Xc−Xt∣∣×step×rand()
如果不优,则开始觅食行为 prey()

3. 追尾行为follow()

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

数学表示: 计算visual范围内其他鱼的数目nfnf和最优func对应的XjXj
如果func(Xj)nf>delta×Yifunc(Xj)nf>delta×Yi,向这条鱼移动一步:
Xt+1i=Xt+1i+Xj−Xti∣∣Xj−Xt∣∣×step×rand()Xit+1=Xit+1+Xj−Xit∣∣Xj−Xt∣∣×step×rand()
如果不优,则开始觅食行为 prey()

4. 随机行为move()

Xt+1i=Xti+visual×rand()Xit+1=Xit+visual×rand()

算法过程

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

算法过程:

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

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK