pymoo的survival.py模块中存在TypeError



我正在尝试使用pymoo优化我的一个对象的变量。问题的设置是:

from pymoo.algorithms.nsga2 import NSGA2
from pymoo.factory import get_sampling, get_crossover, get_mutation, get_termination
from pymoo.model.problem import Problem
from pymoo.visualization.scatter import Scatter

def print_res(res):
print(res.X)
print(res.F)
# Objective Space
plot = Scatter(title="Objective Space")
plot.add(res.F, color="red")
plot.show()

class MyProblem(Problem):
def __init__(self, calculatorobj, obj1, obj2, obj3, var_no=1, obj_no=1):
super().__init__(n_var=var_no,
n_obj=obj_no,
n_constr=0,
xl=[0.1, 0.1],
xu=[5, 15],
elementwise_evaluation=True)
self.calculatorobj = calculatorobj
self.obj1 = obj1
self.obj2 = obj2
self.obj3 = obj3
self.algorithm = NSGA2(
pop_size=2,
n_offsprings=5,
sampling=get_sampling("real_random"),
crossover=get_crossover("real_sbx", prob=0.9, eta=15),
mutation=get_mutation("real_pm", eta=20),
eliminate_duplicates=True
)
self.termination = get_termination("n_gen", 10)
def _evaluate(self, x, out, *args, **kwargs):
calculator = calculatorobj(obj1, obj2, obj3)
calculator.var1 = x[0] 
calculator.var2 = x[1]
f1 = - calculator.var3
out["F"] = [f1]

我在evaluate类中创建对象,因为我在该类中缓存变量,并希望每次迭代都重置它,所以每次迭代都创建一个新对象。然后我初始化问题,并尝试使用最小化:来解决它

problem = optimize.MyProblem(calculatorobj=calculatorobj, var_no=2, obj_no=1, obj1=obj1,
obj2=obj2, obj3=obj3)
res = minimize(problem, problem.algorithm, problem.termination, seed=1, save_history=True, verbose=True)
optimize.print_res(res)

但是这个错误出现了:

File "C:UsersAppDataLocalProgramsPythonPython39libsite-packagespymoooptimize.py", line 85, in minimize
res = algorithm.solve()
File "C:UsersAppDataLocalProgramsPythonPython39libsite-packagespymoomodelalgorithm.py", line 227, in solve
self._solve(self.problem)
File "C:UsersAppDataLocalProgramsPythonPython39libsite-packagespymoomodelalgorithm.py", line 322, in _solve
self.next()
File "C:UsersAppDataLocalProgramsPythonPython39libsite-packagespymoomodelalgorithm.py", line 244, in next
self.initialize()
File "C:UsersAppDataLocalProgramsPythonPython39libsite-packagespymoomodelalgorithm.py", line 216, in initialize
self._initialize()
File "C:UsersAppDataLocalProgramsPythonPython39libsite-packagespymooalgorithmsgenetic_algorithm.py", line 85, in _initialize
pop = self.survival.do(self.problem, pop, len(pop), algorithm=self,
File "C:UsersAppDataLocalProgramsPythonPython39libsite-packagespymoomodelsurvival.py", line 91, in do
feas, infeas = split_by_feasibility(pop, sort_infeasbible_by_cv=True)
File "C:UsersAppDataLocalProgramsPythonPython39libsite-packagespymoomodelsurvival.py", line 138, in split_by_feasibility
b = (CV <= 0)
TypeError: '<=' not supported between instances of 'NoneType' and 'int'

我想知道"简历"是什么?我在程序中找不到它的引用,所以我很困惑它是从哪里得到"NoneType"的。

CV表示违反约束,是从评估期间设置为G的约束派生而来。您的问题是否将n_constr设置为大于1的数字,但实际上您没有设置任何约束?

@编辑:我刚刚看到你更新了你的问题。不确定您要做什么。请参阅下面的模板进行优化。

(要解决多目标问题,需要为out["F"]设置多个目标(

from pymoo.algorithms.nsga2 import NSGA2
from pymoo.factory import get_sampling, get_crossover, get_mutation, get_termination
from pymoo.model.problem import Problem
from pymoo.visualization.scatter import Scatter
from pymoo.optimize import minimize

class MyProblem(Problem):
def __init__(self):
super().__init__(n_var=2,
n_obj=1,
n_constr=0,
xl=[0.1, 0.1],
xu=[5.0, 15.0],
elementwise_evaluation=True)
def _evaluate(self, x, out, *args, **kwargs):
# add your objective calculation HERE
out["F"] = x[0] ** 2 + x[1] ** 2

problem = MyProblem()
algorithm = NSGA2(
pop_size=2,
n_offsprings=5,
sampling=get_sampling("real_random"),
crossover=get_crossover("real_sbx", prob=0.9, eta=15),
mutation=get_mutation("real_pm", eta=20),
eliminate_duplicates=True
)
termination = get_termination("n_gen", 10)

res = minimize(problem, algorithm, termination)
print(res.X)
print(res.F)

相关内容

最新更新