在u用户之间分配c类别中的n个表单的最佳方法是什么?

时间:2011-12-28 09:30:22

标签: algorithm theory

我在cstheory too

中提出了这个问题

我有表单分发问题。 c类别中有n种形式(每种形式属于1类)。并且有u个用户,每个用户可以从至少一个类别(但可能不止一个类别)接收表单。

目标是在用户之间分发表单,以便每个用户收到相同数量的表单。我更喜欢同样使用类别。

例如:

如果类别是:

  

C1:20表格

     

C2:3表格

     

C3:8表格

     

C4:2表格

用户是:

  

U1可以访问C1和C2

     

U2可以访问C2

     

U3可以访问C3

     

U4可以访问C1和C3

     

U5可以访问C2和C4

答案应该是:

  

U1:1 x C1 + 1 x C2 | 2 x C1(首选)

     

U2:2 x C2

     

U3:2 x C3

     

U4:1 x C1 + 1 x C3 | 2 x C1(首选)| 2 x C3

     

U5:2 x C4

23表格仍然是

您对如何编写此类算法有任何建议吗?

可能存在第二个问题,其中一些类别具有应该选择的选项。如果设置,则该类别中的所有剩余表单将在有权访问该表单的用户之间分发。例如,如果C1启用了此选项,则答案应为:

  

U1:1 x C1 + 1 x C2 + 9 C1

     

U2:2 x C2

     

U3:2 x C3

     

U4:2 x C3(最小化C3类别中的剩余格式) + 10 C1

     

U5:2 x C4

其余表格在C1 中 0,在C2 0,在C3 4,在C4 0 >

我认为它有点Bin Packing算法,但我不确定,我不知道如何解决它! :(

注意:上述答案不是最佳答案,这些正是我的想法!

1 个答案:

答案 0 :(得分:1)

在我看来,如果您为每个用户修复N个表单并提出问题:我们可以为每个用户提供N个表单吗?那么您可以将其转换为http://en.wikipedia.org/wiki/Maximum_flow_problem问题,其中每个用户可以从其类别子集接收流/表单,并且每个用户都有一个容量N流出。此外,如果您可以为N解决此问题,则可以为所有较小的N值求解。

因此,您可以通过运行max-flow lg(最大N次)来解决第一个问题,使用二进制斩波找出N的最佳可能值。由于您可以通过最大流量来解决它,您也可以通过线性编程来解决它。这样做,也许只是为了N的临界值,可能允许你支持某些任务而不是其他任务,或者可能看看哪里有相邻的可行解决方案,然后看看你是否可以将它们混合使用以平等地使用类别。

示例 - 创建源,并将其链接到每个类别Ci,链接的容量是该类别中可用的表单数量,因此C1从容量源20获取链接。创建链接用户和类别之间的源容量,用户可以访问该类别,因此U1获得C1和C2的链接,但U2只获得C2的链接。现在创建从每个用户到单个接收器的容量N的链接。如果向用户分配表单,为每个用户提供N个表单,那么这将产生一个最大流量,填充从用户到接收器的每个链接,您可以查看用户和类别之间的流程,以了解如何分配表单。您可以从N = 3开始,因为用户2只能访问总共3个表单,因此答案不能大于此。这是行不通的,因为你说正确的答案有N = 2,所以最大流量不会填满所有N = 3容量的链接。所以你的程序再次尝试3/2 = 1,并找到一个解决方案 - 你已经提供了N = 2的解决方案,所以N = 1必须有一个。现在程序知道有一个解决方案N = 1但是不是一个N = 3所以它在N =(1 + 3)/ 2 = 2之间尝试一个,并找到你的解决方案。有一个N = 2但不是N = 3所以N = 2解决方案是你能做的最好的。