Учитывая два набора точек в n-мерном пространстве, как можно сопоставить точки от одного набора к другому, так что каждая точка используется только один раз, а общее эвклидовое расстояние между пары точек минимизированы?Минимизировать общее расстояние между двумя наборами точек в Python
Например,
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()
.
Оттуда я мог бы, вероятно, проверить каждую перестановку отдельных элементов из каждой строки и найти минимум.
Приложение, которое я имею в виду, включает в себя довольно небольшое количество точек данных в трехмерном пространстве, поэтому подход грубой силы может быть прекрасным, но я решил проверить, знает ли кто-нибудь более эффективное или изящное решение первый.
Так что этот вопрос, кажется, об алгоритме, который зависит от языка? – moooeeeep
Эти два набора всегда одинакового размера? – moooeeeep
Не является ли эта проблема экземпляром задачи [линейное присвоение суммы] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linear_sum_assignment.html)? – Stelios