假设您有一组人J
,并且您需要拍摄每个人的照片。他们只有一名摄影师,而摄影师有一组有限的时间T
(|T|
> |J|
)可以拍摄每张照片。在t
的任何特定时间T
,摄影师只能拍摄一张照片。 J
中的每个人只能在T
中为某些时间段拍摄他们的照片,尽管每个人都被要求至少选出一次他们可用的时间。基本上,根据每个人的可用性,摄影师想要尝试在T
中为每个可用时间段分配一个人,这样每个人都可以拍摄他们的照片。有多项式时间算法来解决这个问题吗?如果不是,那么多项式时间内的非多项式时间问题会减少到这个问题,即怎么能证明这个问题不在P
?
示例:
摄影师有时可以使用[1, 12, 15, 33, 45, 77]
人员A有时可用[12, 33]
人员B有时可用[1, 12]
人员C有时可用[1, 12]
。
我们可以通过选择拍摄每个人:
人A:33
B人:1
人C:12
如果我们首先选择A:12
,B:1
,我们将找不到C
的位置,即我们必须回溯并且将A重新分配给33
。
基本上我正在寻找一个多项式时间算法来找到一个适当的时间分配(如果存在),否则能够报告不存在适当的赋值。
答案 0 :(得分:2)
这可以建模为Assignment Problem(或Bipartite Graph matching problem)。
来源应是人和目的地应为摄影师可用的时间。成本矩阵可以通过将一个人的不可用成本一次设为1,可用性为0来构建。
如果矩阵不是正方形,则可以添加虚拟人,相应的成本为0.如果人数超过次数,那么就是不可能分配的情况。
如果最优解决方案的最终成本不为零,则意味着无法进行分配。
可以在多项式时间内使用Hungarian Algorithm来解决。
答案 1 :(得分:2)
Abhishek的回答将适用于这个问题,但我想添加一个我发现更快的替代方案。 Abhishek已经提到(顺便提一下)Hopcroft-Karp algorithm与之相关的二分匹配。 Hopcroft-Karp算法用于查找最大基数匹配,并在匈牙利算法的$O(sqrt(V)*E)$
时间与O(n^3)
之间运行。 “最大基数匹配”基本上意味着它找到了可以进行的最大分配数量,因此在我之前的示例中,根据每个人的可用性和摄影师的可用时间段,可以为照片安排的最大人数。因此,如果返回的最大基数等于人数,则您知道每个人都可以进行分配。
请注意,在这个例子中我们可以使用Hopcroft-Karp算法的原因是我们不关心边缘权重 - 只要每个人都得到一些,那么谁被分配到哪个时间段没有区别时间段。如果我们关心加权,我们需要类似匈牙利算法的东西,例如如果我们有一个“不方便因素”,每个人分配给他们每个可用的时隙,因为匈牙利算法旨在优化这些条件下的结果,其中Hopcroft-Karp只确定可能有多少分配。
在实践中,我开始使用匈牙利算法,在我的特定数据集上执行需要大约30秒。在将其切换为Hopcroft-Karp算法之后,我可以在< 1秒。