Pymoo 0.5.0使用NSGA-III优化生成含nan参数候选解的原因咨询
问题根本原因
你参数索引为11、12、13的三个变量的上下限设置完全相等,均为-1,导致pymoo内置的SBX交叉和PM变异算子在计算时出现除以0的情况,最终生成nan值。
- 实值SBX交叉算子的计算过程需要用到变量的上下限范围(xu_i - xl_i)作为边界修正的参数,当某个变量的上下限相等时,这一差值为0,相关计算会出现除0错误,输出nan
- 实值PM变异算子的扰动步长也和变量的上下限范围正相关,同样会因为范围为0触发除0逻辑,产生nan
- 你观察到仅这三个参数出问题,恰好和上下限配置完全对应,其他变量的上下限范围均不为0,所以不会触发该问题
快速验证方法
在初始化算法之前,加入一行代码打印三个问题变量的上下限即可确认:
print(f"param11 下限:{params_lower_lim[11]}, 上限:{params_upper_lim[11]}") print(f"param12 下限:{params_lower_lim[12]}, 上限:{params_upper_lim[12]}") print(f"param13 下限:{params_lower_lim[13]}, 上限:{params_upper_lim[13]}")
修复方案
根据你的实际需求二选一即可:
- 如果这三个参数是固定值不需要优化:直接从优化变量列表中删除,把这三个参数的固定值直接写死在评估函数的
smeep调用里即可,不用作为param的成员传入 - 如果这三个参数需要优化:修正对应的上下限配置,给这三个参数设置合理的取值范围,确保上限大于下限即可
内容的提问来源于stack exchange,提问作者Peter Allan
相关产品推荐
相关产品推荐

