【运筹学】指派问题、匈牙利法总结 ( 指派问题 | 克尼格定理 | 匈牙利法 | 行列出现 0 元素 | 试指派 | 打 √ | 直线覆盖 ) ★★★
文章目录
- 一、克尼格定理
- 二、匈牙利法引入
- 三、指派问题求解步骤
- 四、匈牙利法示例 1
- 1、第一步 : 使行列出现 000 元素示例
- 2、第二步 : 试指派操作示例 ( 方法一 :克尼格定理 )
- 3、打 √ ( 方法二 : 直线覆盖 )
- 4、直线覆盖 ( 方法二 : 直线覆盖 )
- 五、匈牙利法示例 2
- 1、第一步 : 变换系数矩阵 ( 每行每列都出现 0 元素 )
- 2、第二步 : 试指派 ( 找独立 0 元素 )
- 六、匈牙利法示例 3
- 1、使用匈牙利法求解下面的指派问题
- 2、第一步 : 变换系数矩阵 ( 每行每列都出现 0 元素 )
- 3、第二步 : 试指派 ( 找独立 0 元素 )
- 4、第二步 : 试指派 ( 打 √ )
- 5、第二步 : 试指派 ( 直线覆盖 )
- 6、第二步 : 试指派 ( 第二轮 )
一、克尼格定理
匈牙利法 主要用于解决指派问题 , 其主要依据是 克尼格定理 ;
指派问题 参考 【运筹学】整数规划 ( 整数规划求解方法 | 指派问题 ) 博客 ;
克尼格定理 :
分配问题 效率矩阵 [aij][a_{ij}][aij] 中 ,
每一行元素 中加上或减去一个常数 uiu_iui ,
每一列元素 中加上或减去一个常数 vjv_jvj ,
得到新的效率矩阵 [bij][b_{ij}][bij] ,
两个效率矩阵 [aij][a_{ij}][aij] 与 [bij][b_{ij}][bij] 分配问题的 最优解相同 ;
克尼格定理示例 : 指派问题 , 给 444 个人指派 444 个岗位 , 每个人在不同的岗位产生的利润不同 , 如何安排使得利润最高 ;
AAA | BBB | CCC | DDD | |
---|---|---|---|---|
甲 | 858585 | 929292 | 737373 | 909090 |
乙 | 959595 | 878787 | 787878 | 959595 |
丙 | 828282 | 838383 | 797979 | 909090 |
丁 | 868686 | 909090 | 808080 | 888888 |
给 甲 对应的行加上所有表格都加上 555 , 变为如下表格 ,
AAA | BBB | CCC | DDD | |
---|---|---|---|---|
甲 | 909090 | 979797 | 787878 | 959595 |
乙 | 959595 | 878787 | 787878 | 959595 |
丙 | 828282 | 838383 | 797979 | 909090 |
丁 | 868686 | 909090 | 808080 | 888888 |
甲 今天状态好 , 不管四个工作 , 哪个分配给 甲 , 其产生的利润都会增加 ;
最终计算出来的指派问题的最优解是不变的 ;
二、匈牙利法引入
给 甲乙丙丁 四人分配 ABCDABCDABCD 四项工作 , 每人做每项工作的耗时如下 , 如何指派问题使得耗时最小 ;
AAA | BBB | CCC | DDD | |
---|---|---|---|---|
甲 | 666 | 777 | 111111 | 222 |
乙 | 444 | 555 | 999 | 888 |
丙 | 333 | 111 | 101010 | 444 |
丁 | 555 | 999 | 888 | 222 |
分派任务时 , 给每个人分配其所用时间最小的工作 ,
- 给 甲 分配 DDD 任务 , 其只用 2 时间即可完成该任务 , 耗时最小 ;
- 给 乙 分配 AAA 任务 , 其只用 4 时间即可完成该任务 , 耗时最小 ;
- 给 丙 分配 BBB 任务 , 其只用 1 时间即可完成该任务 , 耗时最小 ;
- 给 丁 分配 CCC 任务 , ABDABDABD 任务已经分配给了其它人 , 只能给 丁 分配 CCC 任务 ;
如果 为每个人选择了耗时最小的任务 , 正好位于不同行 , 不同列 , 那么当前的指派 , 就是该问题的 最优解 ;
但是上述示例中 , 给 丁 分配任务时 , 合适的任务都分配给了甲乙丙 , 只能分配 CCC 任务 ;
这时就需要讨论给 丁 指派 CCC 任务是否是最优的 ;
这里就需要 引入 匈牙利法 解决上述问题 ;
三、指派问题求解步骤
指派问题求解步骤 :
1 . 使行列出现 000 元素 : 指派问题系数矩阵 (cij)(c_{ij})(cij) 变换为 (bij)(b_{ij})(bij) 系数矩阵 , 在 (bij)(b_{ij})(bij) 矩阵中 每行 每列 都出现 000 元素 ;
每行都出现 000 元素 : (cij)(c_{ij})(cij) 系数矩阵中 , 每行都 减去该行最小元素 ;
每列都出现 000 元素 : 在上述变换的基础上 , 每列元素中 减去该列最小元素 ;
注意必须先变行 , 然后再变列 , 行列不能同时进行改变 ; 否则矩阵中会出现负数 , 该矩阵中 不能出现负数 ;
2 . 试指派 : 进行尝试指派 , 寻求最优解 ;
在 (bij)(b_{ij})(bij) 系数矩阵 中找到尽可能多的 独立 000 元素 , 如果能找到 nnn 个独立 000 元素 , 以这 nnn 个独立 000 元素对应解矩阵 (xij)(x_{ij})(xij) 中的元素为 111 , 其余元素为 000 , 这样就得到最优解 ;
四、匈牙利法示例 1
1、第一步 : 使行列出现 000 元素示例
上一篇博客 【运筹学】匈牙利法 ( 克尼格定理 | 匈牙利法引入 ) 中的指派问题 :
AAA | BBB | CCC | DDD | |
---|---|---|---|---|
甲 | 666 | 777 | 111111 | 222 |
乙 | 444 | 555 | 999 | 888 |
丙 | 333 | 111 | 101010 | 444 |
丁 | 555 | 999 | 888 | 222 |
系数矩阵 (cij)=[671124598311045982](c_{ij}) =\begin{bmatrix} & 6 & 7 & 11 & 2 & \\\\ & 4 & 5 & 9 & 8 & \\\\ & 3 & 1 & 10 & 4 & \\\\ & 5 & 9 & 8 & 2 & \\ \end{bmatrix}(cij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡643575191191082842⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
使每行都出现 000 元素 : (cij)(c_{ij})(cij) 系数矩阵中 , 每行都 减去该行最小元素 ;
第 111 行减去 222 ,
第 222 行减去 444 ,
第 333 行减去 111 ,
第 444 行减去 222 ,
得到新的系数矩阵 系数矩阵 [4590015420933760]\begin{bmatrix} & 4 & 5 & 9 & 0 & \\\\ & 0 & 1 & 5 & 4 & \\\\ & 2 & 0 & 9 & 3 & \\\\ & 3 & 7 & 6 & 0 & \\ \end{bmatrix}⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡4023510795960430⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
每列都出现 000 元素 : 在上述变换的基础上 , 每列元素中 减去该列最小元素 ; 观察矩阵后发现 , 只有第三列没有 000 元素 , 这里将第 333 列 , 都减去最小值 555 , 得到如下矩阵 :
(bij)=[4540010420433710](b_{ij}) = \begin{bmatrix} & 4 & 5 & 4 & 0 & \\\\ & 0 & 1 & 0 & 4 & \\\\ & 2 & 0 & 4 & 3 & \\\\ & 3 & 7 & 1 & 0 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡4023510740410430⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
这样就得到每行每列都有 000 元素的矩阵 ;
2、第二步 : 试指派操作示例 ( 方法一 :克尼格定理 )
在 【运筹学】匈牙利法 ( 匈牙利法步骤 | 第一步 : 使行列出现 0 元素示例 ) 博客示例基础上 , 已经得到了行列都有 000 元素的系数矩阵 :
(bij)=[4540010420433710](b_{ij}) = \begin{bmatrix} & 4 & 5 & 4 & 0 & \\\\ & 0 & 1 & 0 & 4 & \\\\ & 2 & 0 & 4 & 3 & \\\\ & 3 & 7 & 1 & 0 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡4023510740410430⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
下面进行试指派操作 , 试指派就是找独立 000 元素 , 独立 000 元素就是位于不同行不同列的 000 元素 ;
第 111 行只有 111 个 000 , 选第 444 个 ; 每行每列只能选择 111 个 , 第 444 行第 444 列的 000 元素就不能再用了 ;
第 333 行只有 111 个 000 , 选第 222 个 ;
第 222 行有 222 个 000 , 都可以选择 , 这里选择第 111 个 ;
最终试指派结果 :
上面只找到了 333 个独立的 000 元素 , 应该找出 444 个独立 000 元素 ;
调整上述系数矩阵 (bij)(b_{ij})(bij) , 每行每列同时增加或减去一个数 , 且不能出现负数 ;
第 444 行都减去 111 , 得到如下矩阵 :
(bij)=[454001042043260−1](b_{ij}) = \begin{bmatrix} & 4 & 5 & 4 & 0 & \\\\ & 0 & 1 & 0 & 4 & \\\\ & 2 & 0 & 4 & 3 & \\\\ & 2 & 6 & 0 & -1 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡402251064040043−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
第 444 行第 444 列出现了 −1-1−1 , 这里在将第 444 列都加上 111 , 得到如下矩阵 :
(bij)=[4541010520442600](b_{ij}) = \begin{bmatrix} & 4 & 5 & 4 & 1 & \\\\ & 0 & 1 & 0 & 5 & \\\\ & 2 & 0 & 4 & 4 & \\\\ & 2 & 6 & 0 & 0 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡4022510640401540⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
第一行此时没有独立的 000 了 , 第一行再减去 111 , 得到如下矩阵 :
(bij)=[3430010520442600](b_{ij}) = \begin{bmatrix} & 3 & 4 & 3 & 0 & \\\\ & 0 & 1 & 0 & 5 & \\\\ & 2 & 0 & 4 & 4 & \\\\ & 2 & 6 & 0 & 0 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡3022410630400540⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
再次进行试指派 , 找到了如下独立 000 元素 ;
在上述没有找到 444 个独立 000 元素后 , 由于在第 444 行没有找到 000 元素 , 开始从第 444 行进行调整 ,
调整时将非 000 的最小值转为 000 , 这样本行就多出一个 000 , 以及负数 , 负数有需要再对应列加上一个值 , 保持矩阵中所有的值都是非负的 ;
3、打 √ ( 方法二 : 直线覆盖 )
分析 【运筹学】匈牙利法 ( 匈牙利法步骤 | 第二步 : 试指派操作示例 ) 博客中试指派调整矩阵的原理 ;
下面的矩阵是完成第一步操作后 , 得到的行列都有 000 的元素的系数矩阵 (bij)(b_{ij})(bij) :
(bij)=[4540010420433710](b_{ij}) = \begin{bmatrix} & 4 & 5 & 4 & 0 & \\\\ & 0 & 1 & 0 & 4 & \\\\ & 2 & 0 & 4 & 3 & \\\\ & 3 & 7 & 1 & 0 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡4023510740410430⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
试指派后的结果如下 :
定位一个没有独立 000 元素的行 : 先对没有 000 元素的行打钩 √ : 第 444 行没有独立 000 元素 , 第 444 行打 √ ;
讨论第 444 行 : 第 444 行没有独立的 000 元素 , 但是有废弃的 000 元素 , 因为在第一步已经保证了每行每列都有 000 元素 ;
在第 444 行 000 元素所在列 , 即第 444 列 , 打 √ ;
讨论第 444 列 : 上述打钩的列中 , 查看是否有 独立的 000 元素 , 如果有对应的行就打 √ ;
第 111 行有独立的 000 元素 , 在第 111 行位置打 √ ;
讨论第 111 行 : 查看第 111 行是否有废弃的 000 元素 , 如果有就继续打 √ , 如果没有就停止 ;
第 111 行没有废弃的 000 元素 , 直接停止 ;
讨论 行 的时候讨论的是 废弃的 000 元素 ,
讨论 列 的时候讨论的是 独立的 000 元素 ;
4、直线覆盖 ( 方法二 : 直线覆盖 )
打 √ 完毕 , 开始讨论覆盖 ,
没有 打 √ 的行划线 , 打 √ 的列划线 , 三条线就将所有的 000 元素覆盖了 ,
在没有被覆盖的元素中 , 找最小的元素 111 , 将没有覆盖的行 −1-1−1 , 覆盖的列 +1+1+1 ; 这里的情况是没有覆盖的行 ;
第 1,41,41,4 行 −1-1−1 ,
第 444 列 +1+1+1 ;
最终得到如下矩阵 :
(bij)=[3430010520442600](b_{ij}) = \begin{bmatrix} & 3 & 4 & 3 & 0 & \\\\ & 0 & 1 & 0 & 5 & \\\\ & 2 & 0 & 4 & 4 & \\\\ & 2 & 6 & 0 & 0 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡3022410630400540⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
五、匈牙利法示例 2
四人分别完成四项工作所用时间 :
AAA | BBB | CCC | DDD | |
---|---|---|---|---|
甲 | 222 | 151515 | 131313 | 444 |
乙 | 101010 | 444 | 141414 | 151515 |
丙 | 999 | 141414 | 161616 | 131313 |
丁 | 777 | 888 | 111111 | 999 |
1、第一步 : 变换系数矩阵 ( 每行每列都出现 0 元素 )
先写出指派问题的系数矩阵 :
(cij)=[2151341041415914161378119](c_{ij}) =\begin{bmatrix} & 2 & 15 & 13 & 4 & \\\\ & 10 & 4 & 14 & 15 & \\\\ & 9 & 14 & 16 & 13 & \\\\ & 7 & 8 & 11 & 9 & \\ \end{bmatrix}(cij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡2109715414813141611415139⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
使每行都出现 000 元素 : (cij)(c_{ij})(cij) 系数矩阵中 , 每行都 减去该行最小元素 ;
- 第 111 行减去最小值 222 ;
- 第 222 行减去最小值 444 ;
- 第 333 行减去最小值 999 ;
- 第 444 行减去最小值 777 ;
(cij′)=[01311260101105740142](c_{ij}') =\begin{bmatrix} & 0 & 13 & 11 & 2 & \\\\ & 6 & 0 & 10 & 11 & \\\\ & 0 & 5 & 7 & 4 & \\\\ & 0 & 1 & 4 & 2 & \\ \end{bmatrix}(cij′)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡06001305111107421142⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
此时发现有两列 , 第 444 列 , 第 555 列 , 没有 000 元素 , 这两列每列都减去最小值 :
- 第 333 列减去最小值 444 ;
- 第 444 列减去最小值 222 ;
最终得到行列都有 000 元素的系数矩阵 (bij)(b_{ij})(bij) :
(bij)=[01370606905320100](b_{ij}) =\begin{bmatrix} & 0 & 13 & 7 & 0 & \\\\ & 6 & 0 & 6 & 9 & \\\\ & 0 & 5 & 3 & 2 & \\\\ & 0 & 1 & 0 & 0 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡06001305176300920⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
2、第二步 : 试指派 ( 找独立 0 元素 )
基于上一步的行列都有 000 元素的系数矩阵 ,
(bij)=[01370606905320100](b_{ij}) =\begin{bmatrix} & 0 & 13 & 7 & 0 & \\\\ & 6 & 0 & 6 & 9 & \\\\ & 0 & 5 & 3 & 2 & \\\\ & 0 & 1 & 0 & 0 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡06001305176300920⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
进行试指派 ;
找出每行的独立 000 元素 ,
优先从唯一选择开始 ,
第 222 行只有 111 个 000 元素 , 该元素是独立 000 元素 ;
第 333 行只有 111 个 000 元素 , 该元素是独立 000 元素 ( 红色矩形框 ) , 位于第 111 列 ; 同时第 111 列中的其它 000 元素标记为 废弃 000 元素 ( 绿色矩形框 );
第 111 行和第 444 行都有多个 000 元素 ;
然后从列里面找独立 000 元素 , 第 111 列 和 第 222 列都已经找到了 000 元素 , 这里看 第 333 列 和 第 444 列 ;
第 333 列有 独立 000 元素 ( 红色矩形框 ) ; 位于第 444 行 , 将第 444 行的其它 000 元素标记为 废弃 000 元素 ( 绿色矩形框 ) ;
第 444 列有 独立 000 元素 ( 红色矩形框 ) ; 位于第 111 行 , 将第 111 行的其它 000 元素标记为 废弃 000 元素 ( 绿色矩形框 ) , 已经标记过了 , 不用再进行标记 ;
这里第一次指派就找到了最优解 ;
六、匈牙利法示例 3
1、使用匈牙利法求解下面的指派问题
四人分别完成四项工作所用时间 :
AAA | BBB | CCC | DDD | |
---|---|---|---|---|
甲 | 777 | 151515 | 131313 | 444 |
乙 | 999 | 444 | 141414 | 151515 |
丙 | 888 | 141414 | 161616 | 131313 |
丁 | 777 | 888 | 111111 | 999 |
戊 | 444 | 888 | 111111 | 999 |
2、第一步 : 变换系数矩阵 ( 每行每列都出现 0 元素 )
先写出指派问题的系数矩阵 :
(cij)=[75981191271198546973696467511](c_{ij}) =\begin{bmatrix} & 7 & 5 & 9 & 8 & 11 & \\\\ & 9 & 12 & 7 & 11 & 9 & \\\\ & 8 & 5 & 4 & 6 & 9 & \\\\ & 7 & 3 & 6 & 9 & 6 & \\\\ & 4 & 6 & 7 & 5 & 11 & \\ \end{bmatrix}(cij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡79874512536974678116951199611⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
使每行都出现 000 元素 : (cij)(c_{ij})(cij) 系数矩阵中 , 每行都 减去该行最小元素 ;
- 第 111 行减去最小值 555 ;
- 第 222 行减去最小值 777 ;
- 第 333 行减去最小值 444 ;
- 第 444 行减去最小值 333 ;
- 第 555 行减去最小值 444 ;
(cij′)=[2043625042410254036302317](c_{ij}') =\begin{bmatrix} & 2 & 0 & 4 & 3 & 6 & \\\\ & 2 & 5 & 0 & 4 & 2 & \\\\ & 4 & 1 & 0 & 2 & 5 & \\\\ & 4 & 0 & 3 & 6 & 3 & \\\\ & 0 & 2 & 3 & 1 & 7 & \\ \end{bmatrix}(cij′)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡2244005102400333426162537⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
此时发现有两列 , 第 444 列 , 第 555 列 , 没有 000 元素 , 这两列每列都减去最小值 :
- 第 444 列减去最小值 111 ;
- 第 555 列减去最小值 222 ;
最终得到行列都有 000 元素的系数矩阵 (bij)(b_{ij})(bij) :
(bij)=[2042425030410134035102305](b_{ij}) =\begin{bmatrix} & 2 & 0 & 4 & 2 & 4 & \\\\ & 2 & 5 & 0 & 3 & 0 & \\\\ & 4 & 1 & 0 & 1 & 3 & \\\\ & 4 & 0 & 3 & 5 & 1 & \\\\ & 0 & 2 & 3 & 0 & 5 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡2244005102400332315040315⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
3、第二步 : 试指派 ( 找独立 0 元素 )
基于上一步的行列都有 000 元素的系数矩阵 ,
(bij)=[2042425030410134035102305](b_{ij}) =\begin{bmatrix} & 2 & 0 & 4 & 2 & 4 & \\\\ & 2 & 5 & 0 & 3 & 0 & \\\\ & 4 & 1 & 0 & 1 & 3 & \\\\ & 4 & 0 & 3 & 5 & 1 & \\\\ & 0 & 2 & 3 & 0 & 5 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡2244005102400332315040315⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
进行试指派 ;
找出每行的独立 000 元素 ,
优先从唯一选择开始 ,
第 111 行只有 111 个 000 元素 , 该元素是独立 000 元素 ( 红色矩形框 ) , 位于第 222 列 ;
同时第 222 列中的其它 000 元素标记为 废弃 000 元素 ( 绿色矩形框 );
第 333 行只有 111 个 000 元素 , 该元素是独立 000 元素 ( 红色矩形框 ) , 位于第 333 列 ;
同时第 333 列中的其它 000 元素标记为 废弃 000 元素 ( 绿色矩形框 );
第 222 行中原来有两个 000 元素 , 有一个被标记为 废弃 000 元素 , 因此只剩下一个 000 元素 , 标记为独立 000 元素 ;
第 444 行没有独立 000 元素 , 第 555 行都有多个 000 元素 ;
然后从列里面找独立 000 元素 , 第 2,3,52,3,52,3,5 列都已经找到了 000 元素 , 这里看 第 1,41,41,4 列 ;
第 111 列有 独立 000 元素 ( 红色矩形框 ) ; 位于第 555 行 , 将第 555 行的其它 000 元素标记为 废弃 000 元素 ( 绿色矩形框 ) ;
这里只找到了 444 个独立 000 元素 , 红色矩形框中 ;
使用最少的直线 , 覆盖所有的 000 元素 ;
4、第二步 : 试指派 ( 打 √ )
本步骤的目的是使用最少的直线 , 将所有的 000 元素都覆盖住 , 如果能一眼看出来最好 , 如果不能 , 就需要使用打钩的方法 ;
定位一个没有独立 000 元素的行 : 先对没有 000 元素的行打钩 √ : 第 444 行没有独立 000 元素 , 第 444 行打 √ ;
讨论第 444 行 : 第 444 行没有独立的 000 元素 , 但是有废弃的 000 元素 , 因为在第一步已经保证了每行每列都有 000 元素 ;
在第 444 行 的 废弃 000 元素所在列 , 即第 222 列 , 打 √ ;
讨论第 222 列 : 上述打钩的列中 , 查看是否有 独立的 000 元素 , 如果有对应的行就打 √ ;
第 111 行有独立的 000 元素 , 在第 111 行位置打 √ ;
讨论第 111 行 : 查看第 111 行是否有废弃的 000 元素 , 如果有就继续打 √ , 如果没有就停止 ;
第 111 行没有废弃的 000 元素 , 直接停止 ;
讨论 行 的时候讨论的是 废弃的 000 元素 ,
讨论 列 的时候讨论的是 独立的 000 元素 ;
5、第二步 : 试指派 ( 直线覆盖 )
本步骤的目的是使用最少的直线 , 将所有的 000 元素都覆盖住 , 如果能一眼看出来最好 , 如果不能 , 就需要使用打钩的方法 ;
打 √ 完毕 , 开始讨论覆盖 ,
没有 打 √ 的行划线 , 打 √ 的列划线 , 四条线就将所有的 000 元素覆盖了 ,
在没有被覆盖的元素中 , 找最小的元素 111 , 将该元素所在的没有覆盖的行 −1-1−1 , 覆盖的列 +1+1+1 ;
第 1,41, 41,4 行中的元素 −1-1−1, 第 222 列中的元素 +1+1+1 ;
最终得到如下矩阵 :
(bij)=[1031326030420133024003305](b_{ij}) =\begin{bmatrix} & 1 & 0 & 3 & 1 & 3 & \\\\ & 2 & 6 & 0 & 3 & 0 & \\\\ & 4 & 2 & 0 & 1 & 3 & \\\\ & 3 & 0 & 2 & 4 & 0 & \\\\ & 0 & 3 & 3 & 0 & 5 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1243006203300231314030305⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
本质 : 没有覆盖的元素统一减去最小值 , 被覆盖的行列交叉值增加了该最小元素值 ;
6、第二步 : 试指派 ( 第二轮 )
再次进行试指派此时发现 , 试指派还是 444 个独立 000 元素 ,
先找有独立 000 元素的行 , 找到后 标记为 独立 000 元素 ( 红色矩形框 ) , 将对应列的 000 元素标记为废弃 ( 绿色矩形框 ) ;
然后找有独立 000 元素的列 ;
再次执行 打 √ ,
没有 000 元素的行为起点 :
将该行废弃 000 元素列打钩 , 有两个 :
将废弃 000 元素列中对应的 独立 000 元素 行 打钩 :
上述两行对应的 废弃 000 元素的列打钩 :
在上述打钩的列中 , 将独立 000 元素所在行打钩 :
直线覆盖 : 没打勾的行画一条直线 , 打钩的列画一条直线 ; 目的是使用最少的直线覆盖住所有的 000 ;
在没有被覆盖的元素中 , 找最小的元素 111 , 将该最小元素所在的没有覆盖的行 −1-1−1 , 覆盖的列 +1+1+1 ;
第 1,2,3,41, 2,3,41,2,3,4 行中的元素 −1-1−1, 第 2,3,42,3,42,3,4 列中的元素 +1+1+1 ;
最终矩阵为 :
(bij)=[0030316020320032023004406](b_{ij}) =\begin{bmatrix} & 0 & 0 & 3 & 0 & 3 & \\\\ & 1 & 6 & 0 & 2 & 0 & \\\\ & 3 & 2 & 0 & 0 & 3 & \\\\ & 2 & 0 & 2 & 3 & 0 & \\\\ & 0 & 4 & 4 & 0 & 6 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0132006204300240203030306⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
本质 : 没有覆盖的元素统一减去最小值 , 被覆盖的行列交叉值增加了该最小元素值 ;
这个矩阵 000 很多 , 选出 555 个独立 000 元素 , 成立的解有好多个 ;
如下指派 , 正好能找出 555 个独立 000 元素 ;
【运筹学】指派问题、匈牙利法总结 ( 指派问题 | 克尼格定理 | 匈牙利法 | 行列出现 0 元素 | 试指派 | 打 √ | 直线覆盖 ) ★★★相关推荐
- 【运筹学】匈牙利法 ( 克尼格定理 | 匈牙利法引入 )
文章目录 一.克尼格定理 二.匈牙利法引入 一.克尼格定理 匈牙利法 主要用于解决指派问题 , 其主要依据是 克尼格定理 ; 指派问题 参考 [运筹学]整数规划 ( 整数规划求解方法 | 指派问题 ) ...
- 【运筹学】匈牙利法 ( 匈牙利法步骤 | 第一步 : 使行列出现 0 元素示例 )
文章目录 一.指派问题求解步骤 二.第一步 : 使行列出现 000 元素示例 一.指派问题求解步骤 指派问题求解步骤 : 1 . 使行列出现 000 元素 : 指派问题系数矩阵 (cij)(c_{ij ...
- 【运筹学】匈牙利法 ( 匈牙利法步骤 | 第二步 : 试指派操作示例 )
文章目录 一.指派问题求解步骤 二.第二步 : 试指派操作示例 一.指派问题求解步骤 指派问题求解步骤 : 1 . 使行列出现 000 元素 : 指派问题系数矩阵 (cij)(c_{ij})(cij ...
- 【运筹学】匈牙利法 ( 匈牙利法步骤 | 试指派调整矩阵原理分析 | 打 √ | 直线覆盖 )
文章目录 一.指派问题求解步骤 二.打 √ 三.直线覆盖 一.指派问题求解步骤 指派问题求解步骤 : 1 . 使行列出现 000 元素 : 指派问题系数矩阵 (cij)(c_{ij})(cij) 变 ...
- 【运筹学】匈牙利法 ( 匈牙利法示例 2 | 第一步 : 变换系数矩阵 | 第二步 : 试指派 | 行列打√ | 直线覆盖 | 第二轮试指派 )
文章目录 一.使用匈牙利法求解下面的指派问题 二.第一步 : 变换系数矩阵 ( 每行每列都出现 0 元素 ) 三.第二步 : 试指派 ( 找独立 0 元素 ) 四.第二步 : 试指派 ( 打 √ ) ...
- 差分进化算法python 指派问题_一类指派问题的改进矩阵解法
一 类 指 派 问 题 的 改 进 矩 阵 解 法 孙 静 (广州科技职业技术学院 电子信息系,广东 广州 510550) 摘 要 :本 文介绍 了求历 时最短的 指派 问题 ,给 出 了改 进矩阵解 ...
- 【运筹学】单纯形法的理论推导和定理证明
文章目录 1.前期理论推导,获得Fai 2.根据fai,证明三大定理(这些定理是单纯表法的理论依据) 定理1--最优解 定理2--当...LP问题无界 定理3--当...存在最优解 1.前期理论推导, ...
- C语言给出点坐标进行克里金插值,Arcgis笔记之克里金插值——求助surfer8.0
arcgis的插值方法比较丰富,但是有一点,那就是克里金插值.arcgis中克里金插值的结果不平滑,看起来非常难看.如下图,是对图中点数据某个属性值的插值结果. arcgis克里金插值结果 使用su ...
- 福禄克测试报告转换软件,福禄克推出新一代电能质量分析软件Fluke Power Pioneer-测试测量-与非网...
Fluke Power Pioneer 是新一代电能质量分析软件,集数据下载,分析,报告工具于一身,给客户提供了一体化的全方面解决方案.软件内置了公用电网电能质量,光伏系统并网,电机经济运行,企业合理 ...
最新文章
- 解决360浏览器偶发性会闪屏一下黑色的背景
- 疯狂C#~伴随着我的库存管理¥
- centos7 apache2.4 多站点配置
- 使用powershell一次性创建用户,OU及组
- 【转载】#pragma once与#ifndef #define #endif的区别
- ab实验置信度_为什么您的Ab测试需要置信区间
- python实时显示温度变化_python实时温度绘制
- 数字化转型方法论_双中台:企业数字化转型的核心战略与方法论
- swift 脚本_Swift脚本和命令行参数
- linux 内核 解压出错,imx258 内核解压失败(已解决)
- 蓝桥杯Python题目(二)
- 电感电容串联起什么作用
- 万能五笔输入法弹窗_万能五笔输入法的广告怎么关闭
- windows 10 宽带拨号时无法开启热点,解决热点开启问题
- 监控易携手三大运营商,助推安徽省农行三级网扁平化管理
- 小米路由器4刷padavan固件
- IDEA的maven的package打包
- linux下登录ftp
- linux bt4 u盘版下载,高手用U盘安装BT4
- 小程序使用阿里字体图标