【问题标题】:Covering the zeros with minimum lines in the Hungarian Method用匈牙利方法中的最小线覆盖零点
【发布时间】:2013-07-19 12:59:28
【问题描述】:

我正在尝试按照匈牙利方法中用最少行数覆盖零的步骤如下:

  1. 勾选所有未分配的行。
  2. 如果勾选的行为零,则勾选对应的列。
  3. 在打勾的列内,如果有赋值,则打勾对应的行。
  4. 在每个未勾选的行和勾选的列上方画一条线。
  5. 对每个未分配的行重复。
  6. 然后找到 Theta(这是最小的未覆盖值)

问题是当我这样做时,我仍然发现零!导致 Theta 为零并进入无限循环!

例如,如果我们采用以下矩阵 25 x 25):

1 5 5 2 3 1 2 3 2 4 5 2 3 1 5 5 2 3 1 5 1 4 3 2 5

5 5 3 2 3 2 5 1 4 3 2 5 3 2 4 5 2 5 2 1 1 4 1 2 5

5 1 4 3 2 5 1 1 4 1 2 5 2 2 3 4 1 4 5 3 2 4 5 2 5

1 1 4 1 2 5 3 2 4 5 2 5 5 5 1 5 1 5 5 2 2 3 4 1 4

3 2 4 5 2 5 2 2 3 4 1 4 5 4 2 1 3 2 5 5 5 1 5 1 5

2 2 3 4 1 4 5 5 1 5 1 5 5 5 2 5 5 1 4 5 4 2 1 3 2

5 5 1 5 1 5 5 5 3 2 3 2 1 5 5 1 5 1 5 5 5 2 5 5 1

5 4 2 1 3 2 5 1 4 3 2 5 5 5 4 2 1 3 2 5 1 4 3 2 5

5 5 2 5 5 1 1 1 4 1 2 5 1 5 5 2 5 5 1 1 1 4 1 2 5

2 4 5 3 4 2 3 2 4 5 2 5 2 2 4 5 3 4 2 3 2 4 5 2 5

2 2 5 5 1 3 2 2 3 4 1 4 2 2 2 5 5 1 3 2 2 3 4 1 4

4 1 5 4 5 3 5 5 1 5 1 5 5 4 1 5 4 5 3 5 5 1 5 1 5

5 1 4 3 2 5 3 2 4 5 2 5 5 5 1 4 3 2 5 3 2 4 5 2 5

1 1 4 1 2 5 2 2 3 4 1 4 1 1 1 4 1 2 5 2 2 3 4 1 4

3 2 4 5 2 5 5 5 1 5 1 5 4 3 2 4 5 2 5 5 5 1 5 1 5

2 2 3 4 1 4 5 4 2 1 3 2 1 2 2 3 4 1 4 5 4 2 1 3 2

5 5 1 5 1 5 5 5 2 5 5 1 2 5 5 1 5 1 5 5 5 2 5 5 1

5 1 4 3 2 5 3 5 1 4 3 2 5 3 5 2 2 3 5 2 2 3 2 5 3

3 4 1 4 1 1 1 1 1 4 1 2 5 5 1 4 3 2 5 1 4 1 2 5 2

1 5 5 2 3 1 5 3 2 4 5 2 5 1 1 4 1 2 5 2 4 5 2 5 5

5 5 3 2 3 2 2 2 2 3 4 1 4 3 2 4 5 2 5 2 3 4 1 4 3

5 1 4 3 2 5 2 5 5 1 5 1 5 2 2 3 4 1 4 5 1 5 1 5 5

1 1 4 1 2 5 2 5 4 2 1 3 2 5 5 1 5 1 5 4 2 1 3 2 1

3 2 4 5 2 5 1 5 5 2 5 5 1 5 4 2 1 3 2 5 2 5 5 1 3

2 2 3 4 1 4 1 2 4 5 3 4 2 5 5 2 5 5 1 4 5 3 4 2 2

在从匈牙利方法中减去最小行和列值作为步骤 1 和 2 后,我得到:

0 4 4 1 2 0 1 2 1 3 4 1 2 0 4 4 1 2 0 4 0 3 2 1 4

4 4 2 1 2 1 4 0 3 2 1 4 2 1 3 4 1 4 1 0 0 3 0 1 4

4 0 3 2 1 4 0 0 3 0 1 4 1 1 2 3 0 3 4 2 1 3 4 1 4

0 0 3 0 1 4 2 1 3 4 1 4 4 4 0 4 0 4 4 1 1 2 3 0 3

2 1 3 4 1 4 1 1 2 3 0 3 4 3 1 0 2 1 4 4 4 0 4 0 4

1 1 2 3 0 3 4 4 0 4 0 4 4 4 1 4 4 0 3 4 3 1 0 2 1

4 4 0 4 0 4 4 4 2 1 2 1 0 4 4 0 4 0 4 4 4 1 4 4 0

4 3 1 0 2 1 4 0 3 2 1 4 4 4 3 1 0 2 1 4 0 3 2 1 4

4 4 1 4 4 0 0 0 3 0 1 4 0 4 4 1 4 4 0 0 0 3 0 1 4

