本文简要介绍 python 语言中 scipy.sparse.csgraph.maximum_bipartite_matching
的用法。
用法:
scipy.sparse.csgraph.maximum_bipartite_matching(graph, perm_type='row')#
返回一个二分图的匹配,其基数至少是该图的任何给定匹配的基数。
- graph: 稀疏矩阵
CSR 格式的稀疏输入,其行代表图形的一个分区,其列代表另一个分区。两个顶点之间的边由矩阵中存在于其稀疏表示中的相应条目指示。
- perm_type: 字符串,{‘row’, ‘column’}
哪个分区返回匹配项:如果
'row'
,该函数生成一个数组,其长度是输入中的列数,其 'th 元素是与 'th 匹配的行柱子。相反,如果perm_type
是'column'
,则返回与每一行匹配的列。
- perm: ndarray
两个分区之一中的顶点匹配。结果中不匹配的顶点由
-1
表示。
参数 ::
返回 ::
注意:
此函数实现Hopcroft-Karp 算法 [1]。它的时间复杂度为 ,其空间复杂度与行数成线性关系。实际上,行和列之间的这种不对称意味着如果输入包含的列多于行,则转置输入会更有效。
根据 Konig 定理,匹配的基数也是图的最小顶点覆盖中出现的顶点数。
请注意,如果稀疏表示包含显式零,这些仍然算作边。
SciPy 1.4.0 中更改了实现,以允许匹配一般二分图,以前的版本会假设存在完美匹配。因此,针对 1.4.0 编写的代码不一定适用于旧版本。
如果可能存在多个有效解决方案,则输出可能会因 SciPy 和 Python 版本而异。
参考:
[1]约翰 E. 霍普克罗夫特和理查德 M. 卡普。 “二部图中最大匹配的 n^{5 /2} 算法”,载于:SIAM Journal of Computing 2.4 (1973),第 225-231 页。 DOI:10.1137/0202019
例子:
>>> from scipy.sparse import csr_matrix >>> from scipy.sparse.csgraph import maximum_bipartite_matching
作为一个简单的例子,考虑一个二分图,其中分区分别包含 2 个和 3 个元素。假设一个分区包含标记为 0 和 1 的顶点,而另一个分区包含标记为 A、B 和 C 的顶点。假设有连接 0 和 C、1 和 A、1 和 B 的边。那么这个图将是由以下稀疏矩阵表示:
>>> graph = csr_matrix([[0, 0, 1], [1, 1, 0]])
在这里,1 可以是任何东西,只要它们最终被存储为稀疏矩阵中的元素。我们现在可以计算最大匹配如下:
>>> print(maximum_bipartite_matching(graph, perm_type='column')) [2 0] >>> print(maximum_bipartite_matching(graph, perm_type='row')) [ 1 -1 0]
第一个输出告诉我们 1 和 2 分别与 C 和 A 匹配,第二个输出告诉我们 A、B 和 C 分别与 1、nothing 和 0 匹配。
请注意,显式零仍会转换为边。这意味着表示上图的另一种方式是直接使用 CSR 结构,如下所示:
>>> data = [0, 0, 0] >>> indices = [2, 0, 1] >>> indptr = [0, 1, 3] >>> graph = csr_matrix((data, indices, indptr)) >>> print(maximum_bipartite_matching(graph, perm_type='column')) [2 0] >>> print(maximum_bipartite_matching(graph, perm_type='row')) [ 1 -1 0]
当一个或两个分区为空时,匹配也为空:
>>> graph = csr_matrix((2, 0)) >>> print(maximum_bipartite_matching(graph, perm_type='column')) [-1 -1] >>> print(maximum_bipartite_matching(graph, perm_type='row')) []
当输入矩阵是方阵,并且已知图承认完美匹配时,即具有图中每个顶点都属于匹配中的某个边的性质的匹配,则可以将输出视为行的排列 (或列)将输入矩阵变成一个具有所有对角元素都是非空的属性的矩阵:
>>> a = [[0, 1, 2, 0], [1, 0, 0, 1], [2, 0, 0, 3], [0, 1, 3, 0]] >>> graph = csr_matrix(a) >>> perm = maximum_bipartite_matching(graph, perm_type='row') >>> print(graph[perm].toarray()) [[1 0 0 1] [0 1 2 0] [0 1 3 0] [2 0 0 3]]
相关用法
- Python SciPy csgraph.maximum_flow用法及代码示例
- Python SciPy csgraph.min_weight_full_bipartite_matching用法及代码示例
- Python SciPy csgraph.minimum_spanning_tree用法及代码示例
- Python SciPy csgraph.csgraph_to_dense用法及代码示例
- Python SciPy csgraph.breadth_first_order用法及代码示例
- Python SciPy csgraph.connected_components用法及代码示例
- Python SciPy csgraph.dijkstra用法及代码示例
- Python SciPy csgraph.breadth_first_tree用法及代码示例
- Python SciPy csgraph.csgraph_from_dense用法及代码示例
- Python SciPy csgraph.floyd_warshall用法及代码示例
- Python SciPy csgraph.bellman_ford用法及代码示例
- Python SciPy csgraph.csgraph_to_masked用法及代码示例
- Python SciPy csgraph.csgraph_masked_from_dense用法及代码示例
- Python SciPy csgraph.shortest_path用法及代码示例
- Python SciPy csgraph.reconstruct_path用法及代码示例
- Python SciPy csgraph.johnson用法及代码示例
- Python SciPy csgraph.depth_first_order用法及代码示例
- Python SciPy csgraph.csgraph_from_masked用法及代码示例
- Python SciPy csgraph.construct_dist_matrix用法及代码示例
- Python SciPy csgraph.reverse_cuthill_mckee用法及代码示例
- Python SciPy csgraph.depth_first_tree用法及代码示例
- Python SciPy csgraph.laplacian用法及代码示例
- Python SciPy csgraph.structural_rank用法及代码示例
- Python SciPy csc_array.diagonal用法及代码示例
- Python SciPy csc_matrix.nonzero用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.sparse.csgraph.maximum_bipartite_matching。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。