什么是匈牙利算法(Hungarian Algorithm)

AI资讯 20小时前 硕雀
6 0

匈牙利算法概述
匈牙利算法(Hungarian algorithm),又称 Kuhn‑Munkres 算法或匈牙利方法,是一种在多项式时间内求解二分图最大匹配加权二分图最优指派(assignment)问题的组合优化算法。它最初由匈牙利数学家 Harold Kuhn 于 1955 年提出,随后 James Munkres 在 1957 年给出完整的多项式时间证明,故常被称为 Kuhn‑Munkres 算法。该算法的理论基础可以追溯到 Kőnig 与 Egerváry 的工作,后者在 20 世纪初已经研究了二分图匹配的对偶性质。


1. 解决的问题

场景 形式 目标
指派(Assignment)问题 给定一个 n×n 的非负代价矩阵 C,要求在每行每列各选取一个元素,使总代价最小(或总收益最大) 最小化总成本或最大化总收益
二分图最大匹配 两侧点集 U、V,边表示可匹配关系(可带权重) 找到匹配边数最多的匹配(或权重最大的匹配)

该算法能够把上述离散优化问题转化为矩阵操作,通过一系列行/列减法零元素覆盖来逐步逼近最优解。


2. 基本思路与核心步骤

匈牙利算法的核心是在代价矩阵上构造零元素的“覆盖线”,并通过调整矩阵继续产生新的零,直至可以用 n 条覆盖线覆盖所有零,从而得到最优指派。常见的四步流程如下(以最小化为例):

  1. 行减法:对每一行减去该行的最小元素,使每行至少出现一个零。
  2. 列减法:对每一列减去该列的最小元素,使每列也至少出现一个零。
  3. 覆盖零元素:用最少的横线和竖线覆盖矩阵中的所有零。若覆盖线数等于 n,则已得到最优匹配,算法结束。
  4. 矩阵调整:若覆盖线数 < n,找到未被覆盖的最小元素 k,将 k 从所有未覆盖元素中减去,同时把 k 加到所有被两条线交叉覆盖的元素上。返回第 3 步继续迭代。

通过上述迭代,零的分布会逐步满足“每行每列恰好一个零”的条件,从而直接得到最优指派。


3. 关键概念

  • 增广路径augmenting path‍:在二分图匹配的解释中,算法等价于不断寻找交替路径来增加匹配边数。
  • 对偶变量(dual variables)‍:在加权版本(Kuhn‑Munkres)中,算法维护左、右顶点的对偶势 φ、ψ,使得每条匹配边满足 c(i,j) = φ_i + ψ_j,并通过松弛条件寻找增广路径。
  • 完美匹配:当图中每个顶点都被匹配时称为完美匹配;匈牙利算法在方阵情况下总能得到完美匹配(若存在)。

4. 时间复杂度与实现

  • 原始版本的时间复杂度为 O(n⁴),后经改进(如使用 BFS/DFS 寻找增广路径、优化矩阵操作)可降至 O(n³)
  • 在实际编程中,常用的实现包括:
    • DFS/递归增广路径(适用于无权匹配)
    • 矩阵化实现(适用于加权指派),如 Python scipy.optimize.linear_sum_assignment 已封装了匈牙利算法的核心步骤。

5. 典型应用场景

领域 示例
任务分配 将工人分配到机器或工作岗位,使总成本最小
图像目标跟踪 在连续帧中匹配检测到的目标,利用增广路径实现一对一对应
资源调度 物流、生产线排程、航空航班机组安排等
网络匹配 匹配用户与服务器、广告投放中的点击分配
教育与科研 课程安排、实验室设备分配、科研项目合作匹配

6. 变种与扩展

  • Kuhn‑Munkres(加权)‍:针对最大权匹配或最小成本匹配的对偶形式,使用对偶标记与增广树实现。
  • 不平衡指派:当左、右集合大小不等时,可在矩阵中加入虚拟节点(成本设为极大或零)转化为方阵再求解。
  • 在线匹配:任务按顺序到达,算法在每一步做出近似最优决策,常用 Ranking 或 随机化 变体。

7. 小结

匈牙利算法是一套基于矩阵变换与增广路径的系统化求解框架,能够在多项式时间内得到二分图匹配或指派问题的全局最优解。它的理论根基(对偶性、Hall 定理)与实际实现(行列减法、零覆盖、矩阵调整)相结合,使其在工业调度、计算机视觉、运筹学等众多领域得到广泛应用。随着计算平台的提升,现代实现(如 SciPy、C++ STL)已将其封装为即插即用的库函数,进一步降低了使用门槛。

来源:www.aiug.cn
声明:文章均为AI生成,请谨慎辨别信息的真伪和可靠性!