do() 缺少 2 个必需的位置参数:“n_select”和“n_parents”在 Pymoo 优化期间

do() missing 2 required positional arguments: 'n_select' and 'n_parents' during Pymoo optimization

提问人:celi 提问时间:5/24/2023 更新时间:8/7/2023 访问量:95

问:

我正在尝试使用 pymoo 库找到多目标优化问题的答案。目的是在risk_cost函数中找到具有优势条件的帕累托前沿集合。还有cost_alpha,risk_alpha函数,所以为了统一变量,我刚才做了两个复合函数。这是我尝试过的代码:

`def risk_cost_alpha(x): 
return (somefunction(x))

def cost_risk_alpha(x):
    return (someotherfunction(x))

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, risk_cost_alpha,cost_risk_alpha, out, *args, **kwargs): 
    f1 = risk_cost_alpha(x)
    f2 = cost_risk_alpha(x)
    out["F"] = np.column_stack([f1,f2])

algorithm = NSGA2(
             pop_size= 40,
                 sampling = RandomSelection(),
                 selection = TournamentSelection(func_comp=binary_tournament),
             crossover = SBX(prob = 0.9, eta = 15),
             mutation = PolynomialMutation(eta = 20),
                 output = MultiObjectiveOutput(),
                 eliminate_duplicates=True
                 )
problem = MyProblem()
res = minimize(problem, algorithm, ("n_gen", 100),seed = 1, verbose = True)`

我从这个链接中遵循了基本相同的代码来设置算法和分辨率:https://pymoo.org/algorithms/moo/nsga2.html#nb-nsga2,只是为了以不同的方式定义问题。

这是我得到的错误:(只是修改了文件路径的一些名称)

res = minimize(problem, algorithm, (“n_gen”, 100),seed = 1, verbose = True) 回溯(最近一次调用最后一次): 文件 “”,第 1 行,在 文件“C:\Users\Miniconda3\lib\site-packages\pymoo\optimize.py”,第 67 行,最小化 res = 算法.run() 文件“C:\Users\Miniconda3\lib\site-packages\pymoo\core\algorithm.py”,第 141 行,正在运行 self.next() 文件“C:\Users\Miniconda3\lib\site-packages\pymoo\core\algorithm.py”,第 157 行,在下一个 填充 = self.infill() 文件“C:\Users\Miniconda3\lib\site-packages\pymoo\core\algorithm.py”,第 189 行,填充 填充 = self._initialize_infill() 文件“C:\Users\Miniconda3\lib\site-packages\pymoo\algorithms\base\genetic.py”,第 75 行,_initialize_infill pop = self.initialization.do(self.problem, self.pop_size, algorithm=self) 文件“C:\Users\Miniconda3\lib\site-packages\pymoo\core\initialization.py”,第 32 行,在 do pop = self.sampling(问题,n_samples,**kwargs) 文件“C:\Users\Miniconda3\lib\site-packages\pymoo\core\operator.py”,第 27 行,在 call out = self.do(problem, elem, *args, **kwargs) TypeError:do() 缺少 2 个必需的位置参数:“n_select”和“n_parents”

我试图点击错误链接,看看确实来自哪里,它首先发生在:do()

`def _initialize_infill(self):
    pop = self.initialization.do(self.problem, self.pop_size, algorithm=self)
    return pop`

然后

`def __call__(self, problem, elem, *args, to_numpy=False, **kwargs):
    out = self.do(problem, elem, *args, **kwargs)

    if self.vtype is not None:
        for ind in out:
            ind.X = ind.X.astype(self.vtype)

    # allow to have a built-in repair (can be useful to customize standard crossover)
    if self.repair is not None:
        self.repair.do(problem, out)

    if to_numpy:
        out = np.array([ind.X for ind in out])

    return out`

因此,根据此代码,我认为如果我添加变量 n_select,并在我定义 Problem 的类中n_parents,那就没问题了,但它仍然会出现相同的错误。 我很确定我定义类 Issue 的方式存在一些问题,但我不确定我应该更改哪一部分才能使此代码正常工作。

优化 Pymoo 帕累托最优

评论


答:

0赞 M_Heddar 6/24/2023 #1

我遇到了像你这样的类似问题,我认为你需要用采样运算符来改变RandomSelection()LHS()

from pymoo.operators.sampling.lhs import LHS
0赞 Bernard da Silva 8/7/2023 #2

在这里,采样更改按建议工作。