📜  分配问题的匈牙利算法设置1(简介)

📅  最后修改于: 2021-04-23 17:00:05             🧑  作者: Mango

设n个代理和n个任务。可以分配任何座席以执行任何任务,这会产生一些费用,该费用可能会因座席任务分配而异。要求执行所有任务,方法是将每个任务恰好分配给一个代理,将每个任务恰好分配给一个代理,以使分配的总成本最小化。

示例:您是芯片制造商的经理,目前有3个人在路上与客户会面。您的销售人员在斋浦尔,浦那和班加罗尔,您希望他们飞往其他三个城市:德里,孟买和喀拉拉邦。下表显示了城市之间以INR为单位的机票价格:

匈牙利语1

问题:您将把每个销售人员送到哪里,以最大程度地减少公平性?

可能的分配:费用= 11000 INR

Hungerain2

其他可能的分配:成本= 9500 INR,这是3种中的最好的!可能的任务。

匈牙利人4

蛮力解决方案是考虑每一个可能的赋值都意味着Ω(n!)的复杂度。

匈牙利算法(又名Munkres分配算法)利用以下定理来解决多项式运行时复杂度(最坏情况O(n 3 ) )并确保最优性:
如果将一个数字添加到成本矩阵的任何一行或一列的所有条目中或从中减去,则所得成本矩阵的最优分配也将是原始成本矩阵的最优分配。

通过使用上述定理,我们将原始的权重矩阵简化为包含零。我们尝试将任务分配给业务代表,以使每个业务代表仅执行一项任务,并且在每种情况下产生的损失为零

该算法的核心(假设方阵):

  1. 对于矩阵的每一行,找到最小的元素,并将其从其行中的每个元素中减去。
  2. 对所有列执行相同的操作(作为步骤1)。
  3. 使用最少数量的水平和垂直线覆盖矩阵中的所有零。
  4. 最优性测试:如果覆盖线的最小数量为n,则可能进行最优分配,然后我们就完成了。否则,如果行数小于n,则我们找不到最佳分配,必须继续执行步骤5。
  5. 确定没有任何行覆盖的最小条目。从每个未覆盖的行中减去此条目,然后将其添加到每个覆盖的列中。返回步骤3。

以上简单示例的说明:

以下是上图中给出的示例的成本矩阵。 2500 4000 3500 4000 6000 3500 2000 4000 2500步骤1:减去每行的最小值。分别从行1,行2和行3减去2500、3500和2000。 0 1500 1000 500 2500 0 0 2000 500步骤2:减去每列的最小值。分别从第1、2和3列中减去0、1500和0。 0 0 1000 500 1000 0 0 500 500步骤3:用最少数量的水平和垂直线覆盖所有零。 例子步骤4:由于我们需要3条线来覆盖所有零,因此我们找到了最佳分配。 2500 4000 3500 4000 6000 3500 2000 4000 2500因此最佳成本是4000 + 3500 + 2000 = 9500

第一次尝试不会带来最佳价值的示例:
在上面的示例中,对最优性的第一次检查确实为我们提供了解决方案。如果覆盖行数小于n怎么办。

成本矩阵:1500 4000 4500 2000 6000 3500 2000 4000 2500步骤1:减去每行的最小值。分别从行1,行2和行3减去1500、2000和2000。 0 2500 3000 0 4000 1500 0 2000 500步骤2:减去每列的最小值。分别从第1、2和3列中减去0、2000和500。 0 500 2500 0 2000 1000 0 0 0步骤3:用最少的水平和垂直线覆盖所有零。 例子2步骤4:由于我们只需要2行就可以覆盖所有零,因此我们没有找到最佳分配。步骤5:我们从所有未发现的行中减去最小的未发现条目。最小的条目是500。-500 0 2000 -500 1500 500 0 0 0然后我们将最小的条目添加到所有覆盖的列,我们得到0 0 2000 0 1500 500 500 0 0现在返回到步骤3 : 。在这里,我们再次使用线条覆盖。并转到步骤4 : 。由于我们需要覆盖3条线,因此我们找到了最佳解决方案。 1500 4000 4500 2000 6000 3500 2000 4000 2500因此最佳成本是4000 + 2000 + 2500 = 8500

在下一篇文章中,我们将讨论上述算法的实现。该实现需要更多的步骤,因为我们需要使用程序找到最小的行数以覆盖所有0。


参考:

http://www.math.harvard.edu/archive/20_spring_05/handouts/assignment_overheads.pdf
https://www.youtube.com/watch?v=dQDZNHwuuOY