拓扑结构#
- class pygmo.topology(udt=unconnected())#
拓扑结构。
在pagmo的术语中,拓扑是一个表示
islands之间连接的对象,这些连接位于一个archipelago中。本质上,拓扑是一个加权有向图,其中这些顶点(或节点)是岛屿,
在优化过程中(通过个体的迁移),边(或弧)是岛屿之间的定向连接,信息通过这些连接流动。
边的权重(其数值范围为\([0.,1.]\))表示迁移概率。
遵循与
问题、algorithm等相同的模式,topology为用户定义的拓扑(简称UDT)提供了一个通用接口。UDT是提供一组特定方法的类,这些方法描述了拓扑的属性(并允许与之交互)。一旦定义并实例化,UDT就可以用来构造此类的实例,topology,它为拓扑提供了一个通用接口,供archipelago使用。在
topology中,图中的顶点通过从零开始的唯一整数索引来标识。这个整数索引对应于archipelago中island的索引。每个UDT必须至少实现以下方法:
def get_connections(self, n): ... def push_back(self): ...
get_connections()方法以顶点索引n作为输入,预计返回一对数组类型的值,分别包含:连接到
n的顶点的索引(即存在指向n的有向边的顶点列表),连接顶点到
n的边的权重(即迁移概率)。
push_back()方法预计会向拓扑结构中添加一个新的顶点,为其分配下一个可用的索引,并建立与其他顶点的连接。push_back()方法在向群岛中插入一个新岛屿时由pygmo.archipelago.push_back()调用,其目的是允许逐步构建拓扑结构。也就是说,在最初为空的拓扑结构上调用N次push_back()后,拓扑结构应包含N个顶点和任意数量的边(取决于拓扑结构的具体情况)。可以在UDT中实现其他可选方法:
def get_name(self): ... def get_extra_info(self): ... def to_networkx(self): ...
有关UDT中可选方法如何被
topology使用的详细信息,请参阅本类中相应方法的文档。拓扑结构用于涉及群岛迁移的异步操作中,因此它们需要提供一定程度的线程安全性。具体来说,UDT的
get_connections()方法可能会与UDT接口的任何其他方法同时调用。用户定义的拓扑结构的作者需要确保满足这一安全要求。这个类是C++类
pagmo::topology的Python对应类。- Parameters
udt – 用户定义的拓扑,可以是C++或Python
- Raises
NotImplementedError – 如果 udt 没有实现上述的强制方法
未指定 – 在构造过程中调用的UDT方法抛出的任何异常,UDT的深拷贝,底层C++类的构造函数,或C++和Python之间的交互失败(例如,类型转换错误,函数签名不匹配等)
- __init__()#
- __repr__()#
返回 repr(self)。
- extract(t)#
提取用户定义的拓扑结构。
此方法允许提取存储在此
topology实例中的用户定义拓扑(UDT)的引用。此函数的行为取决于t的值(必须是一个type)以及内部UDT的类型:如果UDT的类型是t,那么将返回对UDT的引用 (这反映了相应的C++方法的行为
pagmo::topology::extract()),如果 t 是
object并且 UDT 是一个 Python 对象(而不是一个 暴露的 C++ 拓扑),那么将返回对 UDT 的引用(这允许在不了解其类型的情况下提取 Python UDT),否则,
None将被返回。
示例
>>> import pygmo as pg >>> t1 = pg.topology(pg.ring()) >>> t1.extract(pg.ring) <pygmo.core.ring at 0x7f8e4792b670> >>> t1.extract(pg.unconnected) is None True >>> class topo: ... def get_connections(self, n): ... return [[], []] ... def push_back(self): ... return >>> t2 = pg.topology(topo()) >>> t2.extract(object) <__main__.topo at 0x7f8e478c04e0> >>> t2.extract(topo) <__main__.topo at 0x7f8e478c04e0> >>> t2.extract(pg.unconnected) is None True
- get_connections(n)#
获取与顶点连接的边。
此方法将调用UDT的
get_connections()方法,该方法预期返回一对数组类对象,分别包含:连接到n的顶点的索引(即存在指向n的有向边的顶点列表),
连接顶点到n的边的权重(即迁移概率)。
此方法还将对UDT的
get_connections()方法的输出进行完整性检查。- Parameters
n (
int) – 将返回其传入连接详细信息的顶点的索引- Returns
一对描述n的传入连接的数组
- Return type
一对一维NumPy数组
- Raises
RuntimeError – 如果由pythonic UDT返回的对象不可迭代,或者它是一个元素数量不正好为2的可迭代对象,或者如果UDT的
get_connections()方法的调用引发异常ValueError – 如果返回的数组大小不同,或者第二个数组的任何元素不在\([0.,1.]\)范围内
未指定 – 任何由C++和Python之间的交互失败引发的异常(例如,类型转换错误、函数签名不匹配等)
- get_extra_info()#
拓扑的额外信息。
如果UDT提供了
get_extra_info()方法,则此方法将返回其get_extra_info()方法的输出。否则,将返回一个空字符串。- Returns
关于UDT的额外信息
- Return type
- Raises
未指定 – 由UDT的
get_extra_info()方法抛出的任何异常
- get_name()#
拓扑结构的名称。
如果UDT提供了
get_name()方法,则此方法将返回其get_name()方法的输出。 否则,将返回基于UDT类型的实现定义的名称。- Returns
拓扑结构的名称
- Return type
- is_(t)#
检查用户定义的拓扑类型。
如果
extract(t)返回None,则此方法返回False,否则返回True。
- push_back(n=1)#
添加顶点。
此方法将调用UDT的
push_back()方法n次。UDT的push_back()方法预计会向拓扑中添加一个新顶点,为其分配下一个可用的索引,并建立与其他顶点的连接。- Parameters
n (
int) – UDT的push_back()方法将被调用的次数- Raises
OverflowError – 如果 n 为负数或过大
未指定 – 由UDT的
push_back()方法抛出的任何异常
- to_networkx()#
版本2.15中的新功能。
转换为NetworkX。
如果UDT提供了
to_networkx()方法,那么此方法将调用它并返回其输出。否则,将引发错误。此方法旨在将拓扑的当前状态表示导出为NetworkX图对象。返回的对象必须是一个
networkx.DiGraph,其中边具有表示为浮点值的weight属性。请注意,此方法将去除由UDT返回的图中除
weight之外的所有节点属性和边属性。它还将重新定义节点为顺序编号(即,如果由UDT返回的NetworkX图有三个编号为0、1和5的节点,则此方法返回的图将有编号为0、1和2的节点)。- Returns
UDT的图形表示
- Return type
- Raises
NotImplementedError – 如果UDT没有提供
to_networkx()方法TypeError – 如果UDT返回的对象不是
networkx.DiGraphValueError – 如果返回的图的边不都具有
weight属性未指定 – 由UDT的
to_networkx()方法抛出的任何异常