简单的存储分配算法

时间:2012-10-10 21:29:16

标签: algorithm storage allocation

我们拥有一大堆使用大量数据存储的计算机。我们希望将所有机器的数据传输到新的数据存储。这些新商店的机器可用存储空间量各不相同。此外,每台机器的存储数据量也各不相同。单个机器的所有数据必须存储在单个数据存储中;它不能拆分。除此之外,如何分配数据并不重要。

我们目前拥有的数据超出了我们的空间,所以一些机器不可避免地需要将数据保留在原来的状态,直到我们找到更多数据。与此同时,有没有人知道一种算法(相对简单:我不那么聪明),它将为我们的存储提供最佳或接近最佳的分配(即分配后新商店剩余的最小空间量) )?

我意识到这听起来像是一个家庭作业问题,但我向你保证这是真的!

1 个答案:

答案 0 :(得分:1)

乍一看,这似乎是多背包问题(http://www.or.deis.unibo.it/knapsack.html,第6.6章“多背包问题 - 近似算法”),但实际上它是一个调度问题,因为它涉及一个时间元素。不用说,解决这些类型的问题很复杂。一种方法是将它们建模为网络流,并使用像GOBLIN这样的网络流库。

在您的情况下,请注意您实际上不希望以最佳方式填充商店,因为如果您这样做,较小的数据包将更有可能被存储,因为它将导致更紧密的包装。这很糟糕,因为如果大型包裹留在机器上,那么未来的包装将变得越来越糟。你想要做的是优先存储更大的包,即使这意味着在商店留下更多的空间,因为这样你将来会获得更大的灵活性。

以下是使用简单算法解决此问题的方法:

(1)确定箱尺寸并对其进行分类。例如,如果您有3个存储空间为20 GB,45 GB和70 GB的存储,那么您的目标是{20,45,70}。

(2)按大小对所有数据包进行排序。例如,您可能有数据包:{2,2,4,6,7,7,8,11,13,14,17,23,29,37}。

(3)如果任何包裹总和为> 95%的商店,把它们放在那个商店,然后转到步骤(1)。不是这里的情况。

(4)生成两个包的所有排列。

(5)如果任何排列总和为> 95%的商店,把它们放在那家商店。如果有领带,请选择较大包装的组合。在我的例子中,有两个这样的对{37,8} = 45和{17,2} = 19.(注意使用{17,2}胜过{13,7}。如果您找到一个或多个匹配项,请返回步骤(1)。

好的,现在我们只剩下一家商店:70和以下套餐:{2,4,6,7,7,11,13,14,23,29}。

(6)将烫发次数增加1并转到步骤5.例如,在我们的案例中,我们发现没有3-perm增加超过95%的70,但是4 perm {29,23,14 ,4} = 70.最后,我们留下了机器上留下的{2,6,7,7,11,13}包。请注意,这些主要是较小的包。

请注意,perms以反向词法顺序(最大的第一个)进行测试。例如,如果你有“abcde”,其中e是最大的,那么3-perms的反向词汇顺序是:

CDE
BDE
阿德
BCE
王牌

此算法非常简单,可以为您的情况带来良好的效果。