实用程序最大化分配

时间:2015-03-31 08:58:31

标签: algorithm dynamic-programming combinatorics np

我在计算机科学部分发布了这个,但没有人回复:(。任何帮助将不胜感激:)。

有一个大小为MxN的网格。 M~20000和N~10。所以M非常巨大。因此,一种方法是看这是并排放置的大小为M的N个网格块。接下来假设存在K个用户,每个用户具有MxN的效用矩阵,其中每个元素提供用户将在该用户被分配该网格元素时将获得的效用。分配需要以这样的方式完成,即每个分配的用户总效用必须超过每个网格块中的某个阈值效用U.假设只能为一个用户分配一个网格元素。 可以分配的最大用户数是多少?。 (如果没有分配一些用户,那就可以了。)

级别2:现在假设每个用户至少有n个N个块必须超过效用阈值U.对于此问题,是否可以分配最大用户数。

当然,由于K ^(MN)复杂性,强力搜索在这里没有用。我猜可能有某种动态编程方法。

2 个答案:

答案 0 :(得分:1)

根据我的理解,问题可以建模为Maximum Bipartite Matching问题,可以使用Hungarian algorithm有效解决。在左侧分区L中,创建K个节点,每个用户一个节点。在右侧分区R中,创建L*M*N个节点,每个节点对应网格中的每个单元格。由于边为每个l in Lr in R创建边,其成本等于将用户l分配给网格单元r的成本。

答案 1 :(得分:1)

使用与Codor不同的解释,我会声称(至少在理论上,在最坏的情况下)这是一个难题。

假设我们可以在特殊情况下解决它,当有一个块必须在两个用户之间共享时,每个用户对每个单元具有相同的效用,并且阈值效用U是(所有用户的总效用的一半)块中的单元格减1。

这意味着为了解决这个问题,我们必须取一个数字列表并将它们分成两组,这样每组数字的总和是相同的,并且恰好是数字总和的一半。数字可用。

这是http://en.wikipedia.org/wiki/Partition_problem,这是NP完整的,所以如果你能像我所描述的那样解决你的问题,你就可以解决已知难以解决的问题。

(但维基百科条目确实说这被称为“最容易解决的难题”,所以即使我已经正确描述了它,也可能有一些解决方案在实践中运作良好)。