一个 Python 遗传算法求解的例子

1 问题提出

        假设我们的要解决的问题为求解二次函数 f(x,y)=x^2+y^2 的最小值点 (x^*,y^*) . 这是一个简单的二次函数,容易知道最值点为 (0,0) .

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) 定义适应度类型和个体类型. 考虑到要求解的是最小化 f(x,y) 问题,所以适应度选负值,同时由于最优解 (x^*, y^*) 的维度,所以定义个体为一个二元的浮点数.:

# 定义适应度类型,对于最小化问题,我们使用负值  
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

        · 在复现本文的代码时,如果遇到问题,欢迎私信或评论区联系作者.

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值