问题列表#

用Python实现的问题#

class pygmo.decorator_problem(prob=None, **kwargs)#

装饰器元问题。

版本2.9中的新功能。

这个元问题允许通过Python装饰器对PyGMO problem 的函数应用任意变换。

装饰器在初始化时作为关键字参数传递,并且它们必须根据它们要装饰的函数命名,加上_decorator后缀。例如,我们可以为适应度函数定义一个最小的装饰器,如下所示:

>>> def f_decor(orig_fitness_function):
...     def new_fitness_function(self, dv):
...         print("Evaluating dv: {}".format(dv))
...         return orig_fitness_function(self, dv)
...     return new_fitness_function

这个装饰器将在调用原始适应度函数之前打印输入决策向量 dv。然后我们可以如下构建一个装饰后的Rosenbrock问题:

>>> from pygmo import decorator_problem, problem, rosenbrock
>>> dprob = problem(decorator_problem(rosenbrock(), fitness_decorator=f_decor))

然后我们可以验证调用dprob的适应度函数将在返回适应度值之前打印决策向量:

>>> fv = dprob.fitness([1, 2])
Evaluating dv: [1. 2.]
>>> print(fv)
[100.]

关于此类用法的扩展教程可在PyGMO的文档中找到。

UDP 的公共 API 中的所有函数都可以被装饰(完整列表请参见 pygmo.problem 的文档)。请注意,decorator_problem 的公共 API 包括 UDP 的公共 API:有一个 fitness() 方法,查询问题属性的方法,稀疏性相关的方法等。为了避免重复,我们在这里不重复 UDP API 的文档,而是仅记录 decorator_problem 特有的少数方法。用户可以参考 pygmo.problem 的文档以获取有关 UDP API 的详细信息。

在实例构造时,prob 和装饰器都会被深拷贝。通常在元问题中,这个类会存储一个包含 prob 副本的 问题 作为内部数据成员(这通常被称为元问题的 内部问题)。内部问题可以通过只读属性 inner_problem 访问。

Parameters
  • prob – 一个problem或用户定义的问题,可以是C++或Python(如果probNone,将使用null_problem代替)

  • kwargs – 要应用于输入问题函数的装饰器字典

Raises
  • TypeError – 如果 kwargs 中至少有一个值不可调用

  • 未指定 – 由problem的构造函数或probkwargs的深拷贝抛出的任何异常

get_decorator(fname)#

获取名为 fname 的函数的装饰器。

此方法将返回一个装饰器的副本,该装饰器已在构建时注册用于名为fname的函数。如果在构建期间未指定fname的装饰器,将返回None

>>> from pygmo import decorator_problem, problem, rosenbrock
>>> def f_decor(orig_fitness_function):
...     def new_fitness_function(self, dv):
...         print("Evaluating dv: {}".format(dv))
...         return orig_fitness_function(self, dv)
...     return new_fitness_function
>>> dprob = decorator_problem(rosenbrock(), fitness_decorator=f_decor)
>>> dprob.get_decorator("fitness") 
<function ...>
>>> dprob.get_decorator("gradient") is None
True
Parameters

fname (str) – 将返回其装饰器的函数的名称

Returns

fname 注册的装饰器的副本,如果没有为 fname 注册装饰器,则为 None

Raises
  • TypeError – 如果 fname 不是字符串

  • 未指定 – 由fname的装饰器深度复制引发的任何异常

property inner_problem#

元问题的内部问题。

此只读属性允许直接访问存储在此元问题中的problem

Returns

对内部问题的引用

Return type

问题

class pygmo.constant_arguments(prob, fixed_arguments: List[Optional[float]])#

将原始问题的某些参数设置为常量的元问题

版本2.19中的新功能。

如果已知问题某些维度的良好值,此包装器允许减少搜索空间的维度,并且是使用相同下限和上限限制值的替代方法。

