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

使用Pymoo进行多目标优化时遇do()参数缺失错误求助

问题分析与代码修正

核心错误点

  • 采样算子用错:你把选择算子RandomSelection()当成了采样算子,初始化种群的采样应该用RandomSampling()。
  • TournamentSelection配置关联错误:NSGA2要求选择算子能处理n_select和n_parents参数,错误的采样算子配置触发了这个参数缺失报错。
  • Problem类的_evaluate方法参数错误:方法的第一个参数必须是优化变量x,不是你定义的两个目标函数,同时方法缩进错误,没有归到MyProblem类的作用域下。
  • 函数调用与缩进问题:目标函数调用时要确保能处理数组输入,类方法的缩进必须严格符合Python类的语法要求。

修正后的完整代码

import numpy as np
from pymoo.core.problem import Problem
from pymoo.algorithms.moo.nsga2 import NSGA2
from pymoo.operators.sampling.rnd import RandomSampling
from pymoo.operators.selection.tournament import TournamentSelection
from pymoo.operators.crossover.sbx import SBX
from pymoo.operators.mutation.pm import PolynomialMutation
from pymoo.core.mixed import binary_tournament
from pymoo.optimize import minimize

# 替换为你的实际目标函数实现
def risk_cost_alpha(x): 
    return x ** 2

def cost_risk_alpha(x):
    return (x - 5) ** 2

class MyProblem(Problem):
    def __init__(self):
        super().__init__(
            n_var=1, 
            n_obj=2,
            xl=np.array([0]),
            xu=np.array([10])
        )
    
    def _evaluate(self, x, out, *args, **kwargs): 
        # x是形状为(n_samples, n_var)的数组,确保函数支持向量输入
        f1 = risk_cost_alpha(x)
        f2 = cost_risk_alpha(x)
        out["F"] = np.column_stack([f1, f2])

# 修正算法配置:使用正确的采样算子,移除冗余输出配置
algorithm = NSGA2(
    pop_size=40,
    sampling=RandomSampling(),
    selection=TournamentSelection(func_comp=binary_tournament),
    crossover=SBX(prob=0.9, eta=15),
    mutation=PolynomialMutation(eta=20),
    eliminate_duplicates=True
)

problem = MyProblem()
res = minimize(problem, algorithm, ("n_gen", 100), seed=1, verbose=True)

# 可选:打印帕累托前沿结果
print("帕累托前沿目标值:")
print(res.F)

关键修正说明

  1. 采样算子替换:RandomSelection()是用于种群迭代选择的算子,初始化种群必须用RandomSampling(),这是触发参数缺失报错的核心原因。
  2. _evaluate方法修正:将方法第一个参数改为x(Pymoo问题类要求的输入变量矩阵),同时修正缩进使其属于MyProblem类。
  3. 函数输入适配:确保目标函数能处理数组输入,如果你的原始函数只支持单个数值,可以用np.vectorize包装或循环处理每个样本。
  4. 移除冗余配置:MultiObjectiveOutput()是NSGA2的默认输出格式,无需显式指定,直接移除即可。

内容的提问来源于stack exchange,提问作者celi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 18:23:24