【运筹学】匈牙利法 ( 匈牙利法示例 2 | 第一步 : 变换系数矩阵 | 第二步 : 试指派 | 行列打√ | 直线覆盖 | 第二轮试指派 )
文章目錄
- 一、使用匈牙利法求解下面的指派問題
- 二、第一步 : 變換系數矩陣 ( 每行每列都出現 0 元素 )
- 三、第二步 : 試指派 ( 找獨立 0 元素 )
- 四、第二步 : 試指派 ( 打 √ )
- 五、第二步 : 試指派 ( 直線覆蓋 )
- 五、第二步 : 試指派 ( 第二輪 )
一、使用匈牙利法求解下面的指派問題
四人分別完成四項工作所用時間 :
| 甲 | 777 | 151515 | 131313 | 444 |
| 乙 | 999 | 444 | 141414 | 151515 |
| 丙 | 888 | 141414 | 161616 | 131313 |
| 丁 | 777 | 888 | 111111 | 999 |
| 戊 | 444 | 888 | 111111 | 999 |
二、第一步 : 變換系數矩陣 ( 每行每列都出現 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?)=????????????????79874?512536?97467?811695?1199611?????????????????
使每行都出現 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′?)=????????????????22440?05102?40033?34261?62537?????????????????
此時發現有兩列 , 第 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?)=????????????????22440?05102?40033?23150?40315?????????????????
三、第二步 : 試指派 ( 找獨立 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?)=????????????????22440?05102?40033?23150?40315?????????????????
進行試指派 ;
找出每行的獨立 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 元素 ;
四、第二步 : 試指派 ( 打 √ )
本步驟的目的是使用最少的直線 , 將所有的 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 元素 ;
五、第二步 : 試指派 ( 直線覆蓋 )
本步驟的目的是使用最少的直線 , 將所有的 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?)=????????????????12430?06203?30023?13140?30305?????????????????
本質 : 沒有覆蓋的元素統一減去最小值 , 被覆蓋的行列交叉值增加了該最小元素值 ;
五、第二步 : 試指派 ( 第二輪 )
再次進行試指派此時發現 , 試指派還是 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?)=????????????????01320?06204?30024?02030?30306?????????????????
本質 : 沒有覆蓋的元素統一減去最小值 , 被覆蓋的行列交叉值增加了該最小元素值 ;
這個矩陣 000 很多 , 選出 555 個獨立 000 元素 , 成立的解有好多個 ;
如下指派 , 正好能找出 555 個獨立 000 元素 ;
總結
以上是生活随笔為你收集整理的【运筹学】匈牙利法 ( 匈牙利法示例 2 | 第一步 : 变换系数矩阵 | 第二步 : 试指派 | 行列打√ | 直线覆盖 | 第二轮试指派 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【运筹学】匈牙利法 ( 克尼格定理 |
- 下一篇: 【OpenGL】二、Visual Stu