算法类#

_images/algo_no_text.png
class pygmo.algorithm(uda=null_algorithm())#

算法类。

这个类代表了一种优化算法。一个算法可以是随机的、确定性的、基于种群的、无导数的、使用海森矩阵的、使用梯度的、元启发式的、进化的等等。通过这个类,pygmo提供了一个通用接口,适用于所有类型的算法,这些算法可以应用于寻找由problem类表示的通用数学规划问题的解决方案。

为了在pygmo中定义一个优化算法,用户首先需要定义一个类,其方法描述算法的属性并实现其逻辑。在pygmo中,我们将这样的类称为用户定义算法,简称UDA。一旦定义并实例化,UDA就可以用来构造这个类的实例,algorithm,它提供了优化算法的通用接口。

每个UDA必须至少实现以下方法:

def evolve(self, pop):
  ...

evolve() 方法接受一个 population 作为输入,并期望返回由原始种群的进化(或优化)生成的新种群。

可以在UDA中实现其他可选方法:

def has_set_seed(self):
  ...
def set_seed(self, s):
  ...
def has_set_verbosity(self):
  ...
def set_verbosity(self, l):
  ...
def get_name(self):
  ...
def get_extra_info(self):
  ...

有关如何实现UDA中的可选方法以及algorithm如何使用它们的详细信息,请参阅此类中相应方法的文档。请注意,暴露的C++算法也可以用作UDA,即使它们没有暴露上面列出的任何强制或可选方法(有关已在pygmo中编码的UDA的完整列表,请参见这里)。

这个类是C++类pagmo::algorithm的Python对应类。

Parameters

uda – 用户定义的算法,可以是C++或Python

Raises
  • NotImplementedError – 如果 uda 没有实现上述的强制方法

  • 未指定 – 在构造过程中调用的UDA方法抛出的任何异常,UDA的深拷贝,底层C++类的构造函数,或C++和Python之间的接口失败(例如,类型转换错误,函数签名不匹配等)

evolve(pop)#

此方法将调用UDA的evolve()方法。这是优化(进化)的核心所在。

Parameters

pop (population) – 初始人口

Returns

进化后的种群

Return type

population

Raises

未指定 – 由UDA的evolve()方法抛出的任何异常,或由C++和Python之间的交互失败引起的异常(例如,类型转换错误、函数签名不匹配等)。

extract(t)#

提取用户定义的算法。

此方法允许提取存储在此algorithm实例中的用户定义算法(UDA)的引用。此函数的行为取决于t的值(必须是一个type)以及内部UDA的类型:

  • 如果UDA的类型是t,那么将返回对UDA的引用 (这反映了相应的C++方法的行为 pagmo::algorithm::extract()),

  • 如果 tobject 并且 UDA 是一个 Python 对象(而不是一个 暴露的 C++ 算法),那么将返回对 UDA 的引用(这允许在不了解其类型的情况下提取 Python UDA),

  • 否则,None 将被返回。

Parameters

t (type) – 要提取的用户定义算法的类型

Returns

对内部用户定义算法的引用,如果提取失败则为None

Raises

TypeError – 如果 t 不是一个 type

示例

>>> import pygmo as pg
>>> a1 = pg.algorithm(pg.compass_search())
>>> a1.extract(pg.compass_search) 
<pygmo.core.compass_search at 0x7f8e4792b670>
>>> a1.extract(pg.de) is None
True
>>> class algo:
...     def evolve(self, pop):
...         return pop
>>> a2 = pg.algorithm(algo())
>>> a2.extract(object) 
<__main__.algo at 0x7f8e478c04e0>
>>> a2.extract(algo) 
<__main__.algo at 0x7f8e478c04e0>
>>> a2.extract(pg.de) is None
True
get_extra_info()#

算法的额外信息。

如果UDA提供了一个get_extra_info()方法,那么这个方法将返回其get_extra_info()方法的输出。否则,将返回一个空字符串。

Returns

关于UDA的额外信息

Return type

str

Raises

未指定 – 由UDA的get_extra_info()方法抛出的任何异常

get_name()#

算法的名称。

如果UDA提供了get_name()方法,那么此方法将返回其get_name()方法的输出。 否则,将返回基于UDA类型的实现定义的名称。

Returns

算法的名称

Return type

str

get_thread_safety()#

算法的线程安全级别。

此方法将返回一个枚举值 pygmo.thread_safety,该值指示UDA的线程安全级别。与C++不同,在Python中无法在UDA中重新实现此方法。也就是说,对于C++ UDA,返回值将是UDA的get_thread_safety()方法返回的值。对于Python UDA,返回值将无条件为none

Returns

UDA的线程安全级别

Return type

一个值为 pygmo.thread_safety

has_set_seed()#

检查UDA中是否可用set_seed()方法。

如果UDA中存在set_seed()方法,则此方法将返回True,否则返回False

set_seed() 方法的可用性确定如下:

  • 如果UDA没有提供set_seed()方法,那么这个方法将总是返回False;

  • 如果UDA提供了set_seed()方法但没有提供has_set_seed()方法, 那么这个方法将总是返回True

  • 如果UDA提供了set_seed()has_set_seed()方法,那么此方法将返回UDA的has_set_seed()方法的输出。

可选的has_set_seed()方法必须返回一个bool。有关如何实现UDA的set_seed()方法的信息,请参见set_seed()

Returns

一个标志,表示UDA中set_seed()方法的可用性

Return type

bool

has_set_verbosity()#

检查UDA中是否可用set_verbosity()方法。

如果UDA中存在set_verbosity()方法,则此方法将返回True,否则返回False

set_verbosity() 方法的可用性确定如下:

  • 如果UDA没有提供set_verbosity()方法,那么这个方法将总是返回False;

  • 如果UDA提供了一个set_verbosity()方法,但没有提供一个has_set_verbosity()方法, 那么这个方法将始终返回True

  • 如果UDA同时提供了set_verbosity()has_set_verbosity()方法,那么此方法将返回UDA的has_set_verbosity()方法的输出。

可选的has_set_verbosity()方法必须返回一个bool。有关如何实现UDA的set_verbosity()方法的信息,请参见set_verbosity()

Returns

一个标志,表示UDA中set_verbosity()方法的可用性

Return type

bool

is_(t)#

检查用户定义算法的类型。

如果extract(t)返回None,则此方法返回False,否则返回True

Parameters

t (type) – 将与UDA类型进行比较的类型

Returns

UDA 是否为 t 类型

Return type

bool

Raises

未指定 – 由extract()抛出的任何异常

is_stochastic()#

has_set_seed() 的别名。

set_seed(seed)#

设置随机演化的种子。

此方法将设置用于UDA中所有随机变量的evolve()方法的种子。如果UDA提供了set_seed()方法,则将调用其set_seed()方法。否则,将引发错误。seed参数必须为非负数。

UDA的set_seed()方法必须能够接受int作为输入参数。

Parameters

seed (int) – 随机种子

Raises
  • NotImplementedError – 如果UDA没有提供set_seed()方法

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

set_verbosity(level)#

设置日志和屏幕输出的详细程度。

此方法将设置算法的详细程度。如果UDA提供了set_verbosity()方法,则将调用其set_verbosity()方法。否则,将引发错误。

输入参数level的确切含义取决于UDA。

UDA的set_verbosity()方法必须能够接受int作为输入参数。

Parameters

level (int) – 所需的详细程度

Raises
  • NotImplementedError – 如果UDA没有提供set_verbosity()方法

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