【发布时间】:2013-07-13 07:29:23
【问题描述】:
我不知道这是一个众所周知的问题还是可以简化为一个问题,但这是我最近几天以来一直在努力解决的问题。
令 X_1, X_2, X_3 .. X_n 为整数集。
在每个集合 X_i 中,我们有 m 个(等于所有集合)元素 x_i,j : j = 1...m。
我的目标是从每个集合中选择一个单个元素,这样所有选定元素之间的成对差异之和是最小的。
我从一个稍微不同的问题开始,即最小化序列差之和(即从连续集合中选择的元素之间的差之和)。DP 中的前向计算如下:
令 F(i, j) 为从集合 i 中选择元素 j 的成本。
F(i, j) = min_k F(i - 1, k) + |x(i-1,k) - x(i, j)|
也就是说,我们在前一个集合中选择第 k 个元素,然后评估在当前集合中选择第 j 个元素的成本。当前步骤的成本等于集合 i-1 中的第 k 个元素与集合 i 中的第 j 个元素之间的绝对差。
但是,我真正的问题不取决于集合 X_1,... X_n 的顺序。从本质上讲,动态规划给了我一些东西,但正如我所说,这是一个相关但不同的问题,即从每个集合中找到元素的“链”,以使“串行”差异的总和最小化。
从基本分析中,我发现这个问题的一个简单的解决方案是生成 n 个集合的所有排列,然后对每个排列使用动态规划来解决它。这是棘手的,但当 n 足够小时 - 我们甚至可以采用这种愚蠢的穷举方法。
我无法弄清楚这个问题是否可以使用多项式算法来解决,或者是否可以将其简化为已知的 NP-hard/complete 问题之一,在这种情况下,我将使用近似算法通过将其建模为二次程序。
请给我建议或指出一些阅读材料。
谢谢。
[编辑 1]
为了方便讨论,这里添加一个例子:
X = [[11, 24, 38], [12, 21, 33], [13, 22], [15, 23]]
解决方案是 24、21、22、23(可能不相关,但我的 DP 给了我 11、12、13、15,我构建了这个示例,特别是为了让我的 DP 失败。
[编辑 2]
我猜这不是一个 NP 完全问题。我们可以从DP扩展的解决方案如下[不确定是否正确,但似乎是这样]:
解决方案至少包含每个集合中的一个元素。
所以,让我们选择任何一组(最好是最小的,如果大小不同),然后将其从列表中删除。
我们称它为 X\Xp,其中 Xp 是移除的集合。
现在对于 \Xp 中的每个元素 x,构造一个新集合 X' = X\Xp U {x}。
我们求解 DP m 次并计算目标函数(成对距离之和),然后我们可以从中选出最好的。
DP 本身需要 O(nm^2) 并且我们运行这个 m 次,所以我们有 O(nm^3)。
【问题讨论】:
-
好问题。 (+1)闻起来 NP-Hardish,但我现在想不出减少的味道。希望有人能提出一个(或多项式解决方案)
-
谢谢;不幸的是,它看起来像是一个 np-complete!幸运的是,SO 可以让您知道这一点!
-
我认为这不是 NP-Hard,最多可以在 O(nnm) 时间内解决:只需从每个集合中取出一个最小元素并插入一些容器,然后获取该容器的中值,并不断将某个集合的元素替换为下一个集合,使其与中值的距离与其他集合相比减少最多(或增加最少);在每次迭代之后,将得到的距离总和与迄今为止的最佳结果进行比较,并在必要时对其进行更新。我没有最优性的证据。另外我怀疑如果数据结构合适,这可能会改进到 O(n*log(n)*m)。
-
@EvgenyKluev 将此应用于我的示例,我选择 [11, 12, 13, 15]。中位数为 12.5;从这一点上我不明白 - 因为这是与中位数距离最小的集合,用其他任何东西替换只会增加目标。如果我理解正确,请告诉我。
-
首先将 12 替换为同一集合中的下一个元素 (21),从而得出到中位数 12 的距离总和:[11,13,15,21]。然后你替换其他值:[11,15,21,22],然后是 [15,21,22,24],然后是 [21,22,23,24],最后是 [22, 23,24,33]。这些选择之一给出了最佳结果。至于最优性的证明,我认为归纳证明应该在这里有效,但它会相当复杂。
标签: algorithm dynamic-programming