我想找到一个更好的算法来解决以下问题:
2D中有 N 起点(紫色)和 N 目标点(绿色)。我想要一种算法,通过线段(棕色)将起点连接到目标点,而不会使这些段交叉(红色),同时最小化所有段的累积长度。
我在C ++中的第一个努力是置换所有可能的状态,找到无交叉状态,以及总段长度 O(n!)的状态。但我认为必须有更好的方法。
有什么想法吗?或者搜索好的关键词?
答案 0 :(得分:38)
这是Minimum Euclidean Matching in 2D。该链接包含有关此问题的已知内容的参考书目。鉴于您希望最小化总长度,非交叉约束是多余的,因为交叉的任何一对段的长度可以通过非交叉来减少。
答案 1 :(得分:2)
您可以选择随机连接,然后每次删除一个交叉(实际上更改其端点的连接),此算法在有限步骤中工作并完成。也许你说切换十字架导致新的十字架,无论如何,每次通过切换一个十字架,你将最小化你的答案的总长度,这种方式不能是无限的(因为线的总长度是有限的)。实际上在O(F * n ^ 2)中工作F= sum of all line segments * power of 10
(使其为整数)。这个O非常乐观,我认为如果你尝试这个简单的算法它会工作正常。当然,它一般比蛮力更好。
答案 2 :(得分:1)
看起来你可以使用BSP-type算法。
答案 3 :(得分:1)
使用此算法的订单 O(n 3 ):
Hungarian algorithm是一种组合优化算法 这解决了多项式时间内的赋值问题。
它有什么用?那么,它只会找到最小累积长度。但...
当总长度最小时,没有交叉点。
因此,@ qq3表示交集约束是冗余的,并且在删除此约束后,它可以减少从 O(n!)到 O的顺序(n 3 < / SUP>)