【问题标题】:How to equally distribute files to users based on file sizes?如何根据文件大小将文件平均分配给用户?
【发布时间】:2014-11-25 10:56:51
【问题描述】:

我有 N 个不同大小的文件,还有 M 个用户。

我想做的是使用 C#、C++ 或伪代码中的算法,将文件平等地分发给用户。

如果游戏中没有文件大小,则每个用户大概有 N/M 个文件。因此,我可以为每个用户随机选择 N/M 个文件(如果 M > N 并且没有更多文件,则可能有些用户无法参与)。但是,现在我有了游戏中的文件大小,我想根据文件大小自动将文件分配给用户。

一个文件只能与一个用户关联。因此,当文件与用户相关时,它不能再次使用。

一个用户可以关联很多文件。

如果文件数少于用户数 (N > M),一些用户可能或许多根本不参与。

此外,这些情况可能是 N N 和 M = N,并且算法应该将文件平均分配给用户。

如果有人可以帮助我,我将不胜感激。

谢谢。

【问题讨论】:

  • 你能举一些你尝试过的代码的例子吗?
  • 我目前没有代码。我什至不知道要执行什么算法或数学来完成这样的任务。
  • 根据我的经验,社区不会只想为您解决这个问题。你需要表现出一些努力。您认为可行的方法等...这似乎是一个家庭作业问题
  • 我真的不想给我解决方案,而是我如何实现它的方法。对于这种情况,也许有一种众所周知的算法。稍后我将在我的应用程序中实现该算法。例如,我想要一些与游戏中的路径查找相关的东西,你可以为我指定 A* 算法和一个参考链接。这就是我想要的。不是解决方案。我可以通过指导来实现它。

标签: c# algorithm random resources distribute


【解决方案1】:

如果这是家庭作业,那就太糟糕了!

它是 partition problem 的优化版本,即使只有两个用户,它也是 NP-hard(即,您无法有效地解决它)。

有一种贪心算法可以很好地逼近最佳排列,并在O(n log n) 时间内完成。如果我是你,我会这样做,除非你非常清楚地需要完美的最优性。这是伪代码,取自我上面链接的维基百科页面。它适用于两组(即M=2),但很容易概括。基本思想是,在每个阶段,您将当前文件分配给总数最小的用户。

INPUT:  A list of integers S
OUTPUT: An attempt at a partition of S into two sets of equal sum
1 function find_partition(S):
2     A ← {}
3     B ← {}
4     sort S in descending order
5     for i in S:
6         if sum(A) <= sum(B)
7             add element i to set A
8         else
9             add element i to set B
10    return {A, B}

完美的最优性原则上当然是可以实现的,但有两个问题需要考虑。

  1. 如果不出意外,您可以尝试将所有可能的文件分配给用户。这将是非常低效的,但众所周知这是一个 NP 难题,这意味着无论您做什么,最终都会得到具有指数运行时间的东西。
  2. 对于两个以上用户的情况,最佳 的含义并不完全清楚。 (两个很明显,这就是分区问题用两个来表示的原因。)例如,假设您有八个用户。哪个分配更好:[8,4,4,4,4,4,4,0][5,5,5,5,3,3,3,3]?您需要一些明确的指标来确定分配的“不良”程度,然后才能尝试将其最小化。

【讨论】:

  • 好人!非常感谢。所以,这是分区问题。我可以通过找到具有最小总和的用户并将下一个文件的文件大小添加到他/她来为 N 个用户(而不是两个 A、B)概括它。正确的?但是,正如你所说,这是一个贪心算法,并不总是产生完美的结果,而是一个近似值。是否有可能以某种方式产生完美的最优性?如果没有办法,我可能会使用这个算法,因为它也很快 o(n log n)。
  • @EfstathiosChatzikyriakidis 不客气 :) 我添加了一些关于生成最佳解决方案的内容。
  • 我真的不明白你的新笔记(尤其是第二个)。你能给我解释一下吗?与 [8,4,4,4,4,4,4,0] 或 [5,5,5,5,3,3,3,3] 相关...
  • 如果你有两个用户,并且你给他们分配了 A1 和 A2 的总大小,那么 optimal 意味着尽可能接近 A1=A2;并且尽可能接近 意味着您正在最小化 A1 和 A2 之间的差异。但是假设您有三个用户,并且您为他们分配的总大小为 A1、A2 和 A3。你到底想最小化什么?三个数字之间的“差异”没有明确的概念。由于它们都是非负数,您可能会尽量减少它们的平方和,或者其他什么,但这里 optimal 的含义并不明显。
  • @EfstathiosChatzikyriakidis 到目前为止,贪心算法是所有方面的最佳选择。您应该意识到,对于非常不平衡的文件大小,无论您做什么,最终都会得到非常不平衡的结果:对于您提到的示例和四个用户,完美的最佳解决方案仍然非常不平衡。在这种情况下你无能为力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2021-01-14
  • 2015-02-27
相关资源
最近更新 更多