Учитывая несколько точек на числовой прямой, например x=1, 2, 5 и 6. Мне нужно разместить две дополнительные точки x1 и x2 на числовой прямой так, чтобы общее расстояние между x=1,2,5, 6 и x1 и x2 сведены к минимуму. Каков эффективный способ поиска этих точек?
например для x=1,2,5,6 и x1 = 1, x2 = 6 будет оптимальным, так как 1-1=0,2-1=1,6-5=1,6-6=0. Таким образом, общее расстояние будет равно 2.
Рассмотрим случай x=1,2,3,4, 5, 6, 7, 70000, 8000000.
Это должно быть целое число или оно может быть любым действительным?
Что вы пробовали/исследовали до сих пор?
Для ясности: вы можете разделить исходный набор точек на два произвольных набора и вычислять только расстояние от точки до связанного с ней набора?





Если бы нам нужно было разместить только одну точку, мы бы хотели разместить ее в срединном положении точек x. Медиана минимизирует среднюю абсолютную ошибку. И, конечно же, общая ошибка. Интуитивное объяснение состоит в том, что при одном шаге влево по числовой прямой (-1) общая ошибка уменьшается на количество точек слева и увеличивается на количество точек справа. Оптимум — это когда у нас одинаковое количество точек с обеих сторон: медиана.
Если мы можем разместить две точки, нам нужно расположить их так, чтобы одна из них была медианой первого набора точек, а другая — медианой второго набора. Существует только N вариантов разделения точек на два набора, поэтому мы можем оценить каждый вариант и выбрать лучший.
import numpy as np
x = np.array([1, 2, 3, 4, 5, 1000, 1001, 1002])
# Sum of the first k elements.
sums = np.insert(np.cumsum(x), 0, 0)
N = len(x)
# Split is the index of the last element in the first half.
split = np.arange(N-1)
# The median positions.
i1 = (split + 1)//2
i2 = split + (N - split)//2
# From start to before i1.
e1 = x[i1]*i1 - sums[i1]
# From after i2 to the split.
e2 = sums[split+1] - sums[i1] - x[i1]*(split - i1 + 1)
# From the split to before i2.
e3 = x[i2]*(i2 - split - 1) - sums[i2] + sums[split+1]
# From after i2 to the end.
e4 = sums[-1] - sums[i2 + 1] - x[i2]*(N - i2 - 1)
error = e1 + e2 + e3 + e4
best = np.argmin(error)
print(f"best x1: {x[i1[best]]}, x2: {x[i2[best]]}, error: {error[best]}")
# best x1: 3, x2: 1001, error: 8
Две проблемы с приведенным выше кодом:
Найдите расстояния между двумя соседними точками, отсортируйте их, поменяйте местами, затем начните размещать точки в середине точек с максимальными расстояниями (крайний случай: если максимальное расстояние более чем в два раза превышает второе максимальное расстояние, продолжайте размещать), пока не пробежите out (в данном случае у вас есть две точки.)?