|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
import numpy as np
import matplotlib.pyplot as plt
class ACO:
#函数1
def fitness(self, x):
total=0
for i in range(0,len(x)):
total = total+x[i]
y=np.floor((total*100)/100)
return y
#函数2
# def fitness(self, x):
# sun=0
# for i in range(0,len(x)):
# if i<len(x)-1:
# sun+=100*(x[i+1]-x[i]**2)**2+(x[i]-1)**2
# return sun
#函数3
# def fitness(self,x):
# sun=0
# for i in range(0,len(x)):
# sun+=(x[i]**2-10*np.cos(2*np.pi*x[i])+10)
# sun=sun+10*len(x)
# return sun
#函数4
# def fitness(self,x):
# sun1=0
# sun2=1
# sun=0
# for i in range(0,len(x)):
# sun1+=x[i]**2
# sun2*=np.cos(x[i]/np.sqrt(i))
# sun=(1/400)*sun1-sun2+1
# return sun
def __init__(self, parameters):
"""
Ant Colony Optimization
parameter: a list type, like [NGEN, pop_size, var_num_min, var_num_max]
"""
# 初始化
self.NGEN = parameters[0] # 迭代的代数
self.pop_size = parameters[1] # 种群大小
self.var_num = len(parameters[2]) # 变量个数
self.bound = [] # 变量的约束范围
self.bound.append(parameters[2])
self.bound.append(parameters[3])
self.pop_x = np.zeros((self.pop_size, self.var_num)) # 所有蚂蚁的位置
self.g_best = np.zeros((1, self.var_num)) # 全局蚂蚁最优的位置
# 初始化第0代初始全局最优解
temp = 100000000000000000
for i in range(self.pop_size):
for j in range(self.var_num):
self.pop_x[i][j] = np.random.uniform(self.bound[0][j], self.bound[1][j])
fit = self.fitness(self.pop_x[i])
print(fit)
if fit < temp:
self.g_best = self.pop_x[i]
temp = fit
def update_operator(self, gen, t, t_max):
"""
更新算子:根据概率更新下一时刻的位置
"""
rou = 0.8 # 信息素挥发系数
Q = 1 # 信息释放总量
lamda = 1 / gen
pi = np.zeros(self.pop_size)
for i in range(self.pop_size):
for j in range(self.var_num):
pi[i] = (t_max - t[i]) / t_max
# 更新位置
if pi[i] < np.random.uniform(0, 1):
self.pop_x[i][j] = self.pop_x[i][j] + np.random.uniform(-1, 1) * lamda
else:
self.pop_x[i][j] = self.pop_x[i][j] + np.random.uniform(-1, 1) * (
self.bound[1][j] - self.bound[0][j]) / 2
# 越界保护
if self.pop_x[i][j] < self.bound[0][j]:
self.pop_x[i][j] = self.bound[0][j]
if self.pop_x[i][j] > self.bound[1][j]:
self.pop_x[i][j] = self.bound[1][j]
# 更新t值
t[i] = (1 - rou) * t[i] + Q * self.fitness(self.pop_x[i])
# 更新全局最优值
if self.fitness(self.pop_x[i]) < self.fitness(self.g_best):
self.g_best = self.pop_x[i]
t_max = np.min(t)
return t_max, t
def main(self):
popobj = []
best = np.zeros((1, self.var_num))[0]
for gen in range(1, self.NGEN + 1):
if gen == 1:
tmax, t = self.update_operator(gen, np.array(list(map(self.fitness, self.pop_x))),
np.min(np.array(list(map(self.fitness, self.pop_x)))))
else:
tmax, t = self.update_operator(gen, t, tmax)
popobj.append(self.fitness(self.g_best))
# print('############ Generation {} ############'.format(str(gen)))
# print(self.g_best)
# print(self.fitness(self.g_best))
if self.fitness(self.g_best) > self.fitness(best):
best = self.g_best.copy()
print('最好的位置:{}'.format(best))
print('最大的函数值:{}'.format(self.fitness(best)))
print("---- End of (successful) Searching ----")
plt.figure()
plt.title("Figure1")
plt.xlabel("iterators", size=14)
plt.ylabel("fitness", size=14)
t = [t for t in range(1, self.NGEN + 1)]
plt.plot(t, popobj, color='b', linewidth=2)
plt.show()
if __name__ == '__main__':
NGEN = 200
popsize = 100
low=[]
up=[]
demision=6
for i in range(demision):
low.append(1)
up.append(40)
parameters = [NGEN, popsize, low, up]
aco = ACO(parameters)
aco.main() |
|