使用类 problem#

../_images/prob_no_text.png

问题 类代表一个通用的优化问题。用户在单独的类(用户定义的问题,或 UDP)中编写此类问题的详细信息,然后将其传递给 问题,后者提供一个统一的接口。

注意

用户定义问题(UDPs)是优化问题(由用户编码),可用于构建类型为问题的pygmo对象。

一些UDP(优化问题)已经由pygmo提供,我们称它们为pygmo UDP。

在本教程中,我们将使用一个名为rosenbrock的pygmo UDP来展示问题的基本构造,但同样的逻辑也适用于自定义UDP,即用户实际编码的UDP。

让我们开始:

>>> import pygmo as pg
>>> prob = pg.problem(pg.rosenbrock(dim = 5))
>>> print(prob) 
Problem name: Multidimensional Rosenbrock Function
    C++ class name: ...

    Global dimension:                       5
    Integer dimension:                      0
    Fitness dimension:                      1
    Number of objectives:                   1
    Equality constraints dimension:         0
    Inequality constraints dimension:       0
    Lower bounds: [-5, -5, -5, -5, -5]
    Upper bounds: [10, 10, 10, 10, 10]
    Has batch fitness evaluation:  false

    Has gradient: true
    User implemented gradient sparsity: false
    Expected gradients: 5
    Has hessians: false
    User implemented hessians sparsity: false

    Fitness evaluations: 0
    Gradient evaluations: 0

    Thread safety: constant

在上面的代码中,在简单导入pygmo包之后,我们通过从rosenbrock构造一个problem来定义一个变量prob,这是一个从其全局维度构建的多维问题。在下一行中,我们检查问题。我们可以一眼看出,UDP rosenbrock是一个五维的、单目标的、有箱约束的问题,UDP中没有提供梯度、海森矩阵或稀疏性信息。

我们还看到,它的适应度函数从未被调用过,因此适应度评估的计数器为零。

所有包含在问题打印输出中的信息都可以使用适当的方法检索,例如:

>>> prob.get_fevals() == 0
True

让我们看看健身计算如何增加计数器:

>>> prob.fitness([1,2,3,4,5])
array([14814.])
>>> prob.get_fevals() == 1
True

我们也可以取回UDP,从而通过extract()方法随时访问未在problem接口中暴露的所有方法:

>>> udp = prob.extract(pg.rosenbrock)
>>> type(udp)
<class 'pygmo.core.rosenbrock'>
>>> udp = prob.extract(pg.rastrigin)
>>> udp is None
True

只有当正确的UDP类型作为参数传递时,这种提取才会起作用。