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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:24:04