工作多次可用时的分配问题

时间:2016-06-04 10:57:52

标签: algorithm genetic-algorithm linear-programming montecarlo hungarian-algorithm

我有一个正常的分配问题,我希望将工人与工作相匹配。但是有几种工作,每种都有一定数量的职位。例如,我需要10,000名建造者,5,000名焊工等。当然,每个工人对同一类工作的每个职位都有相同的偏好。

我目前的方法是使用匈牙利算法,只是扩展矩阵列来解决这个问题。例如,它将拥有10,000个构建器列,5,000个焊接器等。当然,使用O(n ^ 3)和矩阵很大,获得结果可能需要一段时间。

匈牙利算法或其他使用这一事实的变量是否存在多个连接到一个作业节点?或者应该考虑蒙特卡罗或遗传搜索树算法?

编辑:

Sascha提出的正式描述:

为工人设置W,为工作设置J,为首选项设置权重函数formula,为可用工作量设置函数formula

所以我想要最小化的函数是:formula

其中formula

约束条件是:

formula

formula

按照Yay的要求,如果它在普通的消费者机器上运行一两天就没问题。目前有5万名工人,共有10种工作岗位和5万个工作岗位。因此,对于我现在正在使用的匈牙利算法,矩阵为50k x 50k(扩展),或者对于具有附加约束formula的LP为50k x 10,而formula和首选项矩阵中的值将从0到100。

1 个答案:

答案 0 :(得分:0)

这实际上被称为运输问题。运输问题类似于分配问题,因为它们都有来源和目的地,但运输问题还有两个值:每个来源都有供应,每个目的地都有需求。分配问题是运输问题的简化,其中每个来源的供应和每个目的地的需求是1.

在您的情况下,您有50,000个来源(您的工人),每个来源的供应量为1(每个工人只能工作一个工作)。您还有10个目的地(工作类型),每个目的地都有一定的需求量(该类型的空缺数量)。

运输问题传统上用单纯形算法解决。我无法告诉你它是如何起作用的,但在网上其他地方有很多关于如何做到这一点的信息。我会推荐这两个视频:firstsecond

或者,运输也可以使用匈牙利算法解决。我们的想法是分别跟踪您的供需情况,然后使用匈牙利算法(或分配问题的任何其他算法)来解决它,就好像供应和需求是1(当它不平衡时,这可能非常快)在您的情况下,作为50,000个来源到10个目的地)。一旦解决了一次,就可以使用结果适当减少分配的解决方案的供需。重复,直到供给或需求的总和为零。

但是,这些都不是必需的。几年前我用C ++编写了自己的Assignment Problem解算器,尽管使用了2.5GB的RAM,它可以在不到5秒的时间内解决50,000到50,000的分配问题。诀窍是写自己的。在我写作之前,我浏览了一下在线可用的东西,它们都非常糟糕,通常有明显的错误。如果您打算为此编写自己的代码,最好使用我上面链接的视频中描述的Simplex算法。我不知道一个比另一个快,但匈牙利算法并不是为运输问题做的。

ps:我上面联系的两个讲座的同一个人也在Assignment Problem and the Hungarian Algorithm上做了一个。