岛屿类#
- class pygmo.island(**kwargs)#
岛屿类。
在pygmo术语中,island是一个封装了以下实体的类:
用户定义的岛屿(UDI),
一个
算法,一个
population,替换策略(类型为
r_policy),选择策略(类型为
s_policy)。
Through the UDI, the island class manages the asynchronous evolution (or optimisation) of its
populationvia the algorithm’sevolve()method. Depending on the UDI, the evolution might take place in a separate thread (e.g., if the UDI is athread_island), in a separate process (e.g., if the UDI is amp_island) or even in a separate machine (e.g., if the UDI is aipyparallel_island). The evolution is always asynchronous (i.e., running in the “background”) and it is initiated by a call to theevolve()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 thewait()andwait_check()methods. The status of ongoing evolutions in the island can be queried via thestatusattribute.替换和选择策略在岛屿是
archipelago的一部分时使用。 它们规定了当岛屿之间发生迁移时,如何从岛屿中选择和替换个体。如果岛屿不是archipelago的一部分, 替换和选择策略则不发挥作用。通常,pygmo 用户会使用现有的 UDI 与此类结合使用(参见 这里 获取完整列表),但高级用户可以实现自己的 UDI 类型。用户定义的岛屿必须实现以下方法:
def run_evolve(self, algo, pop): ...
UDI的
run_evolve()方法将使用输入的algorithm的evolve()方法来进化输入的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_islandUDI,一个null_algorithm算法,一个空的问题类型为null_problem的种群,以及默认构造的r_policy和s_policy;如果参数列表包含 algo、pop 以及可选的 udi、r_pol 和 s_pol,那么构造函数将初始化一个包含指定算法、种群、UDI 和替换/选择策略的
island。如果未提供 r_pol 和/或 s_pol,替换/选择策略将默认构造。如果未提供 udi 参数,UDI 类型将根据平台、Python 版本以及提供的 algo 和 pop 参数进行启发式选择:如果algo和pop的问题至少提供了
basicthread_safety保证, 那么thread_island将被选为UDI类型;否则,如果当前平台是Windows或Python版本至少为3.4,则
mp_island将被选为UDI类型,否则将选择ipyparallel_island;
如果参数列表包含 algo、prob、size 以及可选的 udi、b、seed、r_pol 和 s_pol, 那么将从 prob、size、b 和 seed 构建一个
population,然后构建过程将按照上述详细方式进行 (即,使用 algo 和新创建的种群来初始化岛的算法和种群,如果未指定 UDI,将根据上述启发式方法选择, 替换/选择策略由 r_pol 和 s_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的深拷贝、
algorithm和population的构造函数抛出的任何异常,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()),如果 t 是
object并且 UDI 是一个 Python 对象(而不是一个 暴露的 C++ 岛),那么将返回对 UDI 的引用(这允许在不了解其类型的情况下提取 Python UDI),否则,
None将被返回。
示例
>>> 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
- Raises
未指定 – 由底层C++方法抛出的任何异常
- get_extra_info()#
岛屿的额外信息。
如果UDI提供了一个
get_extra_info()方法,那么这个方法将返回其get_extra_info()方法的输出。否则,将返回一个空字符串。在岛屿演化过程中调用此方法是安全的。
- Returns
关于UDI的额外信息
- Return type
- Raises
未指定 – 由UDI的
get_extra_info()方法抛出的任何异常
- get_name()#
岛屿的名称。
如果UDI提供了
get_name()方法,那么此方法将返回其get_name()方法的输出。 否则,将返回基于UDI类型的实现定义的名称。在岛屿演化过程中调用此方法是安全的。
- Returns
UDI的名称
- Return type
- Raises
未指定 – 由UDI的
get_name()方法抛出的任何异常
- get_population()#
获取人口。
在岛屿演化过程中调用此方法是安全的。
- Returns
岛上人口的一份副本
- Return type
- Raises
未指定 – 由底层C++方法抛出的任何异常
- is_(t)#
检查用户定义的岛屿类型。
如果
extract(t)返回None,则此方法返回False,否则返回True。
- 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将始终返回idle或idle_error。- Returns
一个标志,指示岛上异步操作的当前状态
- Return type
- wait()#
此方法将阻塞,直到通过
evolve()排队的所有进化任务完成。 通过wait_check()可以重新抛出排队任务抛出的异常:它们不会被此方法重新抛出。此外,与wait_check()相反,此方法不会重置岛屿的状态:在调用wait()之后,status将始终返回idle或idle_error的evolve_status。
- wait_check()#
阻塞直到进化结束并重新抛出第一个存储的异常。
如果在最后一次调用
wait_check()之后入队的任务抛出了异常,该方法将重新抛出该异常。如果在最后一次调用wait_check()之后有多个任务抛出了异常,该方法将重新抛出第一个抛出异常的任务所引发的异常,而忽略其他所有抛出异常的任务的异常。请注意,
wait_check()会重置岛屿的状态:在调用wait_check()之后,status将始终返回idle的evolve_status。- Raises
未指定 – 由进化任务或底层C++方法抛出的任何异常