【知识点】​​匈牙利算法的计算过程示例
编辑
2025-06-03
深度学习
00

目录

匈牙利算法是做什么的?通俗解释
🌰 举个栗子:外卖员送餐问题
🔧 匈牙利算法的解决步骤
💡 通俗记忆法
🚀 实际应用

匈牙利算法是做什么的?通俗解释

匈牙利算法(Hungarian Algorithm)是一种用来解决**"最佳分配问题"的数学方法。它的核心任务是:"如何用最低成本,把N个任务分配给N个人,让总成本最小?"**(或者反过来,让收益最大)。


🌰 举个栗子:外卖员送餐问题

假设有:

  • 3个外卖员(A、B、C)
  • 3个订单(1、2、3)
  • 每个外卖员送每个订单的配送成本不同:
订单1订单2订单3
A5元8元6元
B4元7元10元
C3元9元8元

目标:怎么分配订单,让总配送成本最低?


🔧 匈牙利算法的解决步骤

  1. 每行减去最小值(让每行至少有一个0):

    • A行最小是5 → A行减5 → [0, 3, 1]
    • B行最小是4 → B行减4 → [0, 3, 6]
    • C行最小是3 → C行减3 → [0, 6, 5]

    新表格:

    订单1订单2订单3
    A031
    B036
    C065
  2. 每列减去最小值(让每列也至少有一个0):

    • 订单1列已经是 [0, 0, 0](不用减)
    • 订单2列最小是3 → 减3 → [0, 0, 3]
    • 订单3列最小是1 → 减1 → [0, 5, 4]

    新表格:

    订单1订单2订单3
    A000
    B005
    C034
  3. 用最少的线覆盖所有0(横线或竖线):

    • 画一条横线覆盖A行(因为A行全是0)
    • 画一条竖线覆盖订单1列(因为B和C的订单1是0)
    • 现在所有0都被覆盖了,但只用了2条线(小于3,说明还能优化)。
  4. 调整数字,创造新的0

    • 找到未被线覆盖的最小数字(这里是3)。
    • 所有未被线覆盖的数字减3,被线交叉的数字加3。
    • 调整后表格:
      订单1订单2订单3
      A300
      B002
      C031
  5. 重新画线覆盖0

    • 现在需要3条线才能覆盖所有0(等于人数,说明找到最优解了)。
    • 分配方案
      • A → 订单3(0元)
      • B → 订单2(0元)
      • C → 订单1(0元)
      • 总成本 = 6 + 7 + 3 = 16元(比随便分配更省钱!)

💡 通俗记忆法

匈牙利算法就像**"相亲配对"**:

  1. 先让每个人降低标准(每行减最小值)。
  2. 再让所有对象降低标准(每列减最小值)。
  3. 用最少的"红线"覆盖所有可能的配对(画线覆盖0)。
  4. 如果配对不够,就调整标准(加减数字创造新0)。
  5. 最终找到最合适的CP(最优分配方案)!

🚀 实际应用

  • OpenPose的关键点匹配(比如追踪多人运动时,防止关键点"跳错人")。
  • 网约车派单(让司机接最近的单)。
  • 工作任务分配(谁做哪件事效率最高)。

简单来说,匈牙利算法就是"用数学帮你做最划算的决策"

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!