最小的对数

时间:2010-02-07 15:21:29

标签: c++ c algorithm math

2D平面中给出 2N-points ,您必须将它们分组为 N对,以便它们之间的总距离所有对的点数是最小可能值。所需的输出只是总和。

换句话说,如果 a1,a2,.. an 分别是第一,第二......和第n对的点之间的距离,则(a1 + a2 + ... a)应该是最小的。

如果 2 * 5 点是:我们考虑这个测试用例: 的 {20,20}, {40,20}, {10,10}, {2,2}, {240,6}, {12,12}, {100,120}, {6,48}, {12,18}, {0,0}

所需的输出 237

这不是我的功课,我对不同的方法而不是蛮力的好奇。

3 个答案:

答案 0 :(得分:7)

您似乎在寻找Minimum weight perfect matching

有一些算法可以利用这些是平面中的点的事实。本文:Mincost Perfect Matching in the Plane有一个算法,并且还提到了之前的一些工作。


根据要求,这里是图表中最小加权完美匹配的“简单”算法的简要描述。这是Papadimitriou& Sons书中组合优化,算法和复杂性一书中有关加权匹配的章节部分的简短摘要。 Steiglitz。

假设您获得了加权无向图G(具有偶数个节点)。通过添加缺失的边并为它们分配非常大的权重,可以将图形视为完整的加权图。

假设顶点标记为1到n,顶点i和j之间的边的权重为c(i,j)。

我们有n(n-1)/ 2个变量x(i,j),如果i和j之间的边在匹配中,则表示G. x(i,j)= 1的匹配x(i) ,j)= 0如果不是。

现在匹配问题可以写成线性规划问题:

最小化Sum c(i,j)* x(i,j)

受条件

的影响

Sum x(1,j)= 1 ,其中j的范围是1到n。

Sum x(2,j)= 1 ,其中j的范围是1到n。 。 。

Sum x(n,j)= 1 ,其中j的范围是1到n。

(Sum x(1,j)= 1基本上意味着我们正在选择一个边缘标记为1的顶点。)

最后的条件是

x(i,j)> = 0

(我们可以说x(i,j)= 0或1,但这不会使这成为线性规划问题,因为约束是线性方程或不等式)

有一种叫做Simplex方法的方法可以解决这个线性规划问题,从而在多项式时间内给出变量数的最优解。

现在,如果G是二分的,可以证明我们可以得到一个最优解,使得x(i,j)= 0或1.因此,通过求解二分图的线性规划问题,我们得到一个集合每个x(i,j)的赋值,每个都是0或1.我们现在可以通过选择x(i,j)= 1的那些边(i,j)得到匹配。约束保证它将是匹配最小的重量。

不幸的是,对于一般图(即x(i,j)为0或1),情况并非如此。埃德蒙兹发现这是因为图中存在奇数周期。

因此除了上述约束之外,Edmonds还增加了额外的约束条件,即在大小为2k + 1(即奇数大小)的任何顶点子集中,匹配边的数量不超过k

枚举每个奇数顶点子集以获得集合S(1),S(2),...,S(2 ^ n - n)的集合。设S(r)的大小为2 * s(r)+ 1。

然后,对于每个集合S(r)

,上述约束

Sum x(i,j)+ y(r)= s(r) ,对于i,j在S(r)中。

Edmonds随后证明这足以保证每个x(i,j)为0或1,从而为我们提供最小权重完美匹配。

不幸的是,现在变量的数量已变成指数级。因此,单纯形算法,如果只是按原样运行,将导致指数时间算法。

为了解决这个问题,Edmonds考虑了这个线性编程问题的双重性(我不会在这里详细介绍),并且表明在双重运行时的原始对偶算法只需要O(n ^ 4)步达成解决方案,从而给我们一个多项式时间算法!他通过显示在算法的任何一步(他称之为开花)的y(r)中至多O(n)非零来表明这一点。

这是一个链接,应该更详细地解释一下:http://www.cs.ucl.ac.uk/staff/V.Kolmogorov/papers/blossom5.pdf,第2节。

我之前提到的这本书值得一读(虽然可能有点干)但要深入了解。

呼。希望有所帮助!


答案 1 :(得分:1)

您的最终金额将主要由最大的加数支配。利用这个的最简单的算法可能是这样的(我无法证明这一点):

  1. 按最近邻距离递减的排序点
  2. 形成第一个条目对及其最近邻居
  3. 从列表中删除对
  4. 如果列表不是空的转到1。
  5. 这应该经常发挥作用。

    由于您基本上正在为2 this link的群集寻找群集算法,或者搜索clustering algorithms for jet reconstruction可能会很有趣。实验粒子物理学界的人们正在研究这类问题的启发式算法。

答案 2 :(得分:0)

在谷歌搜索了一段时间后,我发现了一些其他参考最小权重完美匹配算法,这些算法可能更容易理解(至少在某种程度上更容易)。

修改

Here I found a python implementation其中一种算法。它有837行代码(+一些额外的单元测试),我自己也没试过。但也许你可以将它用于你的情况。

Here is a link到该问题的近似算法。当然,论文的风格也是数学的,但恕我直言比Cook和Rohe的论文更容易理解。并且它在序言中指出,它的目的是为了比Edmond的原始算法更容易实现,因为您不需要线性编程求解器。

EDIT2:

在考虑了一下这个问题之后,恕我直言,必须能够设置A*搜索来解决这个问题。这里的搜索空间是“部分匹配”(或部分配对的点集)的集合。正如Moron在他的评论中已经写过的那样,人们可以将搜索限制在没有交叉连线的对的情况下。路径成本函数(使用来自维基百科的术语)是已配对点的距离之和。启发式函数h(x)可以是对剩余距离的任何低估,例如,当您到目前为止没有配对的2M点时,取所有M之间的最小距离的总和剩下的那些点。

那个可能不如Moron指出的算法效率高,但我怀疑它会比'暴力'好得多,而且更容易实现。