我们可以通过传递原始问题来构造此问题的实例,以及一个包含每个参数的条目的列表,要么是该维度的固定参数,要么是如果参数应保持自由则为None:

>>> from pygmo import constant_arguments, problem, rosenbrock
>>> cprob = problem(constant_arguments(rosenbrock(dim=3), fixed_arguments=[1, None, None]))

我们现在看到新问题有两个维度,因为原始问题有三个维度,而我们固定了一个:

>>> cprob.get_nx()
2
Parameters
  • prob – 一个问题或用户定义的问题,可以是C++或Python(如果probNone,将使用null_problem代替)

  • fixed_arguments – 一个值列表,每个值对应包装问题的一个维度。 如果参数应固定为此值,则每个值应为浮点数; 如果参数应保持自由,则应为 None

Raises
  • ValueError – 如果fixed_arguments的长度与包装问题的维度数量不同

  • ValueError – 如果任何固定参数违反了包装问题的边界

  • ValueError – 如果传递了 nix() > 0 的问题

  • 未指定 – 由problem的构造函数或prob的深拷贝抛出的任何异常

get_full_x(x) List[float]#

获取给定低维x的完整x

C++暴露的问题#

class pygmo.null_problem(nobj=1, nec=0, nic=0)#

空值问题。

用于pygmo.problem和元问题的默认初始化中的问题。

Parameters
  • nobj (int) – 目标的数量

  • nec (int) – 等式约束的数量

  • nic (int) – 不等式约束的数量

Raises
  • ValueError – 如果 nobj, nec, nic 为负数或大于实现定义的值,或者如果 nobj 为零

  • 未指定 – 任何由C++和Python之间的失败引发的异常(例如,类型转换错误、函数签名不匹配等)。


class pygmo.cec2014(prob_id=1, dim=2)#

版本2.8中的新功能。

CEC 2014问题套件(连续、有界、单目标问题)

Parameters
  • prob_id (int) – 问题ID(范围为[1..30]中的一个)

  • dim (int) – 维度数(其中之一为 [2, 10, 20, 30, 50, 100])

Raises
  • OverflowError – 如果 dimprob_id 为负数或大于实现定义的值

  • ValueError – 如果 prob_id 不在 [1..28] 范围内,或者 dim 不在 [2, 10, 20, 30, 50, 100] 范围内,或者 dim 为 2 且 prob_id 在 [17,18,19,20,21,22,29,30] 范围内

另请参阅C++类pagmo::cec2014的文档。


class pygmo.cec2013(prob_id=1, dim=2)#

CEC 2013问题套件(连续、有界、单目标问题)

Parameters
  • prob_id (int) – 问题ID(范围为[1..28]中的一个)

  • dim (int) – 维度数(其中之一为 [2, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])

