scipy.optimize.
linear_sum_assignment#
- scipy.optimize.linear_sum_assignment()#
求解线性求和分配问题。
- 参数:
- cost_matrixarray
双分图的成本矩阵。
- maximize布尔值 (默认: False)
如果为真,则计算最大权重匹配。
- 返回:
- row_ind, col_indarray
一个行索引数组和一个对应的列索引数组,给出最优分配。分配的成本可以计算为
cost_matrix[row_ind, col_ind].sum()。行索引将排序;对于方形成本矩阵,它们将等于numpy.arange(cost_matrix.shape[0])。
附注
线性求和分配问题 [1] 也被称为双分图中的最小权重匹配。问题实例由一个矩阵 C 描述,其中每个 C[i,j] 是匹配第一个分部集合(“工人”)的顶点 i 和第二个集合(“工作”)的顶点 j 的成本。目标是找到以最小成本分配工人到工作的完整分配。
正式地,设 X 是一个布尔矩阵,其中 \(X[i,j] = 1\) 当且仅当第 i 行分配到第 j 列时。最优分配的成本为
\[\min \sum_i \sum_j C_{i,j} X_{i,j}\]其中,在矩阵 X 是方形的情况下,每一行被分配到恰好一列,每一列被分配到恰好一行。
此函数还可以解决分配问题的经典推广,其中成本矩阵是矩形的。如果它有比列更多的行,则并非每一行都需要分配到一列,反之亦然。
此实现是修改后的 Jonker-Volgenant 算法,没有初始化,如参考 [2] 中所述。
0.17.0 版本中添加。
参考文献
[2]DF Crouse. On implementing 2D rectangular assignment algorithms. IEEE Transactions on Aerospace and Electronic Systems, 52(4):1679-1696, August 2016, DOI:10.1109/TAES.2016.140952
示例
>>> import numpy as np >>> cost = np.array([[4, 1, 3], [2, 0, 5], [3, 2, 2]]) >>> from scipy.optimize import linear_sum_assignment >>> row_ind, col_ind = linear_sum_assignment(cost) >>> col_ind array([1, 0, 2]) >>> cost[row_ind, col_ind].sum() 5