提问人:celi 提问时间:5/24/2023 更新时间:8/7/2023 访问量:95
do() 缺少 2 个必需的位置参数:“n_select”和“n_parents”在 Pymoo 优化期间
do() missing 2 required positional arguments: 'n_select' and 'n_parents' during Pymoo optimization
问:
我正在尝试使用 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 的方式存在一些问题,但我不确定我应该更改哪一部分才能使此代码正常工作。
答:
我遇到了像你这样的类似问题,我认为你需要用采样运算符来改变RandomSelection()
LHS()
from pymoo.operators.sampling.lhs import LHS
在这里,采样更改按建议工作。
评论