Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Optimization_Defragmentation - Fatal编程技术网

Algorithm 以最少的更改进行碎片整理

Algorithm 以最少的更改进行碎片整理,algorithm,optimization,defragmentation,Algorithm,Optimization,Defragmentation,我需要设计一个算法,做一个简单的碎片整理,但与“最小数量的变化”的特点。假设我有3个容量为10的容器,其中包含以下物品: Container 1: 2 3 3 Container 2: 4 4 Container 3: 1 5 1 1 所有的容器都装满了8/10。现在我想放置下一个3号物品-总的自由容量是6,但没有一个容器的自由容量是3。虽然有多种可能的碎片整理解决方案,但我需要一种算法,该算法将找到解决方案,第一个容器中大小为2的项目将放置在其他地方,因此新项目可以放置到容器1中,因为此解决

我需要设计一个算法,做一个简单的碎片整理,但与“最小数量的变化”的特点。假设我有3个容量为10的容器,其中包含以下物品:

Container 1: 2 3 3
Container 2: 4 4
Container 3: 1 5 1 1
所有的容器都装满了8/10。现在我想放置下一个3号物品-总的自由容量是6,但没有一个容器的自由容量是3。虽然有多种可能的碎片整理解决方案,但我需要一种算法,该算法将找到解决方案,第一个容器中大小为2的项目将放置在其他地方,因此新项目可以放置到容器1中,因为此解决方案只需一次更改(而不是替换容器3中的两个项目). 因此,所需的结果应该是:

Container 1: 3 3 3(new item)
Container 2: 4 4 2(moved from Container 1)
Container 3: 1 5 1 1
我已经做了一些研究,我所能找到的要么是背包问题,要么是伙伴算法,但我不确定,这些是否真的是我要找的

你们谁能帮我把这个算法设计得尽可能简单?我正在解决一种情况,即我将有少量的大型容器和大量的项目在其中,所以列举所有的可能性不是很理想

非常感谢


更新只是想弄清楚我在问什么-确定是否只做一次更改就可以解决问题没有问题。问题是,当“一次移动”不可能时,如何找到最小的替换数量。

如果这些容器是从零开始构建的,您可以添加状态来说明哪一个容器填充最少,并始终将下一个项目放在那里

如果您可以将容器的大小从容器内部移到容器外部,这可能会变得更简单


只有我的2美分。

这不是问题的答案,但它太长了,无法发表评论。这里所说的问题是NP完全问题(一旦我们适当地将其转化为决策问题),可以从

假设x1,x2,…,xn是分区问题的一个实例。为了便于记谱,我们假设x1是最小的x的大小,W是所有x的总和。此外,为了简单起见,让我们假设W是偶数

我们构造给定问题的一个实例,对分区实例进行编码,如下所示。我们有三个尺寸为W、W/2-x1和x1的容器。最初,第一个容器包含大小为x1、x2、…、xn的项目,另外两个为空。要插入的新项目的大小为W/2。我们观察到,当且仅当原始分区问题有一个解决方案时,这个新项才能插入到这些容器中


编辑以添加(更多证明细节)

首先,我们假设我们有一个原始划分问题的解决方案,即:将x分成两个子集S1和S2,使得每个子集中x的总和等于W/2。假设S1包含最小的元素x1。然后,我们可以将x1移动到第三个容器中,将S1的所有其他元素移动到第二个容器中,从而在第一个容器中为新项目留出W/2的空间

接下来,假设我们有某种方法将新的W/2大小的元素插入这些容器中。通过检查,唯一可以做到这一点的方法是在第一个容器中为其留出空间;唯一可行的方法是将价值2/2的物品移出第一个容器(因此,将价值2/2的物品留在第一个容器中)。显然,这定义了将原始项目集拆分为两个子集,使得每个子集的大小为W/2



现在,仅仅因为这个问题是NP完全的,并不意味着所有的都失去了。这仅仅意味着,如果你认为你已经找到了一个在多项式时间内解决所有实例的解决方案,那么你可能应该检查你的工作。您将看到的实例类型的结构(例如:“大型容器数量较少,其中包含大量项目”)可能有助于指导搜索有用的启发式方法。

但这并不能解决这样的情况,即即使将新数量放入填充最少的容器中,也可能存在som碎片,这将不允许新项目被放置在任何地方,即使总的自由容量将是足够的。此外,在我的用例中可能会出现该项数量增加的情况。我正在寻找一个解决方案,采取的情况“是”,并找到最佳的碎片整理。但是,感谢您的努力:)所有容器的大小都必须相同吗?不,不是。但是尺寸是给定的,我不能动态修改它们。你能按项目大小对容器进行排序吗?我可以根据需要对容器进行排序。容器的顺序完全不重要。我不能100%确定你的例子是否有效。您建议的解决方案是将
2
从容器1移动到容器2,然后将
3
放在容器1中。从容器3中移动一个
1
,然后将
3
放入容器3不是“更快”吗?你只搬迁了1个单元而不是2个。谢谢,你可能是对的,这是一个NP完全问题,我也有这种感觉。是否有任何方程式或定义可以证明这是一个100%确定的NP完全问题?你能证明吗?证据在我的回答中略述了一下。我将再增加一段加以澄清。