Python遗传算法求解函数最优解及可视化
import matplotlib.pyplot as plt
import math
from calobjValue import calobjValue
from calfitValue import calfitValue
from selection import selection
from crossover import crossover
from mutation import mutation
from best import best
from geneEncoding import geneEncoding
print 'y = 10 * math.sin(5 * x) + 7 * math.cos(4 * x)'
# 计算2进制序列代表的数值
def b2d(b, max_value, chrom_length):
t = 0
for j in range(len(b)):
t += b[j] * (math.pow(2, j))
t = t * max_value / (math.pow(2, chrom_length) - 1)
return t
# 设置遗传算法参数
pop_size = 500 # 种群数量
max_value = 10 # 基因中允许出现的最大值
chrom_length = 10 # 染色体长度
pc = 0.6 # 交配概率
pm = 0.01 # 变异概率
# 初始化种群
results = [[]] # 存储每一代的最优解,N个二元组
fit_value = [] # 个体适应度
fit_mean = [] # 平均适应度
pop = geneEncoding(pop_size, chrom_length)
# 遗传算法迭代
for i in range(pop_size):
# 计算个体目标函数值和适应度值
obj_value = calobjValue(pop, chrom_length, max_value)
fit_value = calfitValue(obj_value)
# 找出种群中的最优个体
best_individual, best_fit = best(pop, fit_value)
results.append([best_fit, b2d(best_individual, max_value, chrom_length)])
# 进行选择、交叉和变异操作
selection(pop, fit_value)
crossover(pop, pc)
mutation(pop, pm)
# 结果处理和可视化
results = results[1:]
results.sort()
print(results[-1])
print(best_individual)
print(best_fit)
print(obj_value[1])
print results
print 'y = %f, x = %f' % (results[-1][0], results[-1][1])
X = []
Y = []
for i in range(500):
X.append(i)
t = results[i][0]
Y.append(t)
plt.plot(X, Y)
plt.show()
代码说明:
- 导入库:
matplotlib.pyplot用于绘制图形。math用于数学运算。
- 自定义函数:
calobjValue: 计算个体的目标函数值。calfitValue: 计算个体的适应度值。selection: 选择个体进行繁殖。crossover: 进行交叉操作。mutation: 进行变异操作。best: 找出种群中的最优个体。geneEncoding: 进行基因编码。
- 参数设置:
pop_size: 种群数量。max_value: 基因中允许出现的最大值。chrom_length: 染色体长度。pc: 交配概率。pm: 变异概率。
- 初始化:
results: 存储每一代的最优解。fit_value: 存储个体适应度值。fit_mean: 存储平均适应度值。pop: 使用geneEncoding函数生成初始种群。
- 迭代过程:
- 使用循环迭代
pop_size次,每次迭代代表一代。 - 在每一代中,计算每个个体的目标函数值和适应度值。
- 使用
best函数找到最优个体,并将其信息存储到results列表中。 - 使用
selection,crossover,mutation函数进行选择、交叉和变异操作,生成新一代种群。
- 使用循环迭代
- 结果处理:
- 删除第一代的结果。
- 对
results列表进行排序,以便找到最优解。 - 打印最优解的信息。
- 可视化:
- 创建两个列表
X和Y,分别存储每一代的编号和最优适应度值。 - 使用
matplotlib.pyplot库绘制折线图,展示每一代最优解的变化趋势。
- 创建两个列表
注意:
- 代码中使用了一些自定义函数,需要根据实际情况进行定义。
- 可以根据需要修改参数设置,以获得更好的优化效果。
原文地址: https://www.cveoy.top/t/topic/fN8v 著作权归作者所有。请勿转载和采集!