You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:24:04