果蝇优化算法(FOA)的实现(Python附源码)

一、果蝇优化算法的实现思路

果蝇优化算法(Fruit Fly Optimization Algorithm,FOA)是潘文超于2011年提出的一种群智能优化算法,它模拟自然界中的果蝇进行觅食时的方式,将食物的位置信息类比于优化问题的最优解,将果蝇的当前位置类比于随机解,通过果蝇位置的不断移动最终获得食物即最优解。果蝇算法的实现思路较为简单,主要以果蝇的捕食方式作为算法迭代训练过程中的个体位置移动方式,该方式原理如下:

捕食方式

果蝇具有较强的嗅觉,它可以通过气味向同伴聚集或食物的方向进行移动,果蝇优化算法将此移动方式类比于受到种群中最优个体的位置影响,同时由于飞行的不确定性,增加一定的随机值进行干扰,具体计算公式如下:
在这里插入图片描述
其中x_new表示移动后的位置,x_best表示种群个体最优位置,rand()表示0到1之间的随机值。

二、算法步骤

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

  1. 以种群个体的位置信息作为待优化问题的解,根据待优化问题的解的范围,随机初始化种群所有个体的位置信息;
  2. 根据待优化问题,计算每个种群个体的适应度值,通过比较获得当前最优的位置信息并保存;
  3. 使用位置更新方式依次对种群中每个个体的位置信息进行更新;
  4. 针对每个个体更新后的位置信息,重新进行适应度值的计算,通过比较获得当前最优的位置信息并保存;
  5. 根据迭代的次数重复步骤3到步骤4,当达到最大迭代次数时停止迭代过程,输出历史最优的位置信息,该位置信息即为算法优化后获得的最优解。

三、实例

待求解问题:
Schwefels P2.22,取值范围为[-10,10],取值范围内的理想最优解为0,将其搜索的空间维度设为20。
在这里插入图片描述
实现源码:

import numpy as np
import matplotlib.pyplot as plt

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


sizepop = 30  #种群数量
dimension = 20   #解的空间维度
iteration = 100  #迭代次数
rangelow = -10   #解的最小取值
rangehigh = 10   #解的最大取值

#pop用于存储种群个体的位置信息,pop_fitness用于存储个体对应的适应度值
pop = np.zeros((sizepop,dimension))
pop_fitness = np.zeros(sizepop)

#对种群个体进行初始化并计算对应适应度值
for j in range(sizepop):
    pop[j] = np.random.uniform(low=rangelow, high=rangehigh,size=(1, dimension))
    pop_fitness[j] = function(pop[j])

#allbestpop,allbestfit分别存储种群在历史迭代过程中最优个体解及对应适应度
allbestpop,allbestfit = pop[pop_fitness.argmin()].copy(),pop_fitness.min()

#his_bestfit存储每次迭代时种群历史适应度值最优的个体适应度
his_bestfit=np.zeros(iteration)

#开始训练
for i in range(iteration):
    print("The iteration is:", i + 1)
    #每个个体朝着气味浓度最重的地方(适应度最优的位置)进行移动
    for j in range(sizepop):
        pop[j] = allbestpop + 2 * np.random.rand() - 1
        pop_fitness[j] = function(pop[j])
    # 对种群历史最优位置信息与适应度值进行更新
    if pop_fitness.min() < allbestfit:
        allbestfit = pop_fitness.min()
        allbestpop = pop[pop_fitness.argmin()].copy()
    # 存储当前迭代下的种群历史最优适应度值并输出
    his_bestfit[i] = allbestfit
    print("The best fitness is:", allbestfit)

print("After iteration, the best pop is:",allbestpop)
print("After iteration, the best fitness is:","%e"%allbestfit)

#输出训练后种群个体适应度值的均值与标准差
mean = np.sum(pop_fitness)/sizepop
std = np.std(pop_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,his_bestfit,color="red",label="FOA",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("FOA.png")
plt.show()

图中横轴为迭代次数,纵轴为最优适应度值。
果蝇优化算法(FOA)的实现(Python附源码)_第1张图片
参考源码

你可能感兴趣的:(群智能优化算法,python,算法,numpy)