匈牙利算法和多因素

Posted

技术标签:

【中文标题】匈牙利算法和多因素【英文标题】:Hungarian Algorithm and multiple factors 【发布时间】:2010-11-16 08:35:57 【问题描述】:

我有一种情况,我需要为几个事件分配人员。如果我们只是将价格作为一个因素,那很好,但有很多因素会影响。

首先,一些背景。这是一个非营利组织,该组织为因任何原因住院的儿童宣传故事时间,因此他们依靠志愿工作来做到这一点。因此,由于他们依赖于人们的善意,所以他们给人们尽可能多的工作,人们可以/想做的事情,变化如下:

有些人只能做上午,有些人只能做下午; 有些人只能周一、周四去,有些人不能在 8 月或 12 月去; 有些人一个月只能去一次,其他人可以去 4 次(甚至其他人在这些行动中被给予“优先级”,因为他们更有经验,可以每月进行 10 次)李>

所以,我有点想通前两个。由于匈牙利算法是关于价格的,我会给他们一个愚蠢的高价,因为他们不能去。但是,其他的你会怎么做呢?

我想过给他们打分。类似这样的东西:一个人每月可以这样做一次需要花费大约 1000 点。如果某人每月可以去 10 次,则该人花费 100 点(1000 基除以 10)。此外,分配此费用的方法是在执行单独操作时提高价格,就像这样(选定的人在他们的相关成本上有一个 *):

第一次迭代

         | August 1st 2009
Person A | 1000
Person B | 500 *

第二次迭代

         | August 8th 2009
Person A | 1000 *
Person B | 1000 

这将是在所有人之间进行相应分配的方式,优先考虑那些可以多次执行此操作的人。

你有什么想法,你会怎么做?

【问题讨论】:

【参考方案1】:

这是一个调度/优化问题,所以关键问题是“您要最大化多少数量”?我猜想您正在寻求最大化所有志愿者的工作总小时数而不会发生冲突,这取决于每个志愿者的时间表限制。您还提到优先考虑有更多经验的志愿者,所以听起来您是在说“某些志愿者比其他志愿者首选”。

这就是经典的bipartite matching problem。参见例如The Algorithm Design Manual(第 2 版)的第 498 页,作者:Steven Skiena。基本方法是构建一个图,其中的顶点代表志愿者集和您尝试填充的时间段集。边缘将志愿者链接到有效的时间段。最佳解决方案是最大可能的边缘集,其中没有重复志愿者或时隙。这是一个匹配。

您的一些志愿者可能会做不止一个时段;这可以通过多次复制该自愿顶点来建模。

如果您想对志愿者进行优先排序,那么这会有效地为每个边缘添加一个权重,从而模拟该志愿者在该任务中的经验。在这种情况下,如您所想,您将需要类似匈牙利算法的东西。如果您可以在没有这个的情况下逃脱,那么您可以将问题转换为等效的flow graph,并应用网络流算法。这是code that implements both weighted and unweighted matching 的一个示例。

如果您想了解更多详细信息,包括其他替代方案以及更多实现链接,我强烈建议您自己获取一份算法设计手册 - 这是一个非常清晰实用的参考。

【讨论】:

很好的研究和回答。非常感谢您的反馈。

以上是关于匈牙利算法和多因素的主要内容,如果未能解决你的问题,请参考以下文章

算法趣味之匈牙利算法

匈牙利算法

匈牙利算法

匈牙利算法解决二分图匹配

基于匈牙利算法的指派问题优化分析matlab优化算法十二

匈牙利算法