连接线段中set的点

时间:2013-12-04 18:42:59

标签: algorithm geometry

我已经完成了一项任务,我必须连接2D平面中的所有点。 有四个条件需要满足:

  1. 连接在一起的所有段的长度必须最小。
  2. 一个点可以只是一个线段的一部分。
  3. 线段不能相交
  4. 必须使用所有点(不能单独使用,但只有在无法避免的情况下才能使用)
  5. 图像可视化问题: enter image description here

    错误的图像连接点正确,但总长度大于左侧的图像。

    起初我考虑过对点进行排序并使用扫描线进行排序并构建所有可能性的树,尽管它似乎是一种复杂解决方案,具有极大的复杂性。因此,我寻找更好的方法。我会很感激一些提示要做什么,或者我怎么能解决这个问题。

4 个答案:

答案 0 :(得分:1)

我将从点集的Delaunay三角剖分开始。这应该已经为您提供了每个点的最近邻居连接而没有任何交叉点。 在下一步中,我将查看三角测量产生的三角形 - 这里方便的属性是基于您的规则集,您可以从每个三角形中精确选取一侧,并从选择中删除剩余的两个。

现在仍然存在的问题是选择那些给你最小总和的边,当然这并不总是最小的一边,因为那个边可能已经被相邻的三角形阻挡了。我从贪婪的方法开始,总是选择尚未被相邻三角形阻挡的最小剩余边缘。

编辑:在下一步中,您将检索该三角测量中所有边的列表,并按长度对其进行排序。您还可以创建另一个列表,在该列表中计算每个点的连接数。现在,您遍历从最长边到最短边的边列表,并在连接计数列表中检查它连接的两个点:如果每个点仍然有多于1个连接,则可以丢弃边并减小涉及的两点的连接数。如果至少有一个点只剩下一个连接,那么你已经找到了自己想要的边缘之一。你重复这个过程,直到没有剩下的边缘,这应该有希望给你最小的边缘和。

如果我没有弄错的话,这个问题与NP-Hard的背包问题有很大的关系,所以我不确定这个解决方案是否能给你最好的解决方案。

答案 1 :(得分:1)

我说这是着名的旅行商问题的延伸。

一种好的技术(如果有点过时)是使用模拟退火优化技术。

您需要调整成本(a.k.a。目标)功能以错过路径的各个部分。但考虑到候选人的连续路径,确定错过哪些部分以最小化其长度是相当微不足道的。 (您首先删除任何相交线的较长时间。)

答案 2 :(得分:0)

哇,这是一个棘手的问题。这是很多要满足的条件。

我认为从编程的角度来看,“最简单”的解决方案实际上可能只是循环,找到满足最后3个条件的所有可能性,并在循环时记录总长度,然后选择一个最短的长度 - 蛮力,猜测和检查。我认为当你提到“扫地线并建造所有可能性的树”时,这就是你在OP中所指的。这种方法在计算上非常昂贵,但如果代码写得正确,它应该总是最终工作。

如果你想要“最佳”解决方案,你想立即解决单个最终答案,我担心我的数学技能不够强 - 我甚至不确定是否有对任何任意点集合的任何单一分析解决方案。也许可以尝试与MathOverflow处的人联系。如果那边的人可以用计算后面的数学解释你,然后你仍然需要帮助将这个数学转换成某种编程语言的代码,请在这里更新你的问题(可能有他们为你提供的答案的链接)和我相信从那时起我就能帮助你。

答案 3 :(得分:0)

其中一种可能的解决方案是使用图论。

构造二分图G,使得每个点在两个部分都有其副本。现在将点i and jweight = i == j ? infinity : distance[i][j]之间的边缘放置。图表中的最小权重最大匹配将是您想要的配置。

请注意,由于这是在欧几维2D平面上,匹配的结果“边”不会相交。假设边ABXY与点A, B, X, Y相交。然后匹配不是最小权重,因为AX, BYAY, BX将产生较小的总权重而没有交集(这来自三角不等式a + b> c)