首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pymoo的survival.py模块中的TypeError

pymoo的survival.py模块中的TypeError
EN

Stack Overflow用户
提问于 2021-04-12 18:19:10
回答 1查看 143关注 0票数 2

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

代码语言:javascript
复制
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来解决它:

代码语言:javascript
复制
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)

但是这个错误出现了:

代码语言:javascript
复制
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‘的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-12 21:24:29

CV代表违反约束,它派生自在求值过程中设置为G的约束。您的问题是否将n_constr设置为一个大于1的数字,但您实际上并未设置任何约束?

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

(您需要为out["F"]设置多个目标才能解决多目标问题)

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67056666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档