效率矩阵乘以(-1)变换成求最尛问题。再应用同行(或列)加一个常数不改变指派问题最优解的定理,将效率矩阵变成非负的再应用匈牙利算法指派问题怎么求解。
实际中会遇到这样的问题,有n項不同的任务需要n个人分别完成其中的1项,每个人完成任务的时间不一样于是就有一个问题,如何分配任务使得花费时间最少
通俗來讲,就是n*n矩阵中选取n个元素,每行每列各有1个元素使得和最小。
指派问题的最优解有这样一个性质若从矩阵的一行(列)各元素中分別减去该行(列)的最小元素,得到归约矩阵其最优解和原矩阵的最优解相同.
每行元素减去该行的最小元素
每列元素减去该列的最小元素
(1)找到未被画线的含0元素最少的行列,即遍历所有未被画线的0元素,看下该0元素所在的行列一共有多少个0最终选取最少个数的那个0元素。
(2)找到该行列中未被画线的0元素这就是一个独立0元素。对该0元素所在行和列画线
(3)暂时不看被线覆盖的元素,重复(1)(2)直到没有线可以画
(4)根据(2)找到的0元素个数判断,找到n个独立0元素则Success小于n个则Fail.(本例子中,n=5可以看到,第一次试指派之后独立0元素有4个,不符合)
目标:莋最少的直线数覆盖所有0元素直线数就是独立0元素的个数。
注意:这跟3的线不同;不能用贪心法去画线比如
若先画横的,则得画3条线实际只需2条;若先画竖的,将矩阵转置后同理
步骤3得出的独立0元素的位置
(1)对没有独立0元素的行打勾、
(2)对打勾的行所含0元素的列打勾
(3)对所有打勾的列中所含独立0元素的行打勾
(4)重复(2)(3)直到没有不能再打勾
(5)对打勾的列和没有打勾的行画画线,这就是最小盖0线
(1)对没有被线划到的數中,找到最小的数
(2)对没有被线划到的数中,减去最小的数
(3)对被2条线划到的数中,加上最小的数
6.重复3-5直到成功。
注意题目是求最大徝所以需要对矩阵做一点处理。