我有一个我喜欢的问题,我喜欢考虑解决方案,但不幸的是我被困住了。我希望你也喜欢它。问题是:
我有两个2D点列表(比如A和B),并且需要将A点与B点匹配,条件是所有对中的距离总和最小。一对包含A中的一个点和B中的一个点,一个点只能使用一次,并且应该创建尽可能多的对(即min(length(A), length(B))
)。
我做了一个简单的例子,其中颜色表示该点来自哪个列表,黑色连接是解决方案。
虽然这是一个很好的问题,但我怀疑它是NP难的,它会变得更好。我可以建立现有的解决方案。假设我有两个列表和相应的解决方案(即成对的集合),那么我需要解决的问题是当在一个列表中添加或删除一个点时重新优化该解决方案。
遗憾的是,我无法提出任何产生最佳解决方案的非暴力算法。我希望你可以。任何(伪)语言都可以理解任何算法,最好是C#。
答案 0 :(得分:12)
此问题可通过Hungarian algorithm在多项式时间内解决。要获得方形矩阵,请将虚拟条目添加到距离所有内容“距离0”的较短列表中。
答案 1 :(得分:1)
您的问题是加权最小匹配问题的实例(如this Wikipedia article中所述)。即使对于未加权的问题(所有距离相等),也没有多项式时间算法。有一种有效的算法可以在多项式时间内(在2倍之内)近似求解它。
答案 2 :(得分:0)
这是Euclidean二分匹配问题的最小权重。有一个O(n ^(2 + epsilon))算法。