使用Platypus NSGA-II时最优决策变量打印异常问题求助
解决Platypus NSGA-II中决策变量返回布尔数组而非整数的问题
问题原因
Platypus库中Integer类型的决策变量默认采用二进制编码存储,直接访问solution.variables时,返回的是该整数对应的二进制编码布尔数组,而非原始的整数值。这就是你看到[[False, True, False, True, False]]这类输出的原因。
解决方案
需要通过Platypus提供的解码方法,将布尔数组转换为对应的整数。有两种可靠的方式:
使用问题实例的
decode方法
调用定义好的problem对象的decode方法,传入变量的布尔数组,即可得到解码后的整数值。直接访问
solution.decision_variables属性
Platypus的Solution对象内置了decision_variables属性,该属性存储的是已经解码后的原始决策变量值,可直接读取。
修改后的代码示例
将原代码中打印决策变量的行替换为以下任意一种即可:
方式1:使用decode方法
st.write(f"Decision variables: {problem.decode(best.variables)}")
方式2:使用decision_variables属性
st.write(f"Decision variables: {best.decision_variables}")
修改后的完整关键代码片段:
if filtered: # Find solution with lowest objective1 best = min(filtered, key=lambda s: s.objectives[0]) st.subheader("Best solution with f2 < 1") # 方式1:用decode解码 st.write(f"Decision variables: {problem.decode(best.variables)}") # 或者方式2:直接访问decision_variables # st.write(f"Decision variables: {best.decision_variables}") st.write(f"Objectives: f1={best.objectives[0]:.4f}, f2={best.objectives[1]:.4f}") # 后续绘图代码不变...
补充说明
- 如果需要批量处理所有解决方案的决策变量,同样可以应用上述解码逻辑,例如:
decoded_vars = [problem.decode(s.variables) for s in solutions] # 或者 decoded_vars = [s.decision_variables for s in solutions] - 两种方式在功能上等价,可根据个人习惯选择。
decision_variables属性更简洁,而decode方法适合需要手动控制编码/解码流程的场景。
内容的提问来源于stack exchange,提问作者Butch Strasheim
相关产品推荐
相关产品推荐

