从给定的n组整数中选择一个整数,使得它们的成对距离之和最小化

时间:2013-07-13 07:29:24

标签: algorithm dynamic-programming

我不知道这是一个众所周知的问题还是可以简化为一个问题,但这是我最近几天以来一直在努力解决的问题。

设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的顺序。从本质上讲,动态编程给了我一些东西,但正如我所说,这是一个相关但不同的问题,即找到元素的“链”,每个元素一个,这样“串行”差异的总和最小化。 / p>

从基本分析中,我发现这个问题的一个天真的解决方案是生成n个集合的所有排列,然后使用动态编程为每个排列解决它。这是难以处理的,但是当n足够小时 - 我们甚至可以采用这种愚蠢的详尽方法。

我无法弄清楚是否可以使用多项式算法解决这个问题,或者如果它可以简化为已知的NP难/完全问题之一,在这种情况下,我将寻找近似算法通过将其建模为二次规划。

请告诉我或给我一些阅读材料。

感谢。

[编辑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)。

2 个答案:

答案 0 :(得分:1)

这可以减少在加权图中找到最小权重集。 不同集合中的任何两个节点的权重等于其差异的绝对值。

答案 1 :(得分:1)

我认为这不是NP完全的,因为我认为我们可以找到并识别最多O(n ^ 2m ^ 2)猜测的解决方案。

为了不担心关系,从整数到实数并添加非常少量的抖动。我认为这是随机的,但我认为你可以选择确定性抖动来达到同样的效果。

将问题视为从实线上的一系列彩色点中进行选择,以便选择每种颜色的一个点,并最小化它们之间的绝对差异之和。

我只考虑n是偶数的情况。解决点集的中值出现在两个中心点之间。对于解集中的每个点,它与两个中心点之间没有相同颜色的点(或者我们可以改进解决方案)。出于同样的原因,如果我们从解决方案集中删除它,那么每个点是该颜色与我们得到的n-1个点的中位数的最接近点。

使用我们的(nm)^ 2猜测,我们猜测解集中两个中心点的身份。这使得我们找到了n-2个点,并且我们可以减少每种颜色中两种颜色的可能性,这两种颜色的两侧最靠近两个中心点。

现在考虑从解决方案集中删除一个点形成的中位数。如果我们移除的点位于两个中心点的右侧,则中位数是这两个点的左侧。如果我们移除的点位于左侧,则中位数是这两个点的右侧。在一个解集中,我们刚删除的点比那个颜色的任何其他点更接近新的中位数,并且新的中位数是它的两个中心点中的更远。所以我们可以将它与同一颜色的另一个候选者区分开来 - 两者中哪一个最接近两个中心点的其他部分。

因此,通过最多进行O(n ^ 2 * m ^ 2)猜测,我们可以为每个get找到一个可能的解集,并且从这些解集中我们选择具有最小目标的解集来获得全局最小值。每个猜测需要一些工作 - 也许是O(m)所以这可能是一个O(n ^ 2立方公尺),具有完全天真的实现 - 可能主要是理论方法。

也许这太好了不可能,但是我们可以把它变成简单地检查数据中每个点以及最接近它的每个其他颜色的点的证明吗?一个论点是,如果我们有两个点并且我们可以将解中的每个点识别为最接近两个点中的最远点,则该点也必须最接近该对中的另一个点。因此,猜测对中的任一点并找到最接近的点可能会起作用。这看起来很像是Evgeny Kluev解决方案的证明