萤火虫算法

import numpy as np
import matplotlib.pyplot as plt
import copy
import time
 
class FA:
    def __init__(self, D, N, Beta0, gama, alpha, T, bound):
        self.D = D          #问题维数  2维
        self.N = N          #群体大小即萤火虫的数目 20
        self.Beta0 = Beta0  #最大吸引度  初始化为1
        self.gama = gama    #光吸收系数  0.000001
        self.alpha = alpha  #步长因子    0.97
        self.T = T          #最大迭代次数 100
        self.X = (bound[1] - bound[0]) * np.random.random([N, D]) + bound[0] # 随机初始化萤火虫的坐标
        self.X_origin = copy.deepcopy(self.X)  # 萤火虫所在范围坐标
        self.FitnessValue = np.zeros(N)  # 初始化每个萤火虫的适应度值
        for n in range(N):
            self.FitnessValue[n] = self.FitnessFunction(n)
 
    # 确定每个萤火虫两两之间的距离
    def DistanceBetweenIJ(self, i, j):
        return np.linalg.norm(self.X[i,:] - self.X[j,:])
    # 计算对周围萤火虫的吸引度
    def BetaIJ(self, i, j):  # AttractionBetweenIJ
        return self.Beta0 * \
               np.math.exp(-self.gama * (self.DistanceBetweenIJ(i,j) ** 2))
    # 对于每个萤火虫而言,找到吸引度最高的萤火虫个体,并更新位置
    def update(self,i,j):
        self.X[i,:] = self.X[i,:] + \
                      self.BetaIJ(i,j) * (self.X[j,:] - self.X[i,:]) + \
                      self.alpha * (np.random.rand(self.D) - 0.5)
    # 根据萤火虫的位置计算出每个萤火虫的适应度值,适应度值越优的萤火虫亮度越高。
    def FitnessFunction(self,i):
        x_ = self.X[i,:]
        return np.linalg.norm(x_) ** 2
    
    # 迭代至最大迭代次数则结束,输出搜索到的最优的萤火虫的位置
    def iterate(self):
        t = 0
        while t < self.T:
            for i in range(self.N):
                FFi = self.FitnessValue[i]
                for j in range(self.N):
                    FFj = self.FitnessValue[j]
                    if FFj < FFi:
                        self.update(i, j)
                        self.FitnessValue[i] = self.FitnessFunction(i)
                        FFi = self.FitnessValue[i]
                        # 更新最优的萤火虫的位置和计算出萤火虫的适应度值
            t += 1
    
        # 输出萤火虫的最优适应度值及萤火虫的位置坐标
    def find_min(self):
        v = np.min(self.FitnessValue)
        n = np.argmin(self.FitnessValue)
        return v, self.X[n,:]
 
def plot(X_origin,X):
    fig_origin = plt.figure(0)
    plt.xlabel('x')
    plt.ylabel('y')
    colorlist = ['k','r','maroon','sienna','peru',
                    'darkorange','tan','orange','goldenrod','lightgreen',
                    'g','lime','springgreen','teal','c',
                    'cornflowerblue','navy','b','blueviolet','purple']
    # print(X_origin.shape)
    for i in range(X_origin.shape[0]):
        plt.scatter(X_origin[i, 0], X_origin[i, 1], c=colorlist[i])
    # plt.scatter(X_origin[:, 0], X_origin[:, 1], c='r')
    plt.scatter(X[:, 0], X[:, 1], c='aqua')
    # plt.scatter(X[:, 0], X[:, 1], c=colorlist[i])
    plt.show()
 
if __name__ == '__main__':
    t = np.zeros(10)
    value = np.zeros(10)
    for i in range(10):
        fa = FA(2,20,1,0.000001,0.97,100,[-100,100])
        time_start = time.time()
        fa.iterate()
        time_end = time.time()
        t[i] = time_end - time_start
        value[i],n = fa.find_min()
        # print(np.array(fa.X).shape)
        plot(fa.X_origin,fa.X)
    print("平均值:", np.average(value))
    print("最优值:", np.min(value))
    print("最差值:", np.max(value))
    print("平均时间:", np.average(t))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值