如何解决涵盖所有N + 1点的最短距离所有N个点都位于x轴上剩下的一点位于坐标平面的任何位置 没有重复的点排列后续步骤非头部的路径
给出(N+1)
分。所有N个点都位于x轴上。剩下的一个点(HEAD点)位于坐标平面的任何位置。
在x轴上有一个起始点。
找到最短的距离以覆盖从START点开始的所有点。我们可以多次遍历一个点。
示例N+1=4
x轴上的点(0,1),(0,2),3)
HEAD点 (1,1)
//只有头点可以位于任何位置//在x轴上全部静止
开始点 (0,1)
我正在寻找一种解决该问题的方法。 是应该先访问HEAD点还是访问HEAD点。
解决方法
我试图找到一种使用图论的方法来简化此问题并减少需要考虑的路径。如果有一种优雅的方法可以使用图形来表示此问题来确定解决方案,那么我将找不到它。随着 n 的增加,这种方法变得非常无效率-时间和内存为O(2 ^ n)。
将其视为树形图,其根节点将成为START点,然后其每个子节点将成为其连接点。
由于起始点和HEAD以外的其余所有点都位于x轴上,因此所有非HEAD点仅需要连接到x轴上的相邻点。这是因为任意两点之间的路径距离是沿这两点之间的路径的任何相邻点之间的距离的总和(代表x轴上点的节点子集不需要形成完整的图) 。这样可以减少一些暴力手段。
这是一个简单的例子:
左上角显示了原始问题:x轴上的点以及START和HEAD点。
在右上角,这已转换成图形,每个节点代表原始问题的一个点。边表示点之间可以采用的路径。假定起始点仅代表路径中的第一个点。与其他节点不同,它仅包含在路径中一次。如果不是这种情况,并且路径可以返回到起始点,则这将使可能的路径大约增加一倍,但是可以采用相同的方法。
在左下方,起始点 a 是树形图的根,连接到该起始点的每个节点都是一个子节点。对于每个子节点重复此过程,直到:
- 识别出显然不是最佳的路径,在这种情况下,可以从图中排除该节点。看到红色框中的节点;在相同节点之间来回移动是不必要的。
- 从根到节点遍历树时会包括所有点,从而产生潜在的解决方案。
请注意,在创建树形图时,每次重复一个节点,其“潜在”子节点与首次包含该节点相同。所谓“潜在”,是指上面的情况仍然需要检查,因为结果可能包括不合理的路径,在这种情况下将不包括该节点。在包含其子节点之后,路径可能还会产生潜在的解决方案。
最后一步是为每个潜在解决方案求和,以确定哪个路径最短。
,这需要仔细检查不同的情况。
现在假设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可能是一个更好的地方。
,这是一个有趣的问题。首先,让我们尝试像Poosh那样找到一种蛮力解决方案。
关于最短路径的观察
没有重复的点
您处于欧几里得几何中,因此三角形不等式成立:对于所有点a,b,c,距离d(a,b)+ d(b,c)
排列
因此,我们的问题是找到点P1 ... Pn(其中P0是固定起始点,Pn是起始点P1 ...)的数字1 ... n的置换,将其称为M_i。 Pn-1通过增加x值来排序),从而使|(P_M_i)-(P_M_(i-1))|的和最小对于我从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 .:我不是数学家,所以我可能在某些概念上使用了错误的单词,并错过了变量和函数的常用符号。我很乐意让一些专家检查是否有任何明显的错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。