如何根据文件大小平均分配文件给用户?

时间:2014-09-30 18:02:12

标签: c# algorithm random resources distribute

我有N个不同文件大小的文件以及M个用户。

我想要做的是在C#,C ++或伪代码中使用一种算法,将算法平均分配给用户。

如果文件大小不在游戏中,那么它将类似于每个用户的N / M文件。因此,我可以为每个用户随机选择N / M文件(如果M> N并且没有剩下的文件,则可能有些用户无法参与)。但是,现在我在游戏中有文件大小,我想自动将文件分配给文件大小的用户。

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

用户可以与许多文件相关联。

如果文件少于用户(N> M),则某些用户可能会或根本不参与。

此外,这些情况可能是N< M,M> N和M = N,算法应该平等地将文件分发给用户。

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

谢谢。

1 个答案:

答案 0 :(得分:3)

如果这是作业,它就是一个臭味!

它是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]?您需要一些明确定义的度量标准来确定&#34; badness&#34;在您尝试将其最小化之前进行分配。