перемещать точки в списке таким образом, чтобы записи были по крайней мере на расстоянии друг от друга - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть список контрольных чисел, например,

x_ref = [-0.1, 1.0, 1.2, 3.5, 7.5, 12.0]

, и я хотел бы найти список x такой, чтобы выполнялись две вещи:

  • Записи в x находятся на расстоянии не менее dist (например, 2.0)
  • Записи в x максимально приближены к своему x_ref партнеру, т. Е. Минимизируют квадратное расстояние
    1/2 sum((x_ref[i] - x[i]) ** 2) -> min
    

Я что-то приготовил, но он довольно раздутый и, вероятно, глючит. Возможно, здесь есть легкий выход. Есть намеки?

1 Ответ

1 голос
/ 19 апреля 2020

Во-первых, вам нужно определить каждую критически перегруженную область вашего списка, самую большую подпоследовательность (i, j), такую, чтобы

(x[j] - x[i]) / 2.0 < j-i

РЕДАКТИРОВАТЬ Комментарий Нико размещен на: I не учитывал эффективно открытый интервал на одном конце. Я думаю , что корректировка идентификации зазора поможет ...

(x[j] - x[i]) / 2.0 < j-i-1

EDIT END

В приведенном вами примере есть только одно такое местоположение, значения от -0,1 до 3,5, разница 3,6, где требуется спред 6,0. Минимальный спред будет состоять из чисел p + 2.0 * k для k в закрытом интервале [0, (ji)]

Теперь у вас есть выражение для вашей ошибки:

sum for k = 0, (j-i)
    (x[k] - (p + 2k))^2

Все Значения x[k] известны, и все значения 2k известны. Разверните выражение, решите для p и сведите к минимуму - возьмите производную и установите ее равной 0. Полученное значение p дает вам новое значение x[i], а остальные следуют из этого.

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