Raises
  • OverflowError – 如果 dimprob_id 为负数或大于实现定义的值

  • ValueError – 如果 prob_id 不在 [1..28] 范围内,或者如果 dim 不在 [2, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 范围内

另请参阅C++类pagmo::cec2013的文档。


class pygmo.cec2006(prob_id=1)#

CEC 2006问题集(连续、约束、单目标问题)

Parameters

prob_id (int) – 问题ID(范围为[1..24]中的一个)

Raises
  • OverflowError – 如果 prob_id 为负数或大于实现定义的值

  • ValueError – 如果 prob_id 不在 [1..24] 范围内

另请参阅C++类pagmo::cec2006的文档。

best_known()#

CEC 2006问题最著名的解决方案。

Returns

CEC 2006问题最著名的解决方案

Return type

一维NumPy浮点数数组


class pygmo.cec2009(prob_id = 1, is_constrained = false, dim = 30u)#

CEC 2009问题套件(连续、约束、单目标问题)

Parameters
  • prob_id (int) – 问题ID(范围为[1..10]中的一个)

  • is_constrained (bool) – 选择问题的约束版本

  • dim (int) – 问题维度

Raises
  • OverflowError – 如果 prob_iddim 为负数或大于实现定义的值

  • ValueError – 如果 prob_id 不在 [1..10] 范围内,或者如果 dim 为零

另请参阅C++类pagmo::cec2009的文档。


class pygmo.rosenbrock(dim=2)#

Rosenbrock问题。

Parameters

dim (int) – 问题维度

Raises

另请参阅C++类pagmo::rosenbrock的文档。

best_known()#

Rosenbrock问题最著名的解决方案。

Returns

罗森布罗克问题最著名的解决方案

Return type

一维NumPy浮点数数组


class pygmo.rastrigin(dim=1)#

Rastrigin问题。

参见 pagmo::rastrigin.

best_known()#

Rastrigin问题最著名的解决方案。

Returns

Rastrigin问题最著名的解决方案

Return type

一维NumPy浮点数数组


class pygmo.minlp_rastrigin(dim_c=1, dim_i=1)#

可扩展的MINLP Rastrigin问题。

Parameters
  • dim_c (int) – MINLP 连续维度

  • dim_i (int) – MINLP整数维度

Raises
  • OverflowError – 如果 dim_c / dim_i 为负数或大于实现定义的值

  • ValueError – 如果 dim_c + dim_i 小于 1

另请参阅C++类pagmo::minlp_rastrigin的文档。


class pygmo.schwefel(dim=1)#

Schwefel问题。

参见 pagmo::schwefel

best_known()#

Schwefel问题最著名的解决方案。

Returns

Schwefel问题最著名的解决方案

Return type

一维NumPy浮点数数组


class pygmo.ackley(dim=1)#

阿克雷问题。

参见 pagmo::ackley.

best_known()#

阿克利问题最著名的解决方案。

Returns

Ackley问题最著名的解决方案

Return type

一维NumPy浮点数数组


class pygmo.griewank(dim=1)#

Griewank问题。

参见 pagmo::griewank

best_known()#

Griewank问题最著名的解决方案。

Returns

Griewank问题最著名的解决方案

Return type

一维NumPy浮点数数组


class pygmo.lennard_jones(atoms=3)#

Lennard Jones 集群问题。

参见 pagmo::lennard_jones.


class pygmo.golomb_ruler(order, upper_bound)#

高隆尺问题。

参见 pagmo::golomb_ruler


class pygmo.zdt(prob_id=1, param=30)#

ZDT问题。

参见 pagmo::zdt.

p_distance(point)#

p_distance(pop)

决策向量的收敛度量(0 = 在最优前沿)

由Martens和Izzo引入的这个度量标准能够分析性地测量任何点到任何DTLZ问题的帕累托前沿的“距离”。

Parameters
  • point (数组类对象) – 请求p距离的决策向量

  • pop (population) – 请求平均p距离的群体

Returns

距离(或平均距离)帕累托前沿

Return type

float

另请参阅C++类p_distance()的文档


class pygmo.dtlz(prob_id=1, dim=5, fdim=3, alpha=100)#

DTLZ问题套件问题。

Parameters
  • prob_id (int) – DTLZ问题ID

  • dim (int) – 问题维度

  • fdim (int) – 目标数量

  • alpha (int) – 控制解的密度(仅由DTLZ4使用)

Raises
  • OverflowError – 如果 prob_iddimfdimalpha 为负数或大于实现定义的值

  • ValueError – 如果 prob_id 不在 [1..7] 范围内,fdim 小于 2,dim 小于或等于 fdim

另请参阅C++类pagmo::dtlz的文档。

p_distance(point)#

p_distance(pop)

决策向量的收敛度量(0 = 在最优前沿)

由Martens和Izzo引入的这个度量标准能够分析性地测量任何点到任何DTLZ问题的帕累托前沿的“距离”。

Parameters
  • point (数组类对象) – 请求p距离的决策向量

  • pop (population) – 请求平均p距离的群体

Returns

距离(或平均距离)帕累托前沿

Return type

float

另请参阅C++类p_distance()的文档

plot(pop, az=40, comp=[0, 1, 2])#

在三维空间中绘制DTLZ问题的解。如果问题ID为2、3或4,还会可视化帕累托前沿。

Parameters
  • pop (population) – dtlz问题的解决方案群体

  • az (float) – 创建3d图时的视角角度

  • comp (list) – 按顺序索引x、y和z轴的适应度维度

Returns

当前图形上的当前坐标轴实例

Raises

ValueError – 如果 pop 不包含 DTLZ 问题(仅通过其名称验证)或如果 comp 的长度不为 3

示例

>>> import pygmo as pg
>>> udp = pg.dtlz(prob_id = 1, fdim =3, dim = 5)
>>> pop = pg.population(udp, 40)
>>> udp.plot(pop) 

class pygmo.inventory(weeks=4, sample_size=10, seed=random)#

库存问题。

参见 pagmo::inventory


class pygmo.hock_schittkowski_71#

Hock-schittkowski 71 问题。

参见 pagmo::hock_schittkowski_71.

best_known()#

Hock-schittkowski 71问题的最著名解决方案。

Returns

Hock-schittkowski 71问题的最著名解决方案

Return type

一维NumPy浮点数数组


class pygmo.luksan_vlcek1(dim=3)#

实现Luksan和Vlcek报告中的示例5.1。

这个问题也被称为具有三角指数约束的链式Rosenbrock函数。

它在pygmo中的公式表示为:

\[\begin{split}\begin{array}{rl} \mbox{find:} & -5 \le x_i \le 5, \forall i=1..n \\ \mbox{to minimize: } & \sum_{i=1}^{n-1}\left[100\left(x_i^2-x_{i+1}\right)^2 + \left(x_i-1\right)^2\right] \\ \mbox{subject to:} & 3x_{k+1}^3+2x_{k+2}-5+\sin(x_{k+1}-x_{k+2})\sin(x_{k+1}+x_{k+2}) + \\ & +4x_{k+1}-x_k\exp(x_k-x_{k+1})-3 = 0, \forall k=1..n-2 \end{array}\end{split}\]

参见:Luksan, L., 和 Jan Vlcek. “无约束和等式约束优化的稀疏和部分可分离测试问题.” (1999). http://hdl.handle.net/11104/0123965

Parameters

dim (int) – 问题维度

Raises

OverflowError – 如果 dim 为负数或大于实现定义的值

另请参阅C++类pagmo::luksan_vlcek1的文档。


class pygmo.translate(prob=None, translation=[0.0])#

翻译元问题。

这个元问题通过固定的平移向量转换输入pygmo.problem或用户定义问题(UDP)的整个搜索空间。translate对象是用户定义的问题,可以用于构建pygmo.problem

Parameters
  • prob – 用户定义的问题(Python 或 C++),或 problem 的实例 (如果 probNone,将使用 null_problem 代替)

  • 翻译 (类数组对象) – 包含要应用的翻译的数组

Raises
  • ValueError – 如果 translation 的长度不等于 prob 的维度

  • 未指定 – 由以下原因引发的任何异常: * pygmo.problem的构造函数, * 底层C++类的构造函数, * C++和Python之间的交互失败(例如,类型转换错误,函数签名不匹配等)

property inner_problem#

元问题的内部问题。

此只读属性允许直接访问存储在此元问题中的problem

Returns

对内部问题的引用

Return type

问题

property translation#

平移向量。

此只读属性包含一个float数组,表示在此问题的构造中使用的平移向量。

Returns

平移向量

Return type

一维NumPy浮点数数组


class pygmo.decompose(prob=None, weight=[0.5, 0.5], z=[0.0, 0.0], method='weighted', adapt_ideal=False)#

分解元问题。

这个元问题分解了一个多目标输入用户定义的问题,产生了一个单目标用户定义的问题,其适应度函数结合了原始的适应度函数。特别是,这里提供了三种不同的分解方法

  • 加权分解,

  • 切比雪夫分解,

  • 边界拦截方法(带有惩罚约束)。

\(n\)个目标的情况下,我们用\(\mathbf f(\mathbf x) = [f_1(\mathbf x), \ldots, f_n(\mathbf x)]\)表示包含原始多个目标的向量,用\(\boldsymbol \lambda = (\lambda_1, \ldots, \lambda_n)\)表示一个\(n\)维权重向量,用\(\mathbf z^* = (z^*_1, \ldots, z^*_n)\) 表示一个\(n\)维参考点。我们还假设\(\lambda_i > 0, \forall i=1..n\)\(\sum_i \lambda_i = 1\)

因此,根据所选的分解方法,分解后的问题是一个具有以下单一目标的单目标优化问题:

  • 加权分解:\(f_d(\mathbf x) = \boldsymbol \lambda \cdot \mathbf f\),

  • 切比雪夫分解:\(f_d(\mathbf x) = \max_{1 \leq i \leq m} \lambda_i \vert f_i(\mathbf x) - z^*_i \vert\),

  • 边界拦截方法(带惩罚约束):\(f_d(\mathbf x) = d_1 + \theta d_2\),

其中 \(d_1 = (\mathbf f - \mathbf z^*) \cdot \hat {\mathbf i}_{\lambda}\), \(d_2 = \vert (\mathbf f - \mathbf z^*) - d_1 \hat {\mathbf i}_{\lambda})\vert\)\(\hat {\mathbf i}_{\lambda} = \frac{\boldsymbol \lambda}{\vert \boldsymbol \lambda \vert}\).

