C++ 中的匈牙利算法

2025 年 5 月 12 日 | 阅读 4 分钟

这个 C++ 版本的 匈牙利算法 通过将任务分配给资源来解决分配问题,以最大化利润或最小化开支。最优分配由成本矩阵和一系列步骤(例如修正、行和列缩减以及零标记)确定。该技术非常适合资源分配和工作调度等任务,因为它保证了 n×n 矩阵的 O(n3) 时间复杂度。在 C++ 中,矩阵和分配使用二维数组或向量等数据结构进行系统跟踪。

匈牙利算法的关键特性

C++ 中匈牙利算法的几个关键特性如下

  • 分配问题通过成本矩阵的每个元素表示将任务分配给资源的成本来解决。
  • 确保最佳结果。
  • 对于 n × n 成本矩阵,它以 O(n3) 的时间复杂度运行。
  • 通过根据需要向矩阵填充虚拟行或列来处理方形和矩形矩阵。

匈牙利算法的基本步骤

  • 行缩减: 行缩减通过从行的每个成员中减去该行的最小值来计算。
  • 列缩减: 从每列中取出最小值,并将其从所有组成元素中减去。
  • 零标记
    1. 使用最少的行覆盖所有包含零元素的行和列。
    2. 当行数等于矩阵的大小时,选择最佳分配。
  • 调整矩阵: 如果行数小于矩阵大小,可以通过重复标记和调整未覆盖的组件来调整矩阵。
  • 分配: 使用零元素确定最佳分配。

C++ 中的匈牙利算法

匈牙利算法的实现涉及

  • 成本矩阵可以使用二维数组或向量表示。
  • 上述步骤使用嵌套循环迭代执行。
  • 使用辅助数据结构来跟踪已分配的行、列和分配。

示例代码

输出

 
Optimal Assignment:
Task 1 -> Worker 1
Task 2 -> Worker 3
Task 3 -> Worker 2   

说明

  • 在此示例中,HungarianAlgorithm 函数使用对偶优化技术。
  • u 和 v 存储行和列的对偶变量。
  • P 和 way 跟踪增广路径。
  • 结果是最佳分配,将每个任务分配给最具成本效益的工人。

结论

总而言之,匈牙利算法是解决分配问题的可靠且有效的解决方案,在运筹学、资源分配和工作调度中得到广泛应用。其系统方法提供最优解,O(n3) 的多项式时间复杂度保证了对中等规模数据集的可扩展性。该算法在 C++ 中的实现使其能够处理各种问题规模并适应特定需求。该方法通过利用数组和向量等动态数据结构,成为实用应用程序的有用工具。其降低成本或增加收入的能力使其成为组合优化中不可或缺的一部分,也是程序员的有用工具。