【问题标题】:What is the best way to distribute n forms in c categories between u users? [closed]在 u 个用户之间分配 c 个类别的 n 个表单的最佳方法是什么? [关闭]
【发布时间】:2011-12-28 09:30:22
【问题描述】:

我已经在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

剩下的形式是0 in C1, 0 in C2, 4 in C3 and 0 in C4.

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

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

【问题讨论】:

  • -1 用于交叉发布。下一次,在你问的原网站上耐心等待答案。
  • 好的。我只是认为这也可能与stackoverflow有关!我是程序员,不是科学家!
  • 可能 - 但交叉发布只是令人困惑。这个问题在本质上确实是理论上的,而不是实际的(因此不适合 SO)。它可能适合programmers,但只有在被 cstheory 拒绝时才发布。
  • 我在我的一个 Web 应用程序中遇到了这个问题!这正是我的客户所需要的!所以我觉得它真的很实用!
  • 我并不是说它没有实际应用,但所提出的问题在很大程度上属于理论领域。

标签: algorithm theory


【解决方案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 解决方案是您能做的最好的解决方案。

【讨论】:

  • 谢谢麦克道拉。您的答案似乎非常接近我的需要。但是,你能解释更多吗?老实说,我从您的回答和相关的维基百科文章中没有得到太多。你能推荐任何实现的代码吗?
  • en.wikibooks.org/wiki/Algorithm_Implementation/Graphs/… 似乎有一个最大流量的基本实现。我很快就发现了这一点,因此您也许可以找到更复杂的版本,例如maths.lth.se/matematiklth/personal/petter/pythonmaxflow.php,而且我确信有商业实现。我将编辑文章以添加所需网络的示例。
  • 非常感谢!我要编码这个:)
  • 顺便提一下,我找到了this,这正是你所说的和我需要的:)
猜你喜欢
  • 2020-12-31
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2021-01-26
  • 2020-03-22
  • 2018-08-27
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多