问题列表#
用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(如果prob是None,将使用null_problem代替)kwargs – 要应用于输入问题函数的装饰器字典
- Raises
- 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
- 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(如果prob是None,将使用null_problem代替)fixed_arguments – 一个值列表,每个值对应包装问题的一个维度。 如果参数应固定为此值,则每个值应为浮点数; 如果参数应保持自由,则应为 None
- Raises
ValueError – 如果fixed_arguments的长度与包装问题的维度数量不同
ValueError – 如果任何固定参数违反了包装问题的边界
ValueError – 如果传递了 nix() > 0 的问题
未指定 – 由
problem的构造函数或prob的深拷贝抛出的任何异常
C++暴露的问题#
- class pygmo.null_problem(nobj=1, nec=0, nic=0)#
空值问题。
用于
pygmo.problem和元问题的默认初始化中的问题。- Parameters
- Raises
ValueError – 如果 nobj, nec, nic 为负数或大于实现定义的值,或者如果 nobj 为零
未指定 – 任何由C++和Python之间的失败引发的异常(例如,类型转换错误、函数签名不匹配等)。
- class pygmo.cec2014(prob_id=1, dim=2)#
版本2.8中的新功能。
CEC 2014问题套件(连续、有界、单目标问题)
- Parameters
- Raises
OverflowError – 如果 dim 或 prob_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
- Raises
OverflowError – 如果 dim 或 prob_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
- Raises
OverflowError – 如果 prob_id 或 dim 为负数或大于实现定义的值
ValueError – 如果 prob_id 不在 [1..10] 范围内,或者如果 dim 为零
另请参阅C++类
pagmo::cec2009的文档。
- class pygmo.rosenbrock(dim=2)#
Rosenbrock问题。
- Parameters
dim (
int) – 问题维度- Raises
OverflowError – 如果 dim 为负数或大于实现定义的值
ValueError – 如果 dim 小于 2
另请参阅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
- 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 集群问题。
- class pygmo.golomb_ruler(order, upper_bound)#
高隆尺问题。
- 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
另请参阅C++类
p_distance()的文档
- class pygmo.dtlz(prob_id=1, dim=5, fdim=3, alpha=100)#
DTLZ问题套件问题。
- Parameters
- Raises
OverflowError – 如果 prob_id、dim、fdim 或 alpha 为负数或大于实现定义的值
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
另请参阅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的实例 (如果 prob 是None,将使用null_problem代替)翻译 (类数组对象) – 包含要应用的翻译的数组
- Raises
ValueError – 如果 translation 的长度不等于 prob 的维度
未指定 – 由以下原因引发的任何异常: *
pygmo.problem的构造函数, * 底层C++类的构造函数, * C++和Python之间的交互失败(例如,类型转换错误,函数签名不匹配等)
- 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
- 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之间的交互失败(例如,类型转换错误,函数签名不匹配等)
- 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(如果prob是None,将使用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之间的交互失败(例如,类型转换错误,函数签名不匹配等)
- class pygmo.wfg(prob_id=1, dim_dvs=5, dim_obj=3, dim_k=4)#
WFG问题套件。
- Parameters
- Raises
OverflowError – 如果 prob_id, dim_dvs, dim_obj 或 dim_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的文档。