高项-匈牙利算法

180 阅读5分钟

引言

在高项的第21章,运筹学中有一个相对比较复杂的算法,匈牙利算法,很多机构的老师在这一张的教学中,会告诉我们说这个只会考一分,可以不需要掌握,而经历过2025年第二批的考生就会发现,案例的计算题中居然也出了这道算法题,而我也没太关注这个算法,导致案例题没过,所以今天就和大家一起认认真真学习一下匈牙利算法。

一、什么是匈牙利算法?

匈牙利算法由匈牙利数学家Dénes Kőnig在1931年提出,后来由Harold Kuhn在1955年进一步完善。该算法主要用于解决二分图最大匹配问题,特别是指派问题(Assignment Problem),即在给定的成本矩阵中找到最优的任务分配方案,使得总成本最小(或收益最大)。

适用场景

  • 任务分配(如员工与岗位的匹配)
  • 资源调度(如出租车与乘客的匹配)
  • 图像处理(如目标跟踪中的特征匹配)

二、匈牙利算法的核心思想

匈牙利算法的核心在于调整成本矩阵,通过行归约和列归约来找到最优匹配。其基本步骤如下:

步骤 1:构建成本矩阵

假设我们有4个任务和4个工人,每个工人完成不同任务的成本如下:

任务1任务2任务3任务4
工人A67112
工人B4598
工人C31104
工人D5982

步骤 2:行归约

对每一行,减去该行的最小值,使得每行至少有一个0:

  • 工人A:最小值为2 → 减去2
  • 工人B:最小值为4 → 减去4
  • 工人C:最小值为1 → 减去1
  • 工人D:最小值为2 → 减去2

调整后的矩阵:

任务1任务2任务3任务4
工人A4590
工人B0154
工人C2093
工人D3760

步骤 3:列归约

对每一列,减去该列的最小值(如果该列还没有0):

  • 任务1:最小值已经是0(不调整)

  • 任务2:最小值是0(不调整)

  • 任务3:最小值是5 → 减去5

  • 任务4:最小值是0(不调整)

调整后的矩阵:

任务1任务2任务3任务4
工人A4540
工人B0104
工人C2043
工人D3710

步骤 4:寻找独立零

尝试用最少的横线或竖线覆盖所有0,如果线条数等于矩阵的阶数(这里是3),如果这个数量大于等于矩阵的行列数,那么直接跳到最后一步,则找到最优解。

455a2bc14fd07b3e214eeba7236bb35f.png

步骤5:剩余矩阵处理

  • 剩余矩阵减去矩阵最小值1

  • 交点加最小值1

得到矩阵如下

任务1任务2任务3任务4
工人A3430
工人B0105
工人C2044
工人D2600

重复步骤四直到直线数量等于矩阵行或列

步骤6:得到最优解

2.png

找到当前某行仅有1个0,划掉这个0对应的行列,重复操作直到匹配完成

任务1任务2任务3任务4
工人A3430
工人B0105
工人C2044
工人D2600

在本例中,我们可以这样匹配:

  • 工人A → 任务4

  • 工人B → 任务1

  • 工人C → 任务2

  • 工人D → 任务3

这样,总成本 = 2(A-4) + 4(B-1) +1(C-2) + 8(D-3) = 15

我们就可以很快的计算出了最优解

三、2025年高项案例题

接下来我们看一下2025年案例题 根据作者搜集资料,题目大概就是,我们已知各组完成各项活动的总费用,让我们确保项目能够用最小费用完成,表格如下

ABCDEF
1组7121391110
2组31113669
3组31312886
4组3131151110
5组61414867
6组31114586

按照上面步骤,我们计算一次

步骤 1:行归约

ABCDEF
1组056243
2组0810336
3组0109553
4组0108287
5组088201
6组0811253

步骤 2:列归约

ABCDEF
1组000042
2组034135
3组053352
4组052086
5组032000
6组035052

步骤 3:寻找独立零

4c7e11b51afd265c41f3ba9f749de6d6.png

步骤5:剩余矩阵处理

4.png

步骤6:得到最优解

ABCDEF
1组200242
2组012113
3组031330
4组030064
5组232200
6组013030

最小成本= 12(1组-B) + 3(2组-A) + 6(3组-F) + 11(4组-C) + 6(5组-E) + 5(6组-D) = 43

最后向大家分享下我的学习资料

高项资料