Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 简单存储分配算法_Algorithm_Storage_Allocation - Fatal编程技术网

Algorithm 简单存储分配算法

Algorithm 简单存储分配算法,algorithm,storage,allocation,Algorithm,Storage,Allocation,我们有一大堆使用大量数据存储的机器。我们希望将所有机器的数据传输到新的数据存储区。这些新店的机器可用存储空间不同。此外,每台机器需要存储的数据量各不相同。一台机器的所有数据必须存储在一个数据存储器上;它不能被分割。除此之外,数据如何分配并不重要 我们目前拥有的数据比空间还多,因此不可避免的是,一些机器需要将数据保留在原来的位置,直到我们找到更多的数据。与此同时,是否有人知道一种算法(相对简单:我没有那么聪明)可以为我们现有的存储提供最佳或接近最佳的分配(即分配后新存储剩余的最小空间) 我意识到这

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

我们目前拥有的数据比空间还多,因此不可避免的是,一些机器需要将数据保留在原来的位置,直到我们找到更多的数据。与此同时,是否有人知道一种算法(相对简单:我没有那么聪明)可以为我们现有的存储提供最佳或接近最佳的分配(即分配后新存储剩余的最小空间)


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

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

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

下面是如何用一个简单的算法解决这个问题:

(1) 确定垃圾箱的大小并对其进行排序。例如,如果您有3个存储空间分别为20GB、45GB和70GB,那么您的目标是{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增加到70的95%以上,但是4-perm{29,23,14,4}=70。最后,我们得到了留在机器上的包{2,6,7,7,11,13}。注意,这些都是较小的包

请注意,perm是按相反的词法顺序测试的(最大值优先)。例如,如果你有“abcde”,其中e是最大的,那么3-perms的反词法顺序是:

cde
溴化二苯醚
ade
bce
ace
等等


此算法非常简单,将为您的情况产生良好的结果。

乍一看,这可能是多背包问题(,第6.6章“多背包问题-近似算法”),但实际上它是一个调度问题,因为它涉及时间因素。不用说,解决这类问题很复杂。一种方法是将它们建模为网络流,并使用像GOBLIN这样的网络流库

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

下面是如何用一个简单的算法解决这个问题:

(1) 确定垃圾箱的大小并对其进行排序。例如,如果您有3个存储空间分别为20GB、45GB和70GB,那么您的目标是{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增加到70的95%以上,但是4-perm{29,23,14,4}=70。最后,我们得到了留在机器上的包{2,6,7,7,11,13}。注意,这些都是较小的包

请注意,perm是按相反的词法顺序测试的(最大值优先)。例如,如果你有“abcde”,其中e是最大的,那么3-perms的反词法顺序是:

cde
溴化二苯醚
ade
bce
ace
等等

这个算法非常简单,对于您的情况会产生很好的结果。

我觉得这是NP-