我正在尝试使用 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]
我正在评估类中创建对象,因为我正在缓存该类中的变量并希望它为每次迭代重置,因此我每次迭代都创建一个新对象。然后我初始化问题并尝试用最小化来解决它:
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:\Users\AppData\Local\Programs\Python\Python39\lib\site-packages\pymoo\optimize.py", line 85, in minimize
res = algorithm.solve()
File "C:\Users\AppData\Local\Programs\Python\Python39\lib\site-packages\pymoo\model\algorithm.py", line 227, in solve
self._solve(self.problem)
File "C:\Users\AppData\Local\Programs\Python\Python39\lib\site-packages\pymoo\model\algorithm.py", line 322, in _solve
self.next()
File "C:\Users\AppData\Local\Programs\Python\Python39\lib\site-packages\pymoo\model\algorithm.py", line 244, in next
self.initialize()
File "C:\Users\AppData\Local\Programs\Python\Python39\lib\site-packages\pymoo\model\algorithm.py", line 216, in initialize
self._initialize()
File "C:\Users\AppData\Local\Programs\Python\Python39\lib\site-packages\pymoo\algorithms\genetic_algorithm.py", line 85, in _initialize
pop = self.survival.do(self.problem, pop, len(pop), algorithm=self,
File "C:\Users\AppData\Local\Programs\Python\Python39\lib\site-packages\pymoo\model\survival.py", line 91, in do
feas, infeas = split_by_feasibility(pop, sort_infeasbible_by_cv=True)
File "C:\Users\AppData\Local\Programs\Python\Python39\lib\site-packages\pymoo\model\survival.py", line 138, in split_by_feasibility
b = (CV <= 0)
TypeError: '<=' not supported between instances of 'NoneType' and 'int'
我想知道“CV”是什么?我在程序中找不到它的引用,所以我很困惑它从哪里获取“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)
关于python - pymoo的survival.py模块中出现类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67056666/