[英]Partitioning the array into k non-empty non-intersecting subsegments such that each subsegment has odd sum
[英]Non-intersecting line segments while minimizing the cumulative length
我想找到一个更好的算法来解决以下问题:
二维中有N 个起点(紫色)和N 个目标点(绿色)。 我想要一种算法,通过线段(棕色)将起点连接到目标点,而这些线段中没有任何线段相交(红色),同时最小化所有线段的累积长度。
我在 C++ 中的第一个努力是置换所有可能的状态,找到无交集的状态,以及那些总段长度最小的状态O(n!) 。 但我认为必须有更好的方法。
任何的想法? 或者好的搜索关键字?
这是2D 中的最小欧几里得匹配。 该链接包含有关此问题的已知内容的参考书目。 鉴于您想最小化总长度,非相交约束是多余的,因为任何相交的线段的长度都可以通过不相交来减少。
您可以选择随机连接,然后每次通过更改其端点的连接来删除一个交叉。 此操作减少了总长度(通过三角不等式)。 由于相互交叉的线的方式数量是有限的,因此在有限数量的步骤中我们可以得到一个非交叉的解决方案。 在实践中,它应该很快收敛。
按照qq3的回答说交叉约束是多余的,还有一步。 将起点分配给终点,同时最小化总长度。 幸运的是,有一个多项式时间算法:
匈牙利算法是一种在多项式时间内解决分配问题的组合优化算法。
它将时间顺序从O(n!) 减少到O(n 3 ) 。
看起来您可以使用BSP 类型的算法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.