如何在DEAP实现的遗传算法进化过程中动态调整边界值?
动态调整DEAP遗传算法边界的解决方案
核心问题分析
原checkBounds装饰器的问题在于,它会固定捕获初始化时传入的min和max值,后续即使修改全局的MIN/MAX变量,闭包内的数值也不会同步更新;重复调用toolbox.decorate还会叠加装饰器,导致逻辑冗余。
解决方案:用可变对象存储边界值
把边界值放到可变容器(比如字典)中,让闭包能实时读取最新的边界数值,无需重新执行装饰操作。
修改后的边界检查装饰器
def checkBounds(bounds): def decorator(func): def wrapper(*args, **kwargs): offspring = func(*args, **kwargs) min_val = bounds['min'] max_val = bounds['max'] for child in offspring: for i in range(len(child)): if child[i] > max_val: child[i] = max_val elif child[i] < min_val: child[i] = min_val return offspring return wrapper return decorator
初始化与使用步骤
- 用字典存储动态边界并完成装饰:
# 初始化动态边界 dynamic_bounds = {'min': MIN, 'max': MAX} # 注册遗传操作并装饰 toolbox.register("mate", tools.cxBlend, alpha=0.2) toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=2) toolbox.decorate("mate", checkBounds(dynamic_bounds)) toolbox.decorate("mutate", checkBounds(dynamic_bounds))
- 进化过程中动态调整边界:
在每代进化结束后,直接修改字典内的数值即可,无需重新装饰:
# 示例:种群频繁触碰上边界时,按比例扩大上边界 if too_many_upper_bound_hits: dynamic_bounds['max'] *= 1.1 # 示例:种群频繁触碰下边界时,按比例缩小下边界 if too_many_lower_bound_hits: dynamic_bounds['min'] *= 0.9
关键原理
可变对象(如字典)在闭包中是按引用捕获的,修改字典内的数值时,装饰器的wrapper函数每次执行都会读取最新的边界值,完美实现动态调整的需求。
内容的提问来源于stack exchange,提问作者Arijit
相关产品推荐
相关产品推荐

