Hungarian algorithm匈 牙 利 算 法

代码流程

例如,n个人干n项工作的指派问题,如何让总的开销最小。
首先知道其代价矩阵:
在这里插入图片描述

from scipy.optimize import linear_sum_assignment
 
cost =np.array([[4,1,3],[2,0,5],[3,2,2]])
row_ind,col_ind=linear_sum_assignment(cost)
print(row_ind)#开销矩阵对应的行索引
print(col_ind)#对应行索引的最优指派的列索引
print(cost[row_ind,col_ind])#提取每个行索引的最优指派列索引所在的元素,形成数组
print(cost[row_ind,col_ind].sum())#数组求和

==============
[0 1 2] # 第0个人,第1个人,第2个人。
[1 0 2]# 第1件事, 第0件事, 第2件事。(与上面对应)
#第0个人干第1项工作,第1个人干第0项工作,第2个人干第2项工作。代价最小。
计算工作量:[1 2 2]=5

速算流程

步骤:

正常情况下求指派问题最小时

将指派问题转化成矩阵,不足的补0.
Hungarian algorithm匈 牙 利 算 法_第1张图片
如果○的个数少于n,则进行这一步:
Hungarian algorithm匈 牙 利 算 法_第2张图片
Hungarian algorithm匈 牙 利 算 法_第3张图片
返回步骤(2),直到得到n个0元素,即得到最优解。

求指派问题最大时

Hungarian algorithm匈 牙 利 算 法_第4张图片

人数与工作数不等的指派问题

Hungarian algorithm匈 牙 利 算 法_第5张图片

一个人可做几件事的指派问题

Hungarian algorithm匈 牙 利 算 法_第6张图片
Hungarian algorithm匈 牙 利 算 法_第7张图片

你可能感兴趣的:(mathmatic,矩阵,算法,线性代数)