import matplotlib.pyplot as plt
import numpy as np
import random
def generate(m, n): # 出生m个长为n的基因
return [[random.randint(0, 1) for j in range(n)] for i in range(m)]
def decode(X, max_value, n): # 解码基因长度为n的个体X
return eval('0b'+''.join([str(x) for x in X])) / (2**n - 1) * max_value
def decodeAll(A, n): # 解码基因长度为n的种群A
return [eval('0b'+''.join([str(x) for x in X])) for X in A]
def decode_Y(A, max_value, n): # 解码基因长度为n的种群A并转换为因变量
return [f(decode(X, max_value, n)) for X in A]
def filt(obj_value): # 淘汰(去除负值)
fit_value = []
c_min = 0
for i in range(len(obj_value)):
if(obj_value[i] + c_min > 0):
temp = c_min + obj_value[i]
else:
temp = 0.0
fit_value.append(temp)
return fit_value
def select(fit_value): # 选择
total = 0
for i in range(len(fit_value)):
total += fit_value[i]
return total
def selection(pop, fit_value):
total_fit = select(fit_value) if select(fit_value) else 1
newfit_value = [i / total_fit for i in fit_value] # 适应度总和
# 计算累计概率
for i in range(len(newfit_value)-2, -1, -1):
t = 0
j = 0
while(j <= i):
t += newfit_value[j]
j += 1
newfit_value[i] = t
newfit_value[population-1] = 1
ms = [random.random() for i in range(population)]
ms.sort()
fitin = 0
newin = 0
newpop = pop
# 转轮盘选择法
while newin < population:
if(ms[newin] < newfit_value[fitin]):
newpop[newin] = pop[fitin]
newin += 1
else:
fitin += 1
pop = newpop
def crossover(pop, pc): # 交叉互换
for i in range(population-1):
if(random.random() < pc):
k = random.randint(0, N)
pop[i], pop[i+1] = pop[i][:k] + pop[i+1][k:N], pop[i+1][:k] + pop[i][k:N]
def mutation(A, pm): # 基因突变
for i in range(population):
if(random.random() < pm):
k = random.randint(0, N-1)
A[i][k] = 1 - A[i][k]
def f(x): # 目标函数
try:
return (np.exp(np.sin(x)))
except:
return 0
iter = 1000 # 迭代次数
population = 100 # 种群数量
MAX = 10 # 自变量的最大值
N = 10 # 染色体长度
pc = 0.6 # 互换概率
pm = 0.02 # 变异概率
X, Y = [], [] # 存储每一代的最优解,N个二元组
fit_value = [] # 个体适应度
fit_mean = [] # 平均适应度
# pop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(pop_size)]
A = generate(population, N)
for i in range(iter):
if i%100 == 0:
print(i)
obj_value = decode_Y(A, N, MAX) # 个体评价
fit_value = filt(obj_value) # 淘汰
best = fit_value.index(max(fit_value))
best_individual, best_fit = A[best], fit_value[best] # 第一个存储最优的解, 第二个存储最优基因
X.append(decode(best_individual, MAX, N))
Y.append(best_fit)
selection(A, fit_value) # 新种群复制
crossover(A, pc) # 交叉互换
mutation(A, pm) # 变异
XY = [(X[i],Y[i]) for i in range(iter)]
XY = sorted(XY, key = lambda x: x[1])
plt.plot(range(iter), XY)
plt.show()
【B++】Python遗传算法代码
于 2023-05-09 10:42:47 首次发布