拓扑结构#

class pygmo.topology(udt=unconnected())#

拓扑结构。

在pagmo的术语中,拓扑是一个表示islands之间连接的对象,这些连接位于一个archipelago中。本质上,拓扑是一个加权有向图,其中

  • 这些顶点(或节点)是岛屿,

  • 在优化过程中(通过个体的迁移),(或)是岛屿之间的定向连接,信息通过这些连接流动。

  • 边的权重(其数值范围为\([0.,1.]\))表示迁移概率。

遵循与问题algorithm等相同的模式,topology用户定义的拓扑(简称UDT)提供了一个通用接口。UDT是提供一组特定方法的类,这些方法描述了拓扑的属性(并允许与之交互)。一旦定义并实例化,UDT就可以用来构造此类的实例,topology,它为拓扑提供了一个通用接口,供archipelago使用。

topology中,图中的顶点通过从零开始的唯一整数索引来标识。这个整数索引对应于archipelagoisland的索引。

每个UDT必须至少实现以下方法:

def get_connections(self, n):
  ...
def push_back(self):
  ...

get_connections() 方法以顶点索引 n 作为输入,预计返回一对数组类型的值,分别包含:

  • 连接到n的顶点的索引(即存在指向n的有向边的顶点列表),

  • 连接顶点到n的边的权重(即迁移概率)。

push_back() 方法预计会向拓扑结构中添加一个新的顶点,为其分配下一个可用的索引,并建立与其他顶点的连接。push_back() 方法在向群岛中插入一个新岛屿时由 pygmo.archipelago.push_back() 调用,其目的是允许逐步构建拓扑结构。也就是说,在最初为空的拓扑结构上调用 Npush_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()),

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

  • 否则,None 将被返回。

Parameters

t (type) – 要提取的用户定义拓扑的类型

Returns

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

Raises

TypeError – 如果 t 不是一个 type

示例

>>> 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

str

Raises

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

get_name()#

拓扑结构的名称。

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

Returns

拓扑结构的名称

Return type

str

is_(t)#

检查用户定义的拓扑类型。

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

Parameters

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

Returns

UDT 是否为 t 类型

Return type

bool

Raises

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

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

networkx.DiGraph

Raises