Skip to content

算法Algorithm

匈牙利算法

施工中 · 内容逐步修订

Hungarian algorithm

通过对偶标号和增广结构求解赋权二分图完美匹配的算法。

形式陈述 ​

给定 n≥1 名工人与 n 项任务,以及实数成本矩阵 C=(cij),指派问题要求每人恰做一项、每项恰由一人承担,并使总代价最小。这是赋权二分图上的完美匹配。以下先假设所有配对均允许,且数值运算精确。

匈牙利算法维护一个部分匹配及两组顶点势 ui,vj。它们满足

ui+vj≤cij,rij=cij−ui−vj≥0.

rij 称为约化成本;等于零的边称为紧边。可以用 ui=minjcij,vj=0 初始化,因此原成本为负也不妨碍可行性。算法始终只匹配紧边。n=0 的空指派直接返回空匹配,费用为零。

从一个未匹配工人出发建立交替树:由工人沿未匹配紧边走向任务,再由已匹配任务沿其匹配边返回工人。到达未匹配任务时,沿增广路翻转边的匹配状态,匹配数增加一。若全部可用紧边已扩展完,仍未到达空闲任务,记树中的工人、任务集合分别为 S,T,取

Δ=mini∈S,j∉Trij,

并对 i∈S 增加 ui、对 j∈T 减少 vj,变化量均为 Δ。树内边两端变化抵消;从 S 到外部任务的约化成本减少至多 Δ;其余约束不变或更宽松。因此势仍可行,至少一条新边变紧,可以继续扩展同一棵树。树中除根外的工人都与树内任务配对,故 |S|=|T|+1;尚未增广时 T 不可能包含全部任务,完整成本矩阵下跨出候选始终非空。完成 n 次增广后输出匹配。

势是指派线性规划的对偶变量。对任意完美匹配 M,逐边相加给出

∑(i,j)∈Mcij≥∑iui+∑jvj.

若算法的完美匹配全部由紧边组成,不等式取等,故没有其他匹配能更便宜。这一最优性证书只需弱对偶,不必把强对偶定理当作额外黑箱。

直觉

顶点势先给每对工人、任务设定一个价格下界。紧边表示目前的下界已经触及真实成本,算法先尝试只用这些边完成分配。冲突出现时,并不立即放弃早先的匹配,而是沿交替路径搬动已有安排。

势调整解决的是“现有紧边不够用”:只抬高交替树中受阻工人的势,同时降低树内任务的势,使已有匹配继续紧,而通向新任务的某条边刚好变紧。匹配大小在增广时增长,对偶目标在正的势调整时增长;二者并非每一步都同步改变。

紧边、交替树与势调整
例子与边界

考虑工人 A,B,C 与任务 1,2,3 的成本:

C=(128148881).

初始势为 u=(1,1,1),v=(0,0,0),紧边只有 A1,B1,C3。先匹配 A1,再给 B 找任务时会沿 B→1→A 受阻,此时 S={A,B},T={1}。到外部任务的最小松弛量来自 A2,为 Δ=1。

调整后 u=(2,2,1),v=(−1,0,0)。边 A1,B1 仍紧,A2 新变紧,于是沿 B→1→A→2 增广,将 A1 换成 B1,A2,再匹配 C3。总代价为 1+2+1=4,恰等于势和 2+2+1−1=4。这个证书同时说明,若先固定 A1 再让 B 选剩余最便宜任务,会花费 1+4+1=6,逐行贪心并不正确。

矩形问题可以补虚拟行列,但虚拟成本必须表达真实的未指派代价。禁止配对的边应被排除;若受阻时没有任何有限的跨出候选,就应报告不存在完美匹配,而不能继续使用无穷大的势更新。求最大权时可把所有成本变号,再使用同一套最小化公式。

推论与应用

稠密实现为每个外部任务维护来自 S 的最小松弛量;每加入一个工人,只需扫描一行来更新它。一次增广至多扩展 n 个任务,耗时 O(n2),共 n 次,得到 O(n3) 算术操作界。若每次都重新搜索全部匹配或重算全部松弛量,不能自动得到这个界;大整数运算的位成本也需另外计算。

任务调度、数据关联和多目标跟踪可用成本矩阵表达两侧一对一的选择。一般图的带权匹配不满足二分结构,不能直接套用本算法。拟阵交算法能把二分匹配编码为两个分割拟阵的交,但它使用交换图和独立性查询;这种更一般的表达并不直接继承这里的势更新和稠密时间界。

二分匹配多胞形解释了为什么非负边变量与度约束已足以给出整数顶点。若输入是一份长期分数计划而不是单次成本矩阵,Birkhoff–von Neumann 分解逐次扣除带权完美匹配,把双随机计划还原成可执行排班。

参考资料
  • Norbert Zeh,Algorithms II,Dalhousie University 在线课程教材,The Hungarian Algorithm,访问于2026年:可行对偶、紧边匹配和交替树。
  • Robert Sedgewick、Kevin Wayne,Algorithms,第4版,2011,§6.5 的 AssignmentProblem 实现:指派问题与对偶证书;该页采用逐次最短增广路,标出的 O(n3log⁡n) 界与本页的稠密松弛量实现不同。
关系图谱15 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系