Algorithm 在两个不同大小的集合中匹配每一个点,使总线条长度最小

Algorithm 在两个不同大小的集合中匹配每一个点,使总线条长度最小,algorithm,Algorithm,我在坐标系中绘制了两组点。一个集合中的每个点必须至少与另一集合中的一个点相匹配,通过连接这些点绘制的线的长度总和应尽可能低。清楚地说,线条画只是一种抽象,实际输出只是必须匹配的点对 我看到过类似的问题,只是在我的例子中没有单链接限制,因为集合可能有不同的大小。有什么问题可以描述这种情况吗?更具体地说,假设每个集合最多有10个点,我可以使用什么算法来解决这个问题?算法 您可以将其建模为网络流问题 通过在第一个集合中的每个点上都有一个1的源,在第二个集合中的每个点上都有一个1的汇,再加上一个额外的节

我在坐标系中绘制了两组点。一个集合中的每个点必须至少与另一集合中的一个点相匹配,通过连接这些点绘制的线的长度总和应尽可能低。清楚地说,线条画只是一种抽象,实际输出只是必须匹配的点对

我看到过类似的问题,只是在我的例子中没有单链接限制,因为集合可能有不同的大小。有什么问题可以描述这种情况吗?更具体地说,假设每个集合最多有10个点,我可以使用什么算法来解决这个问题?

算法 您可以将其建模为网络流问题

通过在第一个集合中的每个点上都有一个1的源,在第二个集合中的每个点上都有一个1的汇,再加上一个额外的节点“dest”用于任何剩余容量,任何有效流都将始终连接每个点

根据点之间的距离以成本在点之间制作边

到目前为止,我们有一个网络,其解决方案将是集合1到集合2的最低成本匹配(即,每个点将有一个链接)

要允许多个链接,只需添加以下内容:

  • 在集合2中的每个点和“dest”之间添加0个权重边(这允许集合2中的点进行多重连接)
  • 在“dest”和集合2中的每个点之间添加0个权重边(这允许集合1中的点进行多重连接)
  • 使用Networkx的Python代码示例
    您可以使用离散优化方法()

    我们有两组大小为X的A和大小为Y的B。这意味着最多有X*Y个链接,每个链接由一个布尔变量描述:如果节点A(i)和B(j)链接,则L(Y*i+j)为1,否则为0。如果X=Y=10,我们可以将链接L(7,3)写成L73

    我们可以这样重写这个问题:

    节点A(i)具有至少一个链路:X(例如,十个)标准,其中i从0到X-1,每个标准由Y个分量组成:

        L(i,0)+L(i,1)+L(i,2)+...+L(i,Y-1) >= 1
    
    Node B(j) has at least one link, and there are Y criteria made up of X components:
    
        L(0,j)+L(1,j)+L(2,j)+...+L(X-1,j) >= 1
    
    最低成本要求为:

    cost = SUM(C(0,0)*L(0,0)+C(0,1)*L(0,1)+...+C(9,9)*L(9,9) 
    
    通过这些约定,我们可以轻松地为ILP问题构建矩阵,这些矩阵可以传递给我们最喜欢的ILP解决包或库(C、Java、Python甚至PHP)

    ====

    一个自包含的“贪婪”算法不能保证找到一个最小值,但速度相当快,应该给出合理的结果,除非您向其提供病理数据集,它是:

    - connect all points in the smaller set, each to its nearest point in the other set.
    - connect all unconnected points remaining in the larger set, each to its
      nearest point in the first set, whether it's already connected or not.
    

    作为优化,您可以枚举较大数据集中的点;如果其中一个(比如A)单独连接到第一个数据集(比如B)中的一个点,该点是多重连接的,而不是它的最近邻C,则可以将链接从A-B切换到A-C。这解决了算法“贪婪”可能产生的最简单问题之一。

    我以前从未听说过整数规划。这很有趣,但我想我会先试试里瓦斯的方法。另一方面,我的临时解决方案与您描述的贪婪算法完全相同,但没有这些优化。我也会调查一下。
    - connect all points in the smaller set, each to its nearest point in the other set.
    - connect all unconnected points remaining in the larger set, each to its
      nearest point in the first set, whether it's already connected or not.