python - pymoo的survival.py模块中出现类型错误

标签 python optimization

我正在尝试使用 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/

相关文章:

python - 从 AWS SES 中的 content-type=application/zip 和 base64 编码解析文本文件

python - 如何将 None 插入列表?

python : Any use of this assignment to an empty list?

python - 是什么让 pylint 认为我的类(class)是抽象的?

algorithm - bool 可满足性的流水车间[多项式时间缩减]

python - Dash/Plotly - long_callback 在 celery/redis 后端失败

ruby - 优化此 ruby​​ 代码

php - 检查 PHP 数组是否为空的最佳方法

c - 海湾合作委员会优化?

java - 如何在 AppCompatActivity.onCreate() 中膨胀 fragment 的布局?