如何在DEAP的mutation突变函数中限定基因的指定可选取值范围
解决方案
针对DEAP库mutUniformInt无法支持非连续整数取值的问题,有两种常用实现方案:
方案1:自定义适配离散取值的突变函数
该方式对原有逻辑侵入性最低,单独处理第一个基因的特殊取值规则,其余基因沿用原有均匀整数突变逻辑,且符合DEAP工具函数的返回规范,可直接注册到toolbox使用。
代码实现
import random from deap import tools def custom_mut(ind, indpb, low, up): # 单独处理第一个Mat基因:仅在0、2两个合法值中随机突变 if random.random() < indpb: ind[0] = random.choice([0, 2]) # 剩余3个基因沿用原有均匀整数突变规则 for i in range(1, len(ind)): if random.random() < indpb: ind[i] = random.randint(low[i], up[i]) return (ind,)
调用方式
# 参数配置和原有逻辑完全一致 low = [0, 0, Span_min, Span_min] up = [2, 7, Span_max, Span_max] # 直接调用自定义突变函数 custom_mut(ind=ind, indpb=0.05, low=low, up=up) # 如果需要注册到toolbox使用,写法如下: # toolbox.register("mutate", custom_mut, indpb=0.05, low=low, up=up)
方案2:取值映射适配原有突变函数
如果不想自定义新的突变函数,可通过取值映射的方式绕开无效值1:将第一个基因的突变范围设置为0~1,突变完成后再将值映射为合法的0/2。
代码实现
# 突变时将第一个基因的上下限设为0、1,避免生成无效值1 tools.mutUniformInt(low=[0, 0, Span_min, Span_min], up=[1, 7, Span_max, Span_max], indpb=0.05, individual=ind) # 突变完成后做值映射:0→0,1→2 ind[0] = 0 if ind[0] == 0 else 2
方案选择建议
- 如果后续Mat基因的合法取值可能调整,优先选方案1,扩展性更强
- 如果只是临时解决当前问题,方案2代码改动量更小
内容的提问来源于stack exchange,提问作者user17497858
相关产品推荐
相关产品推荐

