使用类 problem
#

问题
类代表一个通用的优化问题。用户在单独的类(用户定义的问题,或 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类型作为参数传递时,这种提取才会起作用。