使用类 algorithm#

../_images/algo_no_text.png

algorithm 类代表一个通用的优化算法。用户在单独的类(用户定义的算法,或 UDA)中编写此类算法的细节,然后将其传递给 algorithm,后者提供一个统一的接口。

注意

用户定义算法(UDAs)是优化算法(由用户编码),可用于构建类型为algorithm的pygmo对象。

一些UDAs(优化算法)已经随pygmo提供,我们称它们为pygmo UDAs。

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

让我们开始:

>>> import pygmo as pg
>>> algo = pg.algorithm(pg.cmaes(gen = 100, sigma0=0.3))
>>> print(algo) 
Algorithm name: CMA-ES: Covariance Matrix Adaptation Evolutionary Strategy [stochastic]
    C++ class name: ...
    Thread safety: basic

Extra info:
    Generations: 100
    cc: auto
    cs: auto
    c1: auto
    cmu: auto
    sigma0: 0.3
    Stopping xtol: 1e-06
    Stopping ftol: 1e-06
    Memory: false
    Verbosity: 0
    Force bounds: false
    Seed: ...

在上面的代码中,在简单导入pygmo包之后,我们通过从cmaes构造一个algorithm来定义一个变量algo,这是我们实现的协方差矩阵适应进化策略。为了构造pygmo UDA,我们还传递了一些参数(gensigma0),这些参数的含义在cmaes中有文档说明。在下一行中,我们检查了algorithm。我们可以一目了然地看到algorithm的名称和一些额外信息,这些信息表明用户(在这种情况下是我们)在UDA(在这种情况下是cmaes)中实现了可选的get_extra_info()方法,该方法将一些定义UDA的基本参数打印到屏幕上。

我们也可以随时通过extract方法访问UDA,从而访问其未在algorithm接口中公开的方法:

>>> uda = algo.extract(pg.cmaes)
>>> type(uda)
<class 'pygmo.core.cmaes'>
>>> uda = algo.extract(pg.de)
>>> uda is None
True

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