智能优化算法之萤火虫算法(FA)的实现(Python附源码)

Table of Contents

一、萤火虫算法的实现思路

萤火虫算法(Firefly Algorithm,FA)是由Yang于2010年提出的一种群智能优化算法,在自然界中,萤火虫之间通过自身发光来吸引异性前来交配以及吸引猎物进行捕猎,而该算法主要仿照自然界中萤火虫之间受彼此亮度而相互吸引的行为来进行目标范围内的寻优过程。
在萤火虫算法的基本思想中,主要涉及到的两个概念有两个,分别为吸引力与个体间的移动,下面将分别从这两个方面进行介绍。

1、吸引力

在萤火虫算法中,每个萤火虫的位置代表了一个待求问题的可行解,而萤火虫的亮度表示该萤火虫位置的适应度值,亮度越高的萤火虫个体在解空间内的位置越好,在解空间内,每个萤火虫会向着亮度比自己高的萤火虫飞行来搜寻更优的位置,亮度越大对其他的萤火虫的吸引度越大。同时,萤火虫之间光的传播介质会吸收光,降低光的亮度,影响光的传播,所以萤火虫之间的吸引度会随着空间距离成反比,即两只萤火虫之间的吸引度会随着这两只萤火虫之间距离的增大而减小。基于此,使用相互吸引度公式对萤火虫之间的吸引力进行计算。

其中β0为初始吸引度值,即两只萤火虫之间的距离为0时的吸引度,初始β0取值为1,γ为传播介质对光的吸收系数,一般取值为1,r为两只萤火虫之间的空间距离。
在对两个萤火虫之间的空间距离进行计算时,采用下列公式进行计算:

其中d表示位置信息的具体位置,x_ik与x_jk分别表示个体i与个体j在第k个维度的具体位置信息。

2、个体间的位置移动

受到吸引力的影响,种群中的每一只萤火虫均会被亮度比其大的萤火虫所吸引,进而向其所在的方向进行移动,具体的位置更新公式如下,而依次向所有亮度更大的个体移动完之后的位置才是萤火虫的最终确定位置。

其中个体更新后的位置信息等于更新前的位置信息加上其他个体对其的吸引移动量以及移动过程的干扰量,β为个体j对个体i的吸引度;α为步长的扰动因子,一般为0到1之间的随机数;rand()是-0.5到0.5之间满足均匀分布的随机数,由于萤火虫是朝向亮度比自己高的萤火虫进行飞行,因此在上述公式中个体j的适应度值高于个体i的适应度值。

二、算法步骤

使用萤火虫算法对优化问题进行求解时的具体步骤可以归纳如下:

  1. 设置种群的个体数量、初始吸引度值β0、传播介质对光的吸收系数γ以及步长的扰动因子α;
  2. 以萤火虫个体的位置信息作为待优化问题的解,以萤火虫个体的亮度作为解对应的适应度值,根据待优化问题的解的范围,随机初始化种群所有个体的位置信息;
  3. 根据待求解问题,计算种群中每个个体的适应度值,之后对种群个体的适应度值进行比较,将最高适应度值作为种群的历史最优适应度值,将其对应的位置信息作为种群的历史最优位置信息;
  4. 依次将每个个体与其它个体进行适应度值的比较,同时计算个体之间的空间距离,按照适应度值低的个体被适应度高的个体吸引的原则,确定每个个体分别被种群内哪些个体吸引并根据空间距离计算出每个个体受到的所有吸引力;
  5. 每个个体依次向所有适应度值比它高的个体位置方向进行移动,按照相关公式进行位置更新;
  6. 计算每个个体更新后的适应度值,对种群的历史最优适应度值、历史最优位置信息进行更新;
  7. 根据预设的迭代次数重复步骤4到步骤6,当达到最大迭代次数时停止迭代过程,输出种群的历史最优位置信息,此位置信息即为算法优化后获得的问题最优解。

三、实例

待求解问题:
Rosenbrock’s,取值范围为[-10,10],取值范围内的理想最优解为0,将其搜索的空间维度设为20。

实现源码:

#库的导入
import numpy as np
import matplotlib.pyplot as plt

#待求解问题
def function(x):
    y1 = 0
    for i in range(len(x) - 1):
        y2 = 100 * ((x[i + 1] - x[i] ** 2) ** 2) + (x[i] - 1) ** 2
        y1 = y1 + y2
    y = abs(0 - y1)
    return y

#计算个体间的空间距离
def distance(x,y):
    r = np.linalg.norm(x-y)
    return r

rangepop=[-10,10]  #取值范围
m = 50  #种群数量
gama = 1.0  #传播介质对光的吸收系数
belta0 = 1.0  #初始吸引度值
alpha = 1  #步长扰动因子
ite = 100  #迭代次数
#pop用于存储种群个体的位置信息,fitness用于存储个体对应的适应度值
pop = np.zeros((m,20))
fitness=np.zeros(m)
#对种群个体进行初始化并计算对应适应度值
for j in range(m):
    pop[j] = np.random.uniform(low=-10, high=10,size=(1, 20))
    fitness[j] = function(pop[j])
#bestpop,bestfit分别表示种群历史最优解和适应度值
bestpop, bestfit = pop[fitness.argmin()].copy(), fitness.min()
#bestfitness用于存储每次迭代时的种群历史最优适应度值
bestfitness=np.zeros(ite)
#开始训练
for i in range(ite):
    print("the iteration is :",i+1)
    #对每个个体位置与适应度值进行更新
    for j in range(m):
        #当前个体适应度值为种群最优的位置更新方式
        if fitness[j] == fitness.min():
            pop[j] = pop[j] + alpha * (np.random.rand()-0.5)
            # 确保更新后的位置在取值范围内
            pop[j][pop[j] < rangepop[0]] = rangepop[0]
            pop[j][pop[j] > rangepop[1]] = rangepop[1]
            fitness[j] = function(pop[j])
        #其他个体的位置更新方式
        else:
            #当前个体被其他适应度值优于自身的个体所吸引,然后进行位置移动
            for q in range(m):
                if fitness[q]<fitness[j]:
                    d = distance(pop[j],pop[q])
                    belta = belta0 * np.exp((-gama) * (d ** 2))
                    pop[j] = pop[j] + belta * (pop[q] - pop[j]) + alpha * (np.random.rand()-0.5)
                    # 确保更新后的位置在取值范围内
                    pop[j][pop[j] < rangepop[0]] = rangepop[0]
                    pop[j][pop[j] > rangepop[1]] = rangepop[1]
                    fitness[j] = function(pop[j])
        # 更新种群历史最优解以及对应的适应度值
        if fitness[j] < bestfit:
            bestfit = fitness[j]
            bestpop = pop[j]
    # 存储当前迭代时的种群历史最优适应度值
    bestfitness[i] = bestfit
    print("The historical best fitness is:",bestfitness[i])
print("After iteration, the best individual is:",bestpop)
print("After iteration, the best fitness is:",bestfit)
#输出训练后种群个体适应度值的均值与标准差
mean = np.sum(fitness)/m
std = np.std(fitness)
print("After iteration, the mean fitness of the swarm is:","%e"%mean)
print("After iteration, the std fitness of the swarm is:","%e"%std)

#将结果进行绘图
fig=plt.figure(figsize=(12, 10), dpi=300)
plt.rcParams['font.sans-serif']=['Arial Unicode MS']
plt.title('最优适应度值的变化情况',fontdict={'weight':'normal','size': 30})
x=range(1,101,1)
plt.plot(x,bestfitness,color="red",label="FA",linewidth=3.0, linestyle="-")
plt.tick_params(labelsize=25)
plt.xlim(0,101)
plt.yscale("log")
plt.xlabel("迭代次数",fontdict={'weight':'normal','size': 30})
plt.ylabel("适应度值",fontdict={'weight':'normal','size': 30})
plt.xticks(range(0,101,10))
plt.savefig("FA.png")
plt.show()

图中横轴为迭代次数,纵轴为最优适应度值。

参考源码

文章出处登录后可见!

立即登录
已经登录? 立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
0
C-means聚类算法实战 — 地表植被分类/数字聚类
上一篇 2023年11月13日
【人工智能】— 一阶逻辑、量词的推理规则、一般化分离规则、合一、前向/反向链接算法、归结算法
下一篇 2023年11月13日

相关推荐

  • Python使用python-snap7实现西门子PLC通讯 2023年3月8日
  • Python大学计算机程序设计-通讯录管理系统 2023年6月4日
  • python 查看程序的GPU显存占用 2023年2月26日
  • 你或许也想拥有专属于自己的AI模型文件格式(推理部署篇)-(7) 2022年3月6日
  • 【Python BUG】CondaHTTPError解决记录 2024年5月6日
  • YOLOv5/v7 Flask Web 车牌识别 | YOLOv7 + EasyOCR 实现车牌识别 2023年3月9日
  • 泛型的初步认识(2) 2024年4月22日
  • TensorBoard详解之安装使用和代码介绍 2023年2月25日
  • 黑白棋 AI 算法 2024年4月16日
  • 八皇后问题汇总(C++版) 2023年12月27日
  • 10.图像高斯滤波的原理与FPGA实现思路 2024年5月6日
  • python入门——DataFrame创建和索引 2023年8月23日
  • Neo4j详细介绍及使用教程 2023年12月7日
  • 《异常检测——从经典算法到深度学习》19 OmniAnomaly:基于随机循环网络的多元时间序列鲁棒异常检测 2023年3月4日
  • Python安装教程-史上最全 2023年3月2日
  • 在 MacOS 上安装 Stable Diffusion ,如何免费生成 AI 图像的分步指南 2023年3月24日

赞助商

此站出售,如需请站内私信或者邮箱!

天下网标王宁海县低价百度网站优化品牌网站优化医疗网站关键词优化网站页面html优化路北区网站优化北仑优化网站品牌网站优化如何优化渠道新网站关键词优化山东网站优化公司律师网站优化科技公司南召靠谱网站优化公司商洛网站优化策划怎样做好外贸网站优化网站优化自己可以做吗重庆定制网站排名优化报价阳泉网站优化哪家靠谱网站排名优化金手指11贵阳网站关键字优化德州提供网站优化哪家便宜崇明区企业网站优化费用绵阳手机网站优化服务孝南区网站优化作用外贸公司如何优化网站行业门户网站优化方法虹口区企业网站优化定制方案网站优化方案怎么写网站排名一百以外怎么优化韶关教育网站seo优化桂林优质网站优化代理公司深圳可靠的免费网站优化香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化