参考点 \(z^*\) 通常被视为理想点,因此在优化/进化过程中可能会允许其变化。参数 adapt_ideal 激活了这种行为,以便每当找到新的理想点时,\(z^*\) 会相应地进行调整。

使用decompose会丢弃梯度和Hessian矩阵,因此如果原始用户定义的问题实现了它们,它们在分解后的问题中将不可用。这种行为的原因是Tchebycheff分解是不可微的。此外,这个类的使用最初是为了无导数优化。

参见:“Q. Zhang – MOEA/D: 基于分解的多目标进化算法”

参见:https://en.wikipedia.org/wiki/Multi-objective_optimization#Scalarizing

Parameters
  • prob – 用户定义的问题(Python 或 C++),或 问题 的实例 (如果 probNone,将使用 null_problem 代替)

  • weight (数组类对象) – 权重向量 \(\boldsymbol \lambda\)

  • z (数组类对象) – 参考点 \(\mathbf z^*\)

  • method (str) – 一个包含所选分解方法的字符串

  • adapt_ideal (bool) – 当 True 时,参考点会在每次适应度评估时进行调整,以成为理想点

Raises
  • ValueError – 如果以下任一情况发生: * prob 是单目标或受约束的, * method 不是 ['weighted', 'tchebycheff', 'bi'] 中的一个, * weight 的大小不是 \(n\), * z 的大小不是 \(n\), * weight 不满足 \(\lambda_i > 0, \forall i=1..n\), * weight 不满足 \(\sum_i \lambda_i = 1\)

  • 未指定 – 由以下原因引发的任何异常: * pygmo.problem的构造函数, * 底层C++类的构造函数, * C++和Python之间的交互失败(例如,类型转换错误,函数签名不匹配等)

property inner_problem#

元问题的内部问题。

此只读属性允许直接访问存储在此元问题中的problem

Returns

对内部问题的引用

Return type

问题

original_fitness(x)#

原始问题的适应度。

返回用于构建分解问题的原始多目标问题的适应度。

Parameters

x (数组类对象) – 输入决策向量

Returns

原始多目标问题的适应度

Return type

一维NumPy浮点数数组

Raises

未指定 – 由原始适应度计算引发的任何异常,或由C++和Python之间的交互失败引发的异常(例如,类型转换错误、函数签名不匹配等)

property z#

当前参考点。

此只读属性包含用于分解的参考点。这仅用于Tchebycheff和边界拦截分解方法。

参考点在每次调用适应度时进行调整。

Returns

参考点

Return type

一维NumPy浮点数数组

Raises

未指定 – 任何由C++和Python之间的失败引发的异常(例如,类型转换错误、函数签名不匹配等)。


class pygmo.unconstrain(prob=None, method='death penalty', weights=[])#

无约束元问题。

这个元问题通过应用以下方法之一将约束问题转化为无约束问题:

  • 死刑:如果适应度向量不可行,则简单地对所有目标施加相同的高值惩罚。

  • Kuri的死刑:由Angel Kuri Morales等人定义,根据满足约束的比率对所有目标进行惩罚。

  • 加权违规惩罚:通过约束违规的加权和对所有目标进行惩罚。

  • 忽略约束:简单地忽略约束。

  • 忽略目标:忽略目标并将整体约束违反(即等式和不等式违反的L2范数之和)定义为一个新的单一目标。

使用unconstrain会丢弃梯度和海森矩阵,因此如果原始用户定义的问题实现了它们,它们在无约束问题中将不可用。这种行为的原因是,通常情况下,实现的方法可能不可微。此外,这个类的使用最初是为了无导数优化。

参见:Coello Coello, C. A. (2002). 进化算法中使用的理论和数值约束处理技术:最新技术综述。应用力学与工程中的计算机方法,191(11), 1245-1287。

参见:Kuri Morales, A. 和 Quezada, C.C. 一种通用的折衷遗传算法用于约束优化, 第六届欧洲智能技术与软计算大会论文集,EUFIT’98,518-522页,1998年。

Parameters
  • prob – 一个问题或用户定义的问题,可以是C++或Python(如果probNone,将使用null_problem代替)

  • method (str) – 一个包含所选无约束方法的字符串,其中之一是 ['death penalty', 'kuri', 'weighted', 'ignore_c', 'ignore_o']

  • weights (数组类对象) – 如果选择的方法是 'weighted',则使用的权重向量

Raises
  • ValueError – 如果以下任一情况发生: * prob 未受约束, * method 不是 ['death penalty', 'kuri', 'weighted', 'ignore_c', 'ignore_o'] 中的一个, * weight 的大小与问题约束不一致(如果选择了 'weighted' 方法),或者在其他情况下不为空。

  • 未指定 – 由以下原因引发的任何异常: * pygmo.problem的构造函数, * 底层C++类的构造函数, * C++和Python之间的交互失败(例如,类型转换错误,函数签名不匹配等)

property inner_problem#

元问题的内部问题。

此只读属性允许直接访问存储在此元问题中的problem

Returns

对内部问题的引用

Return type

问题


class pygmo.wfg(prob_id=1, dim_dvs=5, dim_obj=3, dim_k=4)#

WFG问题套件。

Parameters
  • prob_id (int) – WFG问题ID

  • dim_dvs (int) – 决策向量大小

  • dim_obj (int) – 目标数量

  • dim_k (int) – 位置参数

Raises
  • OverflowError – 如果 prob_id, dim_dvs, dim_objdim_k 为负数或大于实现定义的值

  • ValueError – 如果 prob_id 不在 [1, …, 9] 范围内,dim_dvs 小于 1,dim_obj 小于 2,dim_k 小于 1 或大于等于 dim_dvs,或者如果 dim_k*mod(*dim_obj-1) 不等于零。此外,当 prob_id 等于 2 或 3 时,如果 (dim_dvs-dim_k)mod(2) 不等于零。

另请参阅C++类pagmo::wfg的文档。