批量适应度评估器#
- class pygmo.bfe(udbfe=default_bfe())#
批量适应度评估器。
该类实现了批量模式下决策向量的评估。也就是说,虽然
pygmo.problem提供了通过pygmo.problem.fitness()方法评估单个决策向量的手段,但bfe(批量适应度评估器的缩写)使得problem能够评估一组(或批量)决策向量的适应度,可能以并行/向量化的方式进行。与
pygmo.problem.batch_fitness()方法一起,bfe是pagmo提供的一种机制, 用于在比archipelago和island类更细的级别上实现并行性。 然而,虽然pygmo.problem.batch_fitness()方法必须在每个UDP基础上实现,bfe为任何问题提供了通用的批量适应度评估能力, 因此它也可以用于未实现pygmo.problem.batch_fitness()方法的UDP。与
问题、algorithm以及许多其他pagmo类一样,bfe是一个通用容器,它在内部存储了一个用户定义的批量适应度评估器(简称UDBFE),该评估器实际上以批量模式实现适应度评估。用户可以自由选择使用pagmo提供的评估器之一,或者编写自己的UDBFE。每个UDBFE必须是一个可调用的(即一个函数或一个带有调用运算符的类),其签名等同于
def __call__(self, prob, dvs): ...
UDBFEs 接收一个
problem和一批存储在类似数组对象中的决策向量作为输入,并返回一个包含与输入决策向量批次对应的适应度向量的NumPy数组(由输入问题评估并连续存储)。UDBFEs 还可以实现以下(可选的)方法:
def get_name(self): ... def get_extra_info(self): ...
有关UDBFE中可选方法如何被
bfe使用的详细信息,请参阅本类中相应方法的文档。这个类是C++类
pagmo::bfe的Python对应类。- Parameters
udbfe – 用户定义的批量适应度评估器,可以是C++或Python
- Raises
NotImplementedError – 如果 udbfe 没有实现上述详细说明的强制方法
未指定 – 在构造过程中调用的UDBFE方法抛出的任何异常,UDBFE的深拷贝,底层C++类的构造函数,或C++和Python之间的交互失败(例如,类型转换错误,函数签名不匹配等)
- __call__(prob, dvs)#
调用操作符。
调用操作符将调用内部的UDBFE实例,以批处理模式使用输入的
problem或UDP prob来评估存储在dvs中的决策向量,并返回相应的适应度向量。输入决策向量必须连续存储在dvs中:对于维度为\(n\)的问题,dvs中的第一个决策向量占据索引范围\(\left[0, n\right)\),第二个决策向量占据范围\(\left[n, 2n\right)\),依此类推。同样,输出适应度向量必须在返回值中连续布局:对于适应度维度为\(f\)的问题,第一个适应度向量将占据索引范围\(\left[0, f\right)\),第二个适应度向量将占据范围\(\left[f, 2f\right)\),依此类推。
此函数将对dvs和返回值执行各种健全性检查。
- Parameters
prob (
problem或 UDP) – 输入问题dvs (数组类对象) – 将在批处理模式下评估的输入决策向量
- Returns
对应于dvs中输入决策向量的适应度向量
- Return type
一维NumPy浮点数数组
- Raises
ValueError – 如果 dvs 或 UDBFE 生成的返回值与输入问题 prob 不兼容
未指定 – 由UDBFE调用引发的任何异常,或由C++和Python之间的交互失败引发的异常(例如,类型转换错误、函数签名不匹配等)
- __init__()#
- __repr__()#
返回 repr(self)。
- extract(t)#
提取用户定义的批量适应度评估器(bfe)。
此方法允许提取存储在此
bfe实例中的用户定义的bfe(UDBFE)的引用。此函数的行为取决于t的值(必须是一个type)以及内部UDBFE的类型:如果UDBFE的类型是t,那么将返回对UDBFE的引用 (这反映了相应的C++方法的行为
pagmo::bfe::extract()),如果 t 是
object并且 UDBFE 是一个 Python 对象(而不是一个 暴露的C++ bfe),那么将返回对 UDBFE 的引用(这允许在不了解其类型的情况下提取 Python UDBFE),否则,
None将被返回。
示例
>>> import pygmo as pg >>> a1 = pg.bfe(pg.thread_bfe()) >>> a1.extract(pg.thread_bfe) <pygmo.core.thread_bfe at 0x7f8e4792b670> >>> a1.extract(pg.member_bfe) is None True >>> def custom_bfe(p, dvs): pass >>> a2 = pg.bfe(custom_bfe) >>> a2.extract(object) <__main__.custom_bfe at 0x7f8e478c04e0> >>> a2.extract(custom_bfe) <__main__.custom_bfe at 0x7f8e478c04e0> >>> a2.extract(pg.thread_bfe) is None True
- get_extra_info()#
Bfe的额外信息。
如果UDBFE提供了一个
get_extra_info()方法,那么这个方法将返回其get_extra_info()方法的输出。否则,将返回一个空字符串。- Returns
关于UDBFE的额外信息
- Return type
- Raises
未指定 – 由UDBFE的
get_extra_info()方法抛出的任何异常
- get_name()#
Bfe的名称。
如果UDBFE提供了
get_name()方法,那么此方法将返回其get_name()方法的输出。 否则,将返回基于UDBFE类型的实现定义的名称。- Returns
bfe的名称
- Return type
- get_thread_safety()#
Bfe的线程安全级别。
此方法将返回一个枚举值
pygmo.thread_safety,该值指示 UDBFE 的线程安全级别。与 C++ 不同,在 Python 中无法在 UDBFE 中重新实现此方法。也就是说,对于 C++ 的 UDBFE,返回值将是 UDBFE 的get_thread_safety()方法返回的值。对于 Python 的 UDBFE,返回值将无条件为none。- Returns
UDBFE的线程安全级别
- Return type
一个值为
pygmo.thread_safety