【发布时间】:2016-12-25 07:16:35
【问题描述】:
给定 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()
所以在上面的例子中,目标是将每个红点映射到一个蓝点,这样每个蓝点只使用一次,并且点之间的距离总和最小化。
我遇到了this question,它有助于解决问题的第一部分——使用scipy.spatial.distance.cdist() 函数计算跨集的所有点对之间的距离。
从那里,我可能可以测试每一行中单个元素的每个排列,并找到最小值。
我想到的应用程序涉及 3 维空间中相当少量的数据点,所以蛮力方法可能很好,但我想我会先检查一下是否有人知道更有效或更优雅的解决方案.
【问题讨论】:
-
所以这个问题似乎与算法有关,与语言无关?
-
这两个集合的大小总是相等的?
-
这个问题不是linear sum assignment问题的一个实例吗?
-
@moooeeeep 主要对 python 答案感兴趣,但如果有一个简单的算法解决方案,我也会对此感兴趣;就尺寸而言,我对这两种情况都感兴趣——一种是集合大小相同,另一种是一组比另一组大。一种或两种解决方案都会有用。
-
@Stelios 感谢您向我指出这一点;我以前没听说过。看起来它正在尝试解决同样的问题。您认为您可以发布一个在两组点的上下文中应用它的答案吗?
标签: python scipy euclidean-distance