Pymoo报错:数值数量与种群规模不匹配的多目标优化问题排查
报错原因
- 核心问题是
_evaluate方法输入的x是二维NumPy数组,形状为(种群个体数, 7),对应整个种群的所有个体变量。你当前代码用Python内置的sum()对x直接计算,默认是对整个数组所有元素求和,不会按行(按个体)计算,导致计算得到的f1、f2、g1都是单个标量,而不是和种群个体数等长的数组,最终F、G的长度和种群大小不匹配触发报错。 - 另外存在一个隐性逻辑错误:你的公式里
d_p = d/g*100,但代码里写反了g和d的顺序,会导致目标函数计算结果不符合预期。
修复方案
所有求和操作替换为NumPy的按行求和方法np.sum(xxx, axis=1),保证每个个体单独计算,同时修正公式顺序、调整约束输出的维度匹配Pymoo要求,修复后代码如下:
import numpy as np # 类初始化部分无需修改,也可简化写法 super().__init__(n_var=7, n_obj=2, n_constr=1, xl=np.zeros(7), xu=np.full(7, 15)) def _evaluate(self, x, out, *args, **kwargs): # 系数转为numpy数组保证广播计算正常 c = np.array([1, 2, 3, 4, 5, 6, 7]) g_cons = np.array([1, 2, 3, 4, 5, 6, 7]) d_cons = np.array([1, 2, 3, 4, 5, 6, 7]) # axis=1指定按行求和,每个个体单独计算对应值 g = np.sum(x * g_cons, axis=1) d = np.sum(x * d_cons, axis=1) d_p = d / g * 100 e = -0.0038 * np.power(d_p, 2) + 0.3501 * d_p - 0.811 f1 = (g * (e / 100) * 365) / 55.65 f2 = np.sum(x * c, axis=1) # 约束转换为符合pymoo要求的小于等于0的形式,调整维度匹配n_constr=1 g1 = np.sum(x, axis=1) - 40 out["F"] = np.column_stack([f1, f2]) out["G"] = g1.reshape(-1, 1)
内容的提问来源于stack exchange,提问作者drisyagv
相关产品推荐
相关产品推荐

