给定n维空间中的两个点集,如何将一个点映射到另一个点集中,使每个点只被使用一次,并且点对之间的欧几里得距离总和最小?
例如:
import matplotlib.pyplot as plt
import numpy as np
# create six points in 2d space; the first three belong to set "A" and the
# second three belong to set "B"
x = [1, 2, 3, 1.8, 1.9, 3.4]
y = [2, 3, 1, 2.6, 3.4, 0.4]
colors = ['red'] * 3 + ['blue'] * 3
plt.scatter(x, y, c=colors)
plt.show()
在上面的示例中,目标是将每个红点映射到一个蓝点,以使每个蓝点仅使用一次,并且点之间的距离总和最小。
我发现这个问题可以帮助解决问题的第一部分——使用scipy.spatial.distance.cdist()
函数计算不同集合中所有点对之间的距离。
从那里开始,我可能会测试每行单个元素的每个排列,并找到最小值。
我考虑的应用涉及三维空间中相当少量的数据点,因此暴力方法可能是可行的,但我想先检查是否有更有效或更优雅的解决方案。