1 问题提出
假设我们的要解决的问题为求解二次函数 的最小值点 . 这是一个简单的二次函数,容易知道最值点为 .
2.代码实现
2.1 依赖库
本例子使用 deap 库实现,首先查看是否已安装 deap 库,在终端输入:
pip show deap
如果提示 WARNING: Package(s) not found: deap,则输入如下命令安装:
pip install deap
2.2 主函数代码
(1) 导入 random 和 deap 库:
import random
from deap import base, creator, tools, algorithms
(2) 定义适应度类型和个体类型. 考虑到要求解的是最小化 问题,所以适应度选负值,同时由于最优解 的维度,所以定义个体为一个二元的浮点数.:
# 定义适应度类型,对于最小化问题,我们使用负值
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
# 定义个体类型,这里是一个包含两个浮点数的列表
creator.create("Individual", list, fitness=creator.FitnessMin)
(3) 初始化工具箱:
# 工具箱初始化
toolbox = base.Toolbox()
# 属性生成器,这里生成浮点数,范围在-10到10之间
toolbox.register("attr_float", random.random)
# 结构初始化器,生成包含两个浮点数的个体
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=2)
# 种群初始化器,生成包含指定数量个体的种群
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
# 注册评价函数,这里简单地返回输入的平方和(负值用于最小化)
def evalOneMax(individual):
return sum(x**2 for x in individual),
# 注册评价函数到工具箱
toolbox.register("evaluate", evalOneMax)
# 注册交叉和变异操作
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1)
# 注册选择操作
toolbox.register("select", tools.selTournament, tournsize=3)
(4) 设定算法的参数,运行遗传算法并打印结果:
# 设定算法参数
NGEN = 40 # 迭代次数
CXPB = 0.5 # 交叉概率
MUTPB = 0.2 # 变异概率
POP_SIZE = 30 # 种群大小
# 初始化种群
pop = toolbox.population(n=POP_SIZE)
# 评估初始种群
fitnesses = list(map(toolbox.evaluate, pop))
for ind, fit in zip(pop, fitnesses):
ind.fitness.values = fit
# 运行遗传算法
pop, logbook = algorithms.eaSimple(pop, toolbox, cxpb=CXPB, mutpb=MUTPB, ngen=NGEN, stats=None, halloffame=None, verbose=True)
# 输出最佳个体和适应度
best_ind = tools.selBest(pop, 1)[0]
print("Best individual:", best_ind)
print("Best fitness:", best_ind.fitness.values[0])
3 运行结果
若上述代码正确运行,输出的值可能有所不同,但格式应如下所示:
...
31 12
32 21
33 21
34 16
35 20
36 17
37 25
38 19
39 15
40 17
Best individual: [0.027035817348004976, 0.004219116014945401]
Best fitness: 0.0007487363596222555
4 注
· 本例子的预设参数并非最优,适当调节参数可以获得更好的效果.
· 若缺少 random 库,也可如安装 deap 的方法安装:
pip install random
· 在复现本文的代码时,如果遇到问题,欢迎私信或评论区联系作者.