我希望能找到一种更好的算法来解决以下问题:
在二维平面上有N个起点(紫色)和N个目标点(绿色),我想要一个连接起点和目标点的算法,通过线段(棕色)相连接,且不出现任何相交(红色),同时最小化所有线段长度的总和。
我第一次尝试使用C++来枚举所有可能状态,寻找无相交状态,并在其中选取总线段长度最短的状态 O(n!)。但我认为必须有更好的方法。
有什么想法吗?或者说有哪些有效的搜索关键词?
我希望能找到一种更好的算法来解决以下问题:
在二维平面上有N个起点(紫色)和N个目标点(绿色),我想要一个连接起点和目标点的算法,通过线段(棕色)相连接,且不出现任何相交(红色),同时最小化所有线段长度的总和。
我第一次尝试使用C++来枚举所有可能状态,寻找无相交状态,并在其中选取总线段长度最短的状态 O(n!)。但我认为必须有更好的方法。
有什么想法吗?或者说有哪些有效的搜索关键词?
这是二维欧几里得最小匹配问题。该链接包含有关该问题已知的参考文献。鉴于您想要最小化总长度,因此非交叉约束是多余的,因为可以通过取消交叉来减少任何交叉线段对的长度。
根据qq3的回答,交叉约束是多余的,只需再进行一步操作:在最小化总长度的同时为起点分配终点。幸运的是,这个问题有一个多项式时间算法:
匈牙利算法 是一个组合优化算法,可以在多项式时间内解决分配问题。
它将时间复杂度从O(n!)降低到O(n3)。