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))
萤火虫算法
最新推荐文章于 2022-12-29 21:37:09 发布