我正在尝试使用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类中创建我的对象,因为我在该类中缓存变量,并希望每次迭代都重置该对象,因此我在每次迭代中创建一个新对象。然后我初始化问题,并尝试使用minimize来解决它:
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'我想知道“简历”是什么?我在程序中找不到它的引用,所以我搞不清它是从哪里得到'NoneType‘的。
发布于 2021-04-12 21:24:29
CV代表违反约束,它派生自在求值过程中设置为G的约束。您的问题是否将n_constr设置为一个大于1的数字,但您实际上并未设置任何约束?
@EDIT:我刚刚看到你更新了你的问题。不确定你想要做什么。请参考下面的模板进行优化。
(您需要为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)https://stackoverflow.com/questions/67056666
复制相似问题