k_edge_augmentation#
- k_edge_augmentation(G, k, avail=None, weight=None, partial=False)[source]#
找到使图 G 达到 k 边连通的边集。
向 G 添加来自增强的边后,除非移除 k 条或更多边,否则 G 将无法被断开。此函数使用最有效的可用函数(取决于 k 的值以及问题是否带权或无权)来搜索可用边的一个最小权子集,该子集能够使 G 达到 k 边连通。通常,寻找 k 边增强是 NP 难问题,因此不保证解是最小的。此外,k 边增强可能不存在。
- 参数:
- GNetworkX 图
一个无向图。
- k整数
所需的边连通性
- avail字典或由 2 或 3 个元组组成的集合
可用于增强的可用边。
如果未指定,则 G 的补图中的所有边均可用。否则,每个项都是一条可用边(带有可选权重)。
在无权情况下,每个项都是一条边
(u, v)
。在带权情况下,每个项是一个 3 元组
(u, v, d)
或一个字典,其中项为(u, v): d
。第三项d
可以是一个字典或一个实数。如果d
是一个字典,则d[weight]
对应于权重。- weight字符串
如果
avail
是由 3 元组组成的集合,且每个元组中的第三项是一个字典,则使用此键来查找权重。- partial布尔值
如果 partial 为 True 且不存在可行的 k 边增强,则会生成一个部分 k 边增强。将部分增强中的边添加到 G 中,可以最小化 k 边连通分量的数量,并最大化这些分量之间的边连通性。详细信息请参阅
partial_k_edge_augmentation()
。
- 产生:
- edge元组
添加到 G 后,将使 G 达到 k 边连通的边。如果 partial 为 False,并且无法做到这一点,则会引发错误。否则,生成的边会形成一个部分增强,它会使 G 中可能的部分达到 k 边连通,并最大化剩余部分之间的连通性。
- 引发:
- NetworkXUnfeasible
如果 partial 为 False 且不存在 k 边增强。
- NetworkXNotImplemented
如果输入图是有向图或多重图。
- ValueError
如果 k 小于 1
说明
当 k=1 时,此函数返回最优解。
当 k=2 且
avail
为 None 时,此函数返回最优解。否则当 k=2 时,此函数返回最优解的 2 近似解。- 对于 k>3,此问题是 NP 难问题,本函数使用随机算法
生成一个可行解,但不保证解的权重。
示例
>>> # Unweighted cases >>> G = nx.path_graph((1, 2, 3, 4)) >>> G.add_node(5) >>> sorted(nx.k_edge_augmentation(G, k=1)) [(1, 5)] >>> sorted(nx.k_edge_augmentation(G, k=2)) [(1, 5), (5, 4)] >>> sorted(nx.k_edge_augmentation(G, k=3)) [(1, 4), (1, 5), (2, 5), (3, 5), (4, 5)] >>> complement = list(nx.k_edge_augmentation(G, k=5, partial=True)) >>> G.add_edges_from(complement) >>> nx.edge_connectivity(G) 4
>>> # Weighted cases >>> G = nx.path_graph((1, 2, 3, 4)) >>> G.add_node(5) >>> # avail can be a tuple with a dict >>> avail = [(1, 5, {"weight": 11}), (2, 5, {"weight": 10})] >>> sorted(nx.k_edge_augmentation(G, k=1, avail=avail, weight="weight")) [(2, 5)] >>> # or avail can be a 3-tuple with a real number >>> avail = [(1, 5, 11), (2, 5, 10), (4, 3, 1), (4, 5, 51)] >>> sorted(nx.k_edge_augmentation(G, k=2, avail=avail)) [(1, 5), (2, 5), (4, 5)] >>> # or avail can be a dict >>> avail = {(1, 5): 11, (2, 5): 10, (4, 3): 1, (4, 5): 51} >>> sorted(nx.k_edge_augmentation(G, k=2, avail=avail)) [(1, 5), (2, 5), (4, 5)] >>> # If augmentation is infeasible, then a partial solution can be found >>> avail = {(1, 5): 11} >>> sorted(nx.k_edge_augmentation(G, k=2, avail=avail, partial=True)) [(1, 5)]