【问题标题】:Defragmentation with minimum changes以最少的更改进行碎片整理
【发布时间】:2016-03-12 13:34:59
【问题描述】:

我需要设计一种算法来进行简单的碎片整理,但具有“最小更改量”功能。假设我有 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

我已经做了一些研究,我只能找到背包问题或好友算法,但我不确定这些是否真的是我想要的。

你们中的任何人都可以帮助我尽可能简单地设计这个算法吗?我正在解决这样一种情况,即我的大型容器数量很少,但其中的物品数量很大,因此列举所有可能性并不是很理想。

非常感谢!

更新 只是为了弄清楚我在问什么 - 确定是否可以通过仅进行一项更改来解决这种情况是没有问题的。问题是,在“单步走”不可能的情况下,如何找到最少的替换。

【问题讨论】:

  • 所有容器的大小都必须相同吗?
  • 不,他们不是。但是尺寸是给定的,我不能即时修改它们。
  • 你能按物品大小对容器进行分类吗?
  • 我可以随意对容器进行分类。容器的顺序完全不重要。
  • 我不是 100% 确定你的例子是有效的。您建议的解决方案是将 2 从容器 1 移动到容器 2,然后将 3 放在容器 1 中。不会将单个 1 从容器 3 中移动,然后将 3 放在容器 3 中“更快” ?您只搬迁了 1 个单位而不是 2 个。

标签: algorithm optimization defragmentation


【解决方案1】:

这不是问题的答案,但评论太长了。此处所述的问题是 NP 完全问题(一旦我们将其适当地更改为决策问题),可从the PARTITION problem 简化。

设 x1, x2, ..., xn 是 PARTITION 问题的一个实例。为便于表示,让我们取 x1 为最小的 x 的大小,让 W 为所有 x 的总和。此外,为简单起见,我们假设 W 是偶数。

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


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

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

接下来,假设我们有办法将新的 W/2 大小的元素插入到这些容器中。通过检查,发生这种情况的唯一方法是在第一个容器中为它腾出空间;而这种情况发生的唯一方法就是将价值 W/2 的物品准确地移出第一个容器(因此,准确地留下价值 W/2 的物品)第一个容器。显然,这定义了将原始项目集拆分为两个子集,使得每个子集的大小为 W/2。


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

【讨论】:

  • 谢谢,你可能是对的,这是一个 NP 完全问题,我也有这种感觉。是否有任何方程式或定义可以证明这是 100% 确定的 NP 完全问题?你能证明吗?
  • 我的回答中勾勒出证明。我将再添加一段来澄清。
【解决方案2】:

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

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

只要我的 2 美分。

【讨论】:

  • 但这并不能解决这样的情况,即即使将新的数量放入最少填充的容器中,也总是可能存在一些碎片,这将不允许将新的物品放置在任何地方,即使总的可用容量也是如此就足够了。此外,在我的用例中,项目可能会增加其数量。我正在寻找一种解决方案,可以“按原样”处理这种情况并找到最佳的碎片整理。但是,感谢您的努力:)
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2021-01-07
  • 2018-01-03
  • 2012-05-13
  • 1970-01-01
  • 2019-02-25
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多