0 2 3 1 2 0 1 0 2 3 0 3 0 0 2 3 1 2 0 1 0 2 3 0 3

1 1 4 4 0 2 1 1 2 3 0 3 1 1 1 4 4 0 2 1 1 2 3 0 3

3 0 4 3 4 2 4 4 0 4 0 4 4 3 0 4 3 4 2 4 4 0 4 0 4

4 0 3 2 1 4 2 1 3 4 1 4 4 4 0 3 2 1 4 2 1 3 4 1 4

0 0 3 0 1 4 1 1 2 3 0 3 0 0 0 3 0 1 4 1 1 2 3 0 3

2 1 3 4 1 4 4 4 0 4 0 4 3 2 1 3 4 1 4 4 4 0 4 0 4

1 1 2 3 0 3 4 3 1 0 2 1 0 1 1 2 3 0 3 4 3 1 0 2 1

4 4 0 4 0 4 4 4 1 4 4 0 1 4 4 0 4 0 4 4 4 1 4 4 0

4 0 3 2 1 4 2 4 0 3 2 1 4 2 4 1 1 2 4 1 1 2 1 4 2

2 3 0 3 0 0 0 0 0 3 0 1 4 4 0 3 2 1 4 0 3 0 1 4 1

0 4 4 1 2 0 4 2 1 3 4 1 4 0 0 3 0 1 4 1 3 4 1 4 4

4 4 2 1 2 1 1 1 1 2 3 0 3 2 1 3 4 1 4 1 2 3 0 3 2

4 0 3 2 1 4 1 4 4 0 4 0 4 1 1 2 3 0 3 4 0 4 0 4 4

0 0 3 0 1 4 1 4 3 1 0 2 1 4 4 0 4 0 4 3 1 0 2 1 0

2 1 3 4 1 4 0 4 4 1 4 4 0 4 3 1 0 2 1 4 1 4 4 0 2

1 1 2 3 0 3 0 1 3 4 2 3 1 4 4 1 4 4 0 3 4 2 3 1 1

那么当我们进行赋值时,我们将有 23 个赋值而不是 25 个,所以我们根据上述步骤进行前面提到的覆盖零,我会得到以下结果:

粗体单元格是根据上述步骤覆盖的单元格。

请注意,仍然有未发现的零导致无限循环,因为它将被选中。

请帮助我。

提前谢谢你

【问题讨论】:

  • 你有一些特定语言的代码吗?
  • 不确定您是否确定了算法...您需要使用最少的行数来覆盖所有零,这可能是一个小技巧。请参阅Hungarian Method,或直接在谷歌上搜索。
  • 您需要循环执行第 2 步和第 3 步,直到无法放置更多刻度。
  • 问题是,我正在尝试修改算法并允许它接受每个工人 2 个任务。在检查分配时,我用单个零分配行,然后返回到具有多个零的行,检查它们在初始矩阵中的初始值并选择最小值(最有希望的一个)。在进行分配之前,我检查最小初始值为零的列,看看它是否小于 2。如果是,我进行分配,否则,如果其列再次少于 2 个任务,我选择另一个值(而不是严格的 1)。
  • 我需要一个算法,我可以有一个巨大的矩阵(例如:60 x 30),我可以为每个工人分配 2 个任务,因为每个工人选择的 2 个任务具有相似或接近费用。例如,我不能让一个工人有 2 个成本为 1(共 2 个)的任务,而另一个有 2 个成本为 6 的任务(共 12 个)。差异应限制为最小化为 3 或 4。例如,一个工人的任务成本为 2,3(总共 5),而另一个工人的任务成本为 3,5(总共 8),所以这里的成本之间的差异两个工人之间的任务是 3。

标签: algorithm hungarian-algorithm


【解决方案1】:

当每个工人可能完成两个任务时,您可以使用最小成本最大流量算法来解决问题。

首先,让我们看看如何使用 min-cost max flow 解决标准分配问题。创建一个二分图,其中工人在一个部分,任务在另一个部分。对于所有 i, j,在工人 i 和任务 j 之间放置一条容量为 1 且成本为 cost_ij 的边。然后将源 S 和来自源的边添加到容量为 1 且成本为 0 的每个工人。类似地,将每个任务的接收器 T 和边添加到具有相同成本和容量的接收器。那么,如果你找到一个从 S 到 T 的 min-cost max flow,那么它的值就是总分配成本。

因此,如果您允许每个工作人员选择两个任务,那么从源到工作人员的边的容量应该为 2。算法的这种添加将以最佳方式解决您的问题 不管最大差异的给定约束

但是,目前我不知道对每个可能的输入有限制的任务的解决方案。如果您的输入值有些特殊,您可以在回复中说出来,我们会考虑问题的特殊情况。

【讨论】:

  • 我的输入值在 1-5 之间(所需的 1),我为不需要的选择分配了 6。
猜你喜欢
  • 2014-06-16
  • 2013-01-25
  • 2011-05-03
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 2012-09-09
  • 2017-03-09
  • 2011-08-27
相关资源
最近更新 更多