算法:连接器的优化

时间:2016-09-24 09:41:49

标签: algorithm optimization

假设3D空间中有n个不同的点,即P1, P2, P3, ..., Pn

将连接符C定义为一组有序的线段,其中集合中的下一个元素应与前一个共享一个公共顶点。例如,{ P1-P2, P2-P4, P4-P7 }是连接符,而{ P1-P2, P3-P4,P4-P2 }则不是。

定义连接器的内容,作为连接器包含的点集。

定义连接器的大小,即连接器中最长单个段的长度。

如果最长的单个段是连接器中的第一个或最后一个段,则将连接器定义为正确的连接器。

如果点上的连接器内容的并集是一组点,则称一组点连接。

问题是:

鉴于k具有相同幅度k < n的正确连接器(m)可以连接n点,其坐标为最小值,{{1} }。

算法的要点是什么?我不知道从哪里开始。

2 个答案:

答案 0 :(得分:0)

一个想法是从最远点开始,即与其他点的邻居相比,它最近的邻居是最远的。然后从中构建一个连接器,始终添加下一个点的最近邻居,直到你不能在不违反其中一个规则的情况下添加更多的点:

  • 连接器不能有循环(一个点只能访问一次)
  • 正确的连接器的边缘不能大于第一个

注意:最后一个条件太强了,因为可以允许适当连接器的最后一个边缘比第一个边缘大,但我考虑到算法也会用这样的“最后”边缘再做一次尝试作为第一个边缘,但方向相反:所以我可以在这个阶段排除那个边缘。

一旦找到这样合适的连接器,算法就可以回溯并尝试在另一个方向上分支,再次尽可能地进行。这种递归分支将导致一组适当的连接器。如果该集合至少有k个连接器,并且所有点都被至少一个这样的连接器覆盖,那么这是一个解决方案。

如果不能解决问题,可以重复整个逻辑,但这次第一条边必须有更大的尺寸。因此,将找到一个点,其中到最近邻居的距离(至少具有该距离)最大化。

以下是这种算法的更正式的草图:

Pre-processing:
    List for each point all the other points in order of increasing distance from it.

    set m = 0

Repeat:
    set max_dist = 0, list = empty
    For each point p:
        Find the first neighbor q for which distance(p,q) > m
        if distance(p,q) >= max_dist:
            if distance(p,q) > max_dist:
                clear list
            append (p,q) to the list

    let m = max_dist
    For each pair (p,q) in the list (all these pairs have same distance m):
        Let result = []
        Let connector be [p,q]
        Let p = q

        Recursive part (p):
            let end_point = True
            For each neighbor q of p (in order of distance):
                If distance(p,q) > m: 
                    break loop
                If q not in connector:
                    let end_point = False
                    Append q to connector
                    Call the recursive part for q
                    size(result) >= k and all points are in result:
                        exit recursion
                    Remove q from connector (backtracking)

            If end_point:
                append clone of connector to result

        If size(result) >= k and all points are in result:
            return m, as final result

答案 1 :(得分:0)

一些一般性的想法。您的问题可能有多种解决方案。我首先考虑一种蛮力方法,然后考虑是否可以改进该算法。另一个好方法是找到一个更容易解决的类似问题,并尝试将其转换为类似的问题。由于你不在问题中,我不会触及正确性和时间复杂性。

蛮力通常意味着尝试每种组合。构建涵盖所有节点的每个可能的连接链。

贪心算法:从随机节点开始。创建到最近节点的连接器。然后创建从该节点到其最近节点的连接器,该节点尚未连接。重复,直到所有节点都连接完毕。这可能并不总能给出最佳结果。

迭代方法:使用任何方法连接所有节点。然后尝试交换节点。选择具有最高幅度和Q随机连接器的节点B,连接器AB,BC和PQ,QR。产生AQ,QC和PB,BR并在其幅度减小时保持掉期。

也许可以使用线性编程