Hungarian Algorithm
本文结合网络资源对匈牙利算法进行整理。
1 指派问题
假设有三位工人 A,B,C,需要分配每人完成一件工作;对于不同的工作他们索要不同的工钱,如下表所示。问题就是要找到一套开销最小的指派方案。
. | 工作1 | 工作2 | 工作3 |
---|---|---|---|
A | 1 | 3 | 3 |
B | 3 | 1 | 3 |
C | 3 | 3 | 1 |
使用匈牙利方法可以找到开销最小的方案,即 A 负工作 1,B 负责工作 2,C 负责工作 3,总开销为 3。
2 匈牙利算法的矩阵形式
给定 位工人以及 件工作,可以用一个 的开销矩阵来表示这一指派问题:
\left[ \begin{matrix} a_1 & a_2 & a_3 & a_4\\ b_1 & b_2 & b_3 & b_4\\ c_1 & c_2 & c_3 & c_4\\ d_1 & d_2 & d_3 & d_4 \end{matrix} \right] $$ {]} 其中 $a, b, c, d$ 表示工人,下标 $1, 2, 3, 4$ 表示工作,$x_y$ 表示指派工人 $x$ 负责工作 $y$ 的开销。 # 3 匈牙利算法步骤 - 算法核心思想:一件大的事物若除去一件小的事物,对这件事没有多大影响。 ## Step 1 对开销矩阵的各行进行操作 - 找出每一行中值最小的元素,然后把该行所有元素都减去这一最小值 完成后矩阵的每一行至少会出现一个 $0$。假如 $a_1, b_4, c_2, d_3$ 是开销矩阵每行的最小值,则开销矩阵在完成本项操作后变成:\left[
\begin{matrix}
0 & a_2-a_1 & a_3-a_1 & a_4-a_1\
b_1-b_4 & b_2-b_4 & b_3-b_4 & 0\
c_1-c_2 & 0 & c_3-c_2 & c_4-c_2\
d_1-d_3 & d_2-d_3 & 0 & d_4-d_3
\end{matrix}
\right]
a\rightarrow1, b\rightarrow4, c\rightarrow2, d\rightarrow3
执行完这一步后,开销矩阵中的 $0$ 元素很可能没有**分布于不同的行列**:\left[
\begin{matrix}
a_1 & 0 & a_3 & a_4\
0 & b_2 & b_3 & b_4\
c_1 & c_2 & c_3 & 0\
0 & d_2 & d_3 & d_4
\end{matrix}
\right]
\left[
\begin{matrix}
0 & a_2 & a_3 & a_4\
b_1 & b_2 & b_3 & 0\
0 & c_2 & c_3 & c_4\
d_1 & 0 & 0 & d_4
\end{matrix}
\right]