Найти точку, сумма расстояний до других точек минимальна
У меня есть один набор (X) точек (не очень большой, скажем, 1-20 точек) и второй (Y), гораздо больший набор точек. Мне нужно выбрать какую-то точку из Y, сумма расстояний до все точки от X минимальны.
Я придумал, что я буду рассматривать X как вершины многоугольника и находить центроид этого многоугольника, а затем я выберу точку из y, ближайшую к центроиду. Но я не уверен, что центроид минимизирует сумму расстояний до вершины многоугольника, поэтому я не уверен, что это хороший способ? Существует ли какой-либо алгоритм решения этой проблемы?
точки определяются географическими координатами.
4 ответов
центроид многоугольника может быть неправильным, но такая точка существует.
в статье: N-эллипсы и проблема минимального расстояния, показано, что если точки (называемые фокусами, ваш набор X) не являются коллинеарными, то
существует уникальная точка (называемая центром), для которой сумма расстояний минимизируется. Эта точка такова, что сумма единичных векторов от этой точки до фокусов равна нулю!
в локус точек, для которых сумма расстояний постоянна, представляет собой выпуклую кривую (называемую n-эллипсом), содержащую центр
n-эллипс для расстояния D полностью содержит n-эллипс для любого другого расстояния D', для которого D '
таким образом, вы можете сделать некоторый тип алгоритма восхождения на холм, чтобы найти центр.
конечно, эти N-эллипсы не обязательно являются кругами, поэтому просто выбор точки, ближайшей к центру, может не работает, но может быть хорошим приближением.
возможно, вы можете выполнить предварительную обработку на 20 точках (если они фиксированы), чтобы выяснить хорошую схему разбиения (на основе вышеуказанной информации).
надеюсь, это поможет.
Если вы хотите минимизировать сумму квадратов расстояний (а не сумму расстояний), то точка, которая минимизирует эту сумму, является средним значением точек в X.
доказательство:
sum(squares of distances) = (x-x0)^2 + (y-y0)^2 + (x-x1)^2 + (y-y1)^2 + ...
d/dx sum(squares of distances) = 2(x-x0) + 2(x-x1) + ... = 2(Nx - x0 - x1 - ...)
сумма минимизируется, когда производная равна нулю, что происходит, когда Nx = x0+x1+...
, so x = (x0+x1+...)/N
производная симметрична вокруг этой точки, а функция квадратична, поэтому я уверен, что ближайшая точка в Y к этой средней точке - лучший.
минимизация расстояний сложнее, но я подозреваю, что тот же алгоритм, с большей свободой в наборе Ys, который вы тестируете, также будет работать.
поскольку вы хотите минимальную сумму расстояний, я считаю, что вы можете уменьшить набор точек X до его пространственного среднего. Затем вы можете использовать KDTree или какое-то дерево пространственного разбиения, чтобы найти точку в Y, ближайшую к пространственному среднему X. использование дерева пространственного разбиения может сэкономить хорошую работу по сравнению с проверкой всех возможных точек.
извините меня за предложение грубой силы. Как поставлен вопрос, мы не знаем, где X, Y лежат. Предположим, что X-30 точек, Y-1000 точек. Затем для каждой точки Y суммируем 30 расстояний. Всего 30000 вычислений, выполненных в один миг. Это гарантирует минимум. Поиск некоторого "центра" X и выбор ближайшего Y будут только приближенным решением.
более интересный вопрос-найти такую точку только для X. игнорировать Я. Только для X трех точек Точка ферма-Торичелли решает проблему.