岛屿类#

_images/island_no_text.png
class pygmo.island(**kwargs)#

岛屿类。

在pygmo术语中,island是一个封装了以下实体的类:

Through the UDI, the island class manages the asynchronous evolution (or optimisation) of its population via the algorithm’s evolve() method. Depending on the UDI, the evolution might take place in a separate thread (e.g., if the UDI is a thread_island), in a separate process (e.g., if the UDI is a mp_island) or even in a separate machine (e.g., if the UDI is a ipyparallel_island). The evolution is always asynchronous (i.e., running in the “background”) and it is initiated by a call to the evolve() method. At any time the user can query the state of the island and fetch its internal data members. The user can explicitly wait for pending evolutions to conclude by calling the wait() and wait_check() methods. The status of ongoing evolutions in the island can be queried via the status attribute.

替换和选择策略在岛屿是archipelago的一部分时使用。 它们规定了当岛屿之间发生迁移时,如何从岛屿中选择和替换个体。如果岛屿不是archipelago的一部分, 替换和选择策略则不发挥作用。

通常,pygmo 用户会使用现有的 UDI 与此类结合使用(参见 这里 获取完整列表),但高级用户可以实现自己的 UDI 类型。用户定义的岛屿必须实现以下方法:

def run_evolve(self, algo, pop):
  ...

UDI的run_evolve()方法将使用输入的algorithmevolve()方法来进化输入的population,一旦进化 完成,它将返回用于进化的算法和进化后的population

除了强制性的run_evolve()方法外,UDI还可以实现以下可选方法:

def get_name(self):
  ...
def get_extra_info(self):
  ...

有关如何使用UDI中的可选方法的详细信息,请参阅此类中相应方法的文档。

请注意,由于island的异步性质,UDI 对线程安全有一定的要求。具体来说,run_evolve() 总是在一个单独的执行线程中被调用,因此:

  • 多个UDI对象可能同时调用它们自己的run_evolve()方法,

  • 在特定的UDI对象中,当run_evolve()在另一个线程中并发运行时,可以调用UDI公共API中的任何方法。因此,UDI编写者必须确保在岛屿进化的同时,可以安全地执行诸如复制UDI、调用可选方法(如get_name())等操作。

可以使用关键字参数以多种方式初始化一个岛屿:

  • 如果参数列表为空,则构造一个默认的island,包含一个thread_island UDI,一个null_algorithm算法,一个空的问题类型为null_problem的种群,以及默认构造的r_policys_policy

  • 如果参数列表包含 algopop 以及可选的 udir_pols_pol,那么构造函数将初始化一个包含指定算法、种群、UDI 和替换/选择策略的 island。如果未提供 r_pol 和/或 s_pol,替换/选择策略将默认构造。如果未提供 udi 参数,UDI 类型将根据平台、Python 版本以及提供的 algopop 参数进行启发式选择:

  • 如果参数列表包含 algoprobsize 以及可选的 udibseedr_pols_pol, 那么将从 probsizebseed 构建一个 population,然后构建过程将按照上述详细方式进行 (即,使用 algo 和新创建的种群来初始化岛的算法和种群,如果未指定 UDI,将根据上述启发式方法选择, 替换/选择策略由 r_pols_pol 给出)。

如果关键字参数列表无效,将会引发KeyError异常。

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

Keyword Arguments
  • udi – 用户定义的岛屿,可以是Python或C++

  • algo – 用户定义的算法(可以是Python或C++),或者是algorithm的实例

  • pop (population) – 一个种群

  • prob – 用户定义的问题(可以是Python或C++),或者是problem的实例

  • b – 用户定义的批量适应度评估器(可以是Python或C++),或者是bfe的实例

  • size (int) – 个体数量

  • r_pol – 用户定义的替换策略(可以是Python或C++),或者是r_policy的实例

  • s_pol – 用户定义的选择策略(可以是Python或C++),或者是s_policy的实例

  • seed (int) – 随机种子(如果未指定,将随机生成)

Raises
  • KeyError – 如果关键字参数集无效

  • 未指定 – 由调用的C++构造函数、UDI的深拷贝、algorithmpopulation的构造函数抛出的任何异常,C++和Python之间的交互失败(例如,类型转换错误、函数签名不匹配等)。

evolve(n=1)#

启动进化。

此方法将使用岛屿的algorithm来进化岛屿的population。 进化是异步进行的:调用evolve()将创建一个进化任务, 该任务将被推送到队列中,然后立即返回。队列中的任务由island对象管理的单独执行线程消费。 每个任务将连续调用UDI的run_evolve()方法n次以执行实际的进化。 岛屿的算法和种群将在每次run_evolve()调用结束时更新。任务内部引发的异常存储在岛屿对象中, 并可以通过调用wait_check()重新引发。

如果岛屿是archipelago的一部分,那么个体可能会迁移到其他岛屿或从其他岛屿迁移过来。迁移算法包括以下步骤:

  • 在UDI上调用run_evolve()之前,岛屿会询问群岛是否有来自其他岛屿的候选个体。如果有,则调用替换策略,并用移民更新岛屿的当前种群;

  • run_evolve() 随后被调用,当前种群进行进化;

  • run_evolve() 完成后,从进化后的种群中选择个体,并将其复制到群岛的迁移数据库中,以供未来的迁移使用。

可以多次调用此方法以将多个进化任务加入队列,这些任务将按照FIFO(先进先出)的方式被消费。用户可以调用wait()wait_check()来阻塞,直到所有任务完成,并获取任务执行期间引发的异常。status属性可用于查询岛中异步操作的状态。

Parameters

n (int) – UDI的run_evolve()方法在进化任务中被调用的次数 (如果岛屿属于一个群岛,这也对应于迁移可能发生的次数)

Raises
  • IndexError – 如果岛屿是群岛的一部分,并且在迁移过程中使用了无效的岛屿索引(如果群岛的拓扑结构不正确,可能会发生这种情况)

  • OverflowError – 如果 n 是负数或大于实现定义的值

  • 未指定 – 由archipelago的公共接口、替换/选择策略的公共接口、底层C++方法或C++与Python之间的交互失败(例如,类型转换错误、函数签名不匹配等)引发的任何异常。

extract(t)#

提取用户定义的岛屿。

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

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

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

  • 否则,None 将被返回。

Parameters

t (type) – 要提取的用户定义岛屿的类型

Returns

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

Raises

TypeError – 如果 t 不是一个 type

示例

>>> import pygmo as pg
>>> i1 = pg.island(algo=pg.de(), prob=pg.rosenbrock(), size=20, udi=pg.thread_island())
>>> i1.extract(pg.thread_island) 
<pygmo.core.thread_island at 0x7f8e478e1210>
>>> i1.extract(pg.mp_island) is None
True
>>> class isl:
...     def run_evolve(self, algo, pop):
...         return algo, pop
>>> i2 = pg.island(algo=pg.de(), prob=pg.rosenbrock(), size=20, udi=isl())
>>> i2.extract(object) 
<__main__.isl at 0x7f8e478261d0>
>>> i2.extract(isl) 
<__main__.isl at 0x7f8e478261d0>
>>> i2.extract(pg.thread_island) is None
True
get_algorithm()#

获取算法。

在岛屿演化过程中调用此方法是安全的。

Returns

岛屿算法的一个副本

Return type

algorithm

Raises

未指定 – 由底层C++方法抛出的任何异常

get_extra_info()#

岛屿的额外信息。

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

在岛屿演化过程中调用此方法是安全的。

Returns

关于UDI的额外信息

Return type

str

Raises

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

get_name()#

岛屿的名称。

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

在岛屿演化过程中调用此方法是安全的。

Returns

UDI的名称

Return type

str

Raises

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

get_population()#

获取人口。

在岛屿演化过程中调用此方法是安全的。

Returns

岛上人口的一份副本

Return type

population

Raises

未指定 – 由底层C++方法抛出的任何异常

get_r_policy()#

获取替换策略。

Returns

当前替换策略的副本

Return type

r_policy

get_s_policy()#

获取选择策略。

Returns

当前选择策略的副本

Return type

s_policy

is_(t)#

检查用户定义的岛屿类型。

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

Parameters

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

Returns

UDI是否为t类型

Return type

bool

Raises

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

set_algorithm(algo)#

设置算法。

在岛屿演化过程中调用此方法是安全的。

Parameters

algo (algorithm) – 将被复制到岛屿中的算法

Raises

未指定 – 由底层C++方法抛出的任何异常

set_population(pop)#

设置人口。

在岛屿演化过程中调用此方法是安全的。

Parameters

pop (population) – 将被复制到岛屿的种群

Raises

未指定 – 由底层C++方法抛出的任何异常

property status#

岛屿的状态。

此只读属性将返回一个evolve_status标志,指示岛屿中异步操作的当前状态。该标志将是:

  • idle 如果岛屿当前没有进化,并且自上次调用 wait_check() 以来没有抛出异常;

  • busy 如果岛屿正在进化,并且自上次调用 wait_check() 以来,进化任务尚未抛出任何异常;

  • idle_error 如果当前岛屿没有在进化,并且自上次调用 wait_check() 以来至少有一个进化任务抛出异常;

  • busy_error 如果岛屿当前正在进化,并且自上次调用 wait_check() 以来至少有一个进化任务已经抛出异常。

请注意,在调用wait_check()之后,status将始终返回idle,而在调用wait()之后,status将始终返回idleidle_error

Returns

一个标志,指示岛上异步操作的当前状态

Return type

evolve_status

wait()#

此方法将阻塞,直到通过evolve()排队的所有进化任务完成。 通过wait_check()可以重新抛出排队任务抛出的异常:它们不会被此方法重新抛出。此外,与wait_check()相反,此方法不会重置岛屿的状态:在调用wait()之后,status将始终返回idleidle_errorevolve_status

wait_check()#

阻塞直到进化结束并重新抛出第一个存储的异常。

如果在最后一次调用wait_check()之后入队的任务抛出了异常,该方法将重新抛出该异常。如果在最后一次调用wait_check()之后有多个任务抛出了异常,该方法将重新抛出第一个抛出异常的任务所引发的异常,而忽略其他所有抛出异常的任务的异常。

请注意,wait_check() 会重置岛屿的状态:在调用 wait_check() 之后, status 将始终返回 idleevolve_status

Raises

未指定 – 由进化任务或底层C++方法抛出的任何异常