Лучший способ решить проблему расстояния - PullRequest
6 голосов
/ 05 февраля 2009

Есть множество точек, которые являются коллинеарными. Задача состоит в том, чтобы добавить новую точку, которая лежит на той же линии, чтобы сумма расстояний от новой точки до существующих точек была минимальной. (Предположим, что точка лежит на горизонтальной линии).

Решение, о котором я подумал:

  1. Сортировка точек по их x-координатам (y в любом случае не имеет значения).
  2. Если количество точек нечетное, поместите новую точку в ту же координату, что и средняя.
  3. В противном случае поместите точку в среднюю точку n / 2 и n / 2 + 1 балл.

Я не могу доказать, что вышеуказанный метод работает. Это правильно? Также есть лучший способ решить эту проблему?

Ответы [ 7 ]

8 голосов
/ 05 февраля 2009

Я считаю, что медиана является правильным ответом, если мы хотим минимизировать сумму абсолютных расстояний, что является очевидной интерпретацией. Среднее значение верно, если мы хотим минимизировать сумму квадратов расстояний. Для точек при y = 0 и x = 0, 1, 2, 101 среднее значение равно 26, и мы можем принять медиану равной 1,5. Сумма абсолютных расстояний от среднего составляет 149, а сумма абсолютных расстояний от среднего составляет 102.

При медиане количество очков слева от вас равно количеству очков справа от вас. Небольшое перемещение влево увеличивает все расстояния до точек справа и уменьшает все расстояния до точек слева на одинаковую величину - без изменений. Если вы находитесь на точку или более от медианы, вы можете уменьшить сумму абсолютных расстояний, двигаясь к области, где больше точек. Это уменьшает сумму расстояний orginationg от области, где есть больше точек, больше, чем увеличивает сумму расстояний, исходящих из области, где есть меньше точек - так что если вы не находитесь в медиане, вы можете улучшить положение, перемещая к ней. Это довольно стандартный результат в статистике.

3 голосов
/ 05 февраля 2009

Я думаю, что вы можете доказать это по индукции. Я сделаю нечетные, и вы можете расширить его:

Без ограничения общности можно сказать, что точки лежат вдоль линии y = 0, а центральная точка находится в точке (0, 0). Это связано с тем, что аффинные преобразования, такие как вращения и перемещение, не влияют на относительные расстояния.

Пусть множество точек на линии определено как P = {(x, 0) <= x является действительным} Определите расстояние от точки X как сумму (P => | P - X |)

Лемма 1 : Центральная точка должна быть вдоль линии y = 0. Предположим, что центральная точка находится в точке (x, y) с y! = 0. Рассмотрим точку (x, 0) .

sum(P - (x,y)) = sum( sqrt( (p-x)*(p-x) + (0-y)*(0-y) ) )
               = sum( sqrt( p*p - 2xp + x*x + y*y ) )
               > sum( sqrt( p*p - 2xp + x*x + (0-0)*(0-0) ) )
               = sum(P - (x,0))

Это противоречие, поэтому y = 0 должно быть истинным.

Базовый случай 1 элемента : Это нечетное количество элементов, поэтому выберите его: (0, 0). Предположим, что существует точка X = (x, 0) такая, что x ближе. Тогда это означает, что | x - 0 | <(0 - 0) или что | x | <0, что невозможно. Поэтому (0, 0) является центральной точкой. </p>

Базовый случай из 3 элементов : Это нечетное количество элементов, поэтому выберите среднюю точку: (0, 0). Без ограничения общности, пусть две другие точки будут (a <0, 0) и (b> 0, 0). Предположим, что есть точка X = (x, 0), которая ближе. Тогда это означает, что:

| х - 0 | + | x - a | + | x - b | <| 0 - 0 | + | 0 - a | + | 0 - b | </p>

<=>

| х | + | x - a | + | x - b | <| a | + | b | </p>

Однако:

| х | + | x - a | + | x - b | > = | x | + | a | + | b | > = | a | + | b |, что противоречит предположению, поэтому (0, 0) является центральной точкой.

Корпус с N элементами (нечетно) . Предположим, что все нечетные множества точек удовлетворяют вышеуказанным условиям. Пусть P будет множеством с N элементами, и расположите их так:

{(a, 0), Q = {набор из N-2 элементов с центром в (0, 0)}, (b, 0)}

Предположим, что центральной точкой является X = (x, 0).

sum(P - X) = |x-a| + |x-b| + sum(Q - X)
           > |x-a| + |x-b| + sum(Q - (0,0))
           >= |a| + |b| + sum(Q - (0,0))
           = sum(P - (0,0))

Это означает, что предположение противоречит, поэтому (0,0) должно быть центральной точкой.

Это доказывает все нечетные числа. Четные числа должны быть похожими.

1 голос
/ 05 февраля 2009

Это решается нахождением медианы. См. http://en.wikipedia.org/wiki/Geometric_median (раздел «Свойства»). Было бы достаточно выполнить вычисления по координатам x или y. Любой из них может использоваться, если координаты вдоль выбранной оси не являются постоянными для линии.

1 голос
/ 05 февраля 2009

Следующее не лучшее решение. Но дает правильное значение.

  1. Сначала найдите угол вашей линии, поверните все точки, чтобы повернуть этот угол, чтобы стать горизонтальной линией
  2. Сортировка всех точек X, так как Y будет постоянным после вращения
  3. Пусть это будет X (1), X (2), X (3), ... X (N)
  4. Затем сохраните вычисленное расстояние D (R) для каждого R от 1 до N как [(2R-N) * X (R)] - [X (1) + X (2) + X (3) .. + X (R)] + [X (R + 1) + X (R + 2) + X (R + 3) ... + X (N)]
  5. Получите минимум D (R).
  6. Повернуть назад X (R), Y к исходному углу.
  7. Это ваше ожидаемое значение.
  8. Если значения D (R) и D (R + 1) совпадают, то все повернутые точки между X (R), Y & X (R + 1), Y будут вашим ожидаемым значением.
  9. Интересно, что если R середина, то ответ будет минимальным, так как количество сложений [X (1) + .. X (R)] и [X (R + 1) + .. X (N)] почти равны тогда разница минимальна, в противном случае, если количество дополнений в одной стороне больше, то всегда разница будет больше, чем число равных дополнений. Точно так же, если есть четное число точек, все точки между (N) / 2 - (N / 2) +1 будут иметь одинаковое равное расстояние.
  10. Следовательно, MEDIAN - правильный ответ.

Надеюсь, это сработает для вас.

0 голосов
/ 09 февраля 2009

Выше, у mcdowella, FryGuy и ShreevatsaR были идеи в моем ответе ниже.

Пусть n будет количеством точек на линии. Пусть точки будут p (1), ..., p (n), помеченные слева направо.

Случай n = 1. Верно.

Случай n = 2. Верно. Вы можете выбрать любую точку между двумя точками.

Случай n> = 3. Ввести систему координат x-y. Поверните самолет так что точки находятся на оси х.

Точка, минимизирующая расстояние до других точек, должна находиться в интервале [p (1), p (n)] по следующей причине: если бы она была слева от p (1), переместите ее вправо немного (достаточно мал, чтобы x не попал в p (1)), уменьшая расстояние. Аналогично, если бы он был справа от p (n).

Укажите любую точку x на прямой, не обязательно одну из p (1), ..., p (n).

Пусть D - сумма расстояний от x до других точек.

Пусть L будет количеством точек слева от x. Аналогично, пусть R будет числом точек справа.

Есть три случая.

Подслуча 1: х является медианой. Таким образом, L = R. Если мы переместим x на небольшую величину e влево, сумма расстояния становится D - Le + Re + e = D + e> D. Аналогично для движения вправо. Таким образом, медиана дает локальный минимум.

Подслучатель 2: x слева от медианы. Похоже на следующий подслучайник.

Подслуча 3: х справа от медианы. Таким образом, L> = R. Есть две точки, такие что x находится в (p (i), p (i + 1)] (левая конечная точка исключена, но правая включена). Пусть e = x - p (i ).

Переместить x влево на e. Мы можем сделать х стать р (я). Сумма расстояния становится D - Le + Re = D - (L - R) e <= D. То есть мы, возможно, уменьшаем D. Мы не увеличиваем его. </p>

Мы продолжаем двигаться x влево, возможно уменьшая сумму расстояния и не увеличивая ее, пока x не станет медианой. Таким образом, медиана дает глобальный минимум.

0 голосов
/ 05 февраля 2009

Интересная проблема!

Редактировать: следующее неверно, но я не понимаю, где моя ошибка.

Медианное решение, которое вы объяснили в своем вопросе, является неправильным решением.

Поскольку вы хотите доказать правильность, я хотел бы попытаться решить эту проблему следующим образом:

Прежде всего, поскольку все точки коллинеарны, мы можем легко разделить их на их X- и Y-компоненты. Затем мы решаем проблему независимо для X и Y. Предположим, что мы получили значения V[0] to V[n-1], где n равно числу точек.

Теперь проблема становится вычислением x, так что SUM( (V[0 ... n-1] - x)^2 ) становится минимальным. Строим производную 2*n*x - 2*SUM( V[0 ... n-1] ).

Это становится 0 для -n * x + SUM( V[0 ... n-1] ). Соответственно x = SUM( V[0 ... n-1] ) / n.

Так что просто добавьте все значения и разделите их на n, чтобы получить правильное минимальное решение. Сделав это для x и y, вы получите желаемую точку.

Это также соответствует предположению, которое я сделал, когда впервые подумал о вашей проблеме, и это работает для нескольких значений, которые я тестировал. Надеюсь это поможет. :)

0 голосов
/ 05 февраля 2009

Ну, вам, конечно, не нужно их сортировать. Просто возьмите среднее значение их x и y координат. Это будет работать в N-измерениях, пока они коллинеарны.

РЕДАКТИРОВАТЬ: я понял, что я вычисляю среднее. Вы вычисляете медиану, как указано в другом ответе, которая, скорее всего, даст минимальное расстояние до всех точек.

РЕДАКТИРОВАТЬ 2: Медиана является правильным ответом для нечетного количества очков. Для четного числа точек это любая точка на самом внутреннем отрезке, определяемая областью с одинаковым количеством точек на обеих сторонах.

Доказательство (ish): Вы нашли правильный ответ, но для четного числа баллов есть несколько.

Для любых двух точек любая точка на отрезке прямой между этими точками будет иметь одинаковую сумму расстояний до обеих точек. Любая точка вне этого отрезка будет иметь расстояния больше, чем на отрезке.

Итак, чтобы найти точку с наименьшим расстоянием от всех коллинеарных точек, вам нужно разложить задачу на отдельные наборы из двух точек, то есть отрезков, которые полностью содержатся в других отрезках. Затем просто возьмите наименьший отрезок (или точку в случае нечетного числа точек) и выберите точку на этом отрезке. Все точки на этом отрезке будут иметь минимальное расстояние от всех точек для этой конкретной конфигурации.

Если вы хотите построить график, все расстояния от точечных графиков будут иметь одинаковую форму: / Для отрезка линии график расстояний будет выглядеть следующим образом: _ /

По сути, вы хотите добавить все графики расстояний и найти минимум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...