【问题标题】:Shortest distance to cover all the (N+1) points. All the N points lie on x- axis. Remaining one point lies anywhere in the coordinate plane覆盖所有 (N+1) 个点的最短距离。所有 N 个点都位于 x 轴上。剩余一点位于坐标平面的任意位置
【发布时间】:2020-11-01 11:14:12
【问题描述】:

给定(N+1) 点。所有 N 个点都位于 x 轴上。剩余的一个点(HEAD 点)位于坐标平面中的任意位置。 给定 x 轴上的起点。

找到从START点开始覆盖所有点的最短距离。我们可以多次遍历一个点。

例如N+1=4

x 轴上的点
(0,1),(0,2),(0,3)

HEAD Point
(1,1) //只有head point可以在任意位置 //全部在x轴上

起点
(0,1)

我正在寻找一种方法来解决这个问题。 我们应该先访问 HEAD 点还是中间的 HEAD 点。

【问题讨论】:

  • 让我们看看我是否理解问题所在。您想找到一条路径,该路径至少经过每个点一次,并且从起点开始。您还希望路径从特定点开始。 HEAD 点何时在路径中并不重要,路径可以在任何点结束。您想要具有最小长度的路径。
  • 是的,我想找到至少通过每个点的路径,包括 HEAD,并且从 START 点开始。 HEAD 点何时在路径中也无关紧要。我想知道路径,以便找到距离或只是为我提供路径的方法。因此,这是一个基于数学的编码问题。如果没有这样的方法,最后的选择是尝试所有可能的排列并增加从 START 到排列开始点的距离。

标签: math distance coordinate-systems


【解决方案1】:

我试图找到一种使用图论的方法来简化这个问题并减少需要考虑的路径。如果有一种优雅的方法可以使用图形来确定解决方案来表示这个问题,我找不到它。随着 n 的增加,这种方法变得非常低效 - 时间和内存为 O(2^n)。

将此视为树形图,根节点将是起始点,然后它的每个子节点将是它所连接的点。

由于 START 点和除 HEAD 之外的其余点都位于 x 轴上,因此所有非 HEAD 点只需连接到 x 轴上的相邻点即可。这是因为任意两点之间的路径距离是这两个点之间的路径上任意相邻点之间的距离之和(表示x轴上点的节点子集不需要形成完整的图) .这减少了一些蛮力方法。

这是一个简单的例子:

左上角显示了原始问题:x 轴上的点以及 START 和 HEAD 点。

在右上角,这已转换为一个图形,每个节点代表原始问题中的一个点。边表示点之间可以采用的路径。这假定 START 点仅代表路径中的第一个点。与其他节点不同,它只包含在路径中一次。如果不是这种情况并且路径可以返回到 START 点,这将使可能的路径增加大约一倍,但可以遵循相同的方法。

在左下角,START点a是树形图的根,与START点相连的每个节点都是一个子节点。对每个子节点重复此过程,直到:

  • 识别出明显不是最优的路径,在这种情况下,可以从图中排除该节点。查看红色框中的节点;不需要在同一个节点之间来回走动。
  • 当从根遍历树到该节点时,所有点都会被包括在内,从而产生潜在的解决方案。

请注意,在创建树形图时,每次重复一个节点时,其“潜在”子节点与第一次包含该节点时相同。通过“潜在”,我的意思是仍然需要检查上述情况,因为结果可能包含一条无意义的路径,在这种情况下,该节点将不包括在内。在包含其子节点之后,路径也可能产生潜在的解决方案。

最后一步是将每个潜在解决方案的距离相加,以确定哪条路径最短。

【讨论】:

    【解决方案2】:

    这需要仔细检查不同的情况。

    现在假设 START (S) 在最左边,而 HEAD (H) 在中间某处,路径可能类似于

                        H
                       / \
    S ---- * ----*----*   * --- * ----*
    

    或者从 H 到另一个节点的时间可能更短

                       H
                      //
    S ---- * --- * -- *----------*---*
    

    如果 S 不在一端,您可能会有类似的东西

                        H
                       / \
    * ---- * ----*----*   * --- * ----*
      --------S
    

    甚至第一步直接从S到H

                        H
                       / |
    * ---- * ----*----*  |
                         S
    

    对案例的全面分析将是相当广泛的。

    实际解决问题,可能取决于您拥有的节点数量。如果数字小于 10,则可以进行竞争枚举。只需找出所有可能的路径,消除非法的路径,然后选择最小的路径。路径的数量我认为是 n! 的顺序,所以它对于小 n 是可计算的。

    对于较大的 n,您可以将问题分解为小段。我认为只考虑 H 两侧有节点的小补丁和 S 两侧有节点的小补丁就足够了。

    这并不是真正的解决方案,而是一种考虑解决问题的可能方式。

    (迂腐的 stackoverflow.com 不是堆栈交换网络中此问题的正确站点。Computational Science : algorithms 可能是一个更好的地方。

    【讨论】:

      【解决方案3】:

      这是一个有趣的问题。首先,让我们尝试像 Poosh 那样找到一个蛮力解决方案。

      关于最短路径的观察

      无重复点

      您处于欧几里得几何中,因此三角不等式成立:对于所有点 a,b,c,距离 d(a,b) + d(b,c)

      排列

      因此,我们的问题是找到点 P1...Pn 的数字 1...n 的排列,我们称之为 M_i(其中 P0 是固定起点,Pn 是头点,P1... Pn-1 是通过增加 x 值来排序的,它使 |(P_M_i)-(P_M_(i-1))| 的总和最小化。对于 i 从 1 到 n,||为向量长度 sqrt(v_x²+v_y²)。

      一组大小为 n 的排列数是 n!。在这种情况下,我们有 n+1 个点,因此测试所有排列的蛮力方法将具有复杂性 (n+1)!,这甚至高于 2^n 并且绝对不实用,因此我们需要进一步的观察来改进这一点。

      后续步骤

      我现在的下一步是看看是否有任何其他序列可以被证明不是最优的,从而减少要测试的候选者数量。

      非头部点的路径

      让我们看看所有路径(不包含头点并且是最佳路径部分的点的索引序列。如果我们不更改路径的起点和终点,那么任何其他转置对外部环境没有影响,我们可以执行纯局部优化。我们可以证明这些序列必须具有单调(增加或减少)x 坐标值,因此是单调索引(因为它们通过索引 0 和 n 之间的 x 坐标升序排序-1): 我们处于纯一维子空间中,因此路径的总距离等于一个此类点与下一个此类点之间的 x 坐标差的绝对值之和。很明显,通过按 x 坐标以升序或降序排序,从而以相同的方式对索引进行排序,可以最小化这个总和。请注意,这适用于最大此类路径以及它们的所有连续“子路径”。

      总结

      我们剩下的唯一选择是:

      • 我们将头节点放置在最佳路径中的什么位置?
      • 我们以哪种方式对左右两条路径进行排序?

      这意味着我们有 n 个值作为头节点的索引(1...n,0 固定为起始节点)和 2x2 个值用于排序顺序。所以我们有 4n 个选择,我们都可以计算并选择最短的一个。其中一个排序顺序可能决定了另一个,但我把它留给你。

      无论如何,这个算法的复杂度是 O(4n) = O(n)。因为读取问题的输入是 O(n) 并且写入输出也是如此,我相信这是一种具有最佳复杂度的算法。但是,如果我们可以对问题进行一些重新表述,以便我们可以以某种压缩形式读取和写入输入和输出,例如仅使用我们实际解决问题所需的参数,那么我们可能会做得更好。

      P.S.:我不是数学家,所以我可能对某些概念使用了错误的词,并且错过了变量和函数的常用符号。如果有任何明显的错误,我会很高兴请专家检查一下。

      【讨论】:

      • 我认为在第一个例子中,最优路径可以包含多次相同的点;它只是不能在任何两对点之间遍历一次以上。我还认为我对图论的了解不足以简化该方法的问题,并且可能存在具有某些属性的特定类型的图会阻止蛮力方法。如果 HEAD 和 START 点水平位于其余点之间,则必须多次遍历某些点。有趣但就是想不出一个好的表现形式!
      • 实际上,现在我想知道 - 最大边数必须有一些限制 - 它必须小于或等于带有 n 个顶点,对吧?所以深度将是 n + (n - 1) + (n - 2) + ... + 0 = 0.5(n^2-n),所以这将是树的必要深度。除非我在这个最大深度假设中遗漏了一些东西,否则这将适用于多项式时间而不是指数。
      • 我猜你肯定不需要从每个点到每个其他点,所以我们知道路径的距离必须小于每对点之间的距离之和.如果添加其任何子节点会导致路径的距离大于最大值,则该节点将成为叶子。树包含所有可能的路径。所以那将是 O(n^2)... 也许?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      相关资源
      最近更新 更多