Найдите наилучшую круговую перестановку, которая минимизирует среднее расстояние между 2 упорядоченными списками точек

#algorithm #optimization

#алгоритм #оптимизация

Вопрос:

Учитывая 2 упорядоченных набора из n точек в каждом, A и B, как мне найти наилучшую круговую перестановку, которая минимизирует среднее попарное расстояние (используя расстояние по вашему выбору) между точками.

Другими словами, как мне алгоритмически найти k такое, чтобы оно минимизировалось sum(||A[i] - B[(i k) % n||) с 0 <= k < n помощью? (Я опустил деление на n , потому что минимизация общего расстояния должна дать тот же результат, что и среднее значение, которое я считаю).

Одним из дополнительных требований является то, что алгоритм должен использоваться в N-мерных пространствах, поэтому я не могу просто сортировать массивы.

Я мог бы, очевидно, вычислить каждое попарное расстояние, но это дало бы O (n ^ 2) (n x n попарное вычисление расстояния n накоплений) сложность, которая является неоптимальной ([править] Я имею в виду здесь, что я очень надеюсь, что можно добиться большего, чем грубая сила).

Применение: Одно приложение находится в графике, где я хочу сопоставить каждую точку фигуры с точкой другой формы без создания пересекающихся ребер. Смотрите рисунок ниже, где мы сопоставляем каждую точку красной фигуры с точкой на синей фигуре. shape_points_mapping

Комментарии:

1. Откуда вы знаете, что это неоптимально? Знаете ли вы более быстрый алгоритм?

2. @Stef Я не так, возможно, это лучшее точное решение. Я просто надеюсь, что это не так. Я бы предположил, что можно было бы найти какое-то приблизительное решение за лучшее время, чем грубая сила, но я не уверен, как поступить. Я мог бы попытаться найти наименьшее попарное расстояние, а затем начать оттуда какой-то градиентный спуск, но даст ли это лучшее решение?

3. Какова ваша область? Евклидово пространство? Векторное пространство? Какова ваша метрика?

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

5. Почему требование о том, что перестановка должна быть «круговой»? Что произойдет, если, например, на вашем 2D-изображении выше точки будут перечислены в другом порядке или если фигура будет 3D?

Ответ №1:

У меня есть две идеи.

Если вы хотите оптимизировать сумму квадратов расстояний, то существует алгоритм времени O (n log n), основанный на быстрой свертке. Модифицированная цель позволяет нам находить вклад каждой координаты отдельно для каждого возможного поворота. Затем мы суммируем по элементам и выбираем лучшее.

Чтобы решить уменьшенную задачу в 1D: мы хотим

 sum_i (A[i] - B[(i k) mod n])**2
 

для каждого k . Сделайте некоторую алгебру:

 sum_i (A[i] - B[(i k) mod n])**2 =
sum_i (A[i]**2 - 2*A[i]*B[(i k) mod n]   B[(i k) mod n]**2) =
sum_i A[i]**2   sum_i B[i]**2 - 2*sum_i (A[i]*B[(i k) mod n]).
 

Первые два члена одинаковы для всех k , поэтому просто вычислите их. Вектор третьих членов для всех k может быть быстро вычислен в объеме как постоянное время A , свернутое с обратным B .


Моя вторая идея — рекурсивная эвристика. Если n оно мало, просто перебирайте его. В противном случае создайте экземпляр меньшего размера, вычисляя среднюю точку каждой пары последовательных точек в каждом списке. Рекурсивно выровняйте их. Затем умножьте эвристическое вращение на два и сравните его с поворотами на один вверх и один вниз от него. При постоянных измерениях это приводит к повторению типа T (n) = T (n / 2) O (n), что равно O (n).

Комментарии:

1. Я не думаю, что первый метод на самом деле намного быстрее. Разработка квадратного метода — хорошая идея, но в конце концов, даже если вы проигнорируете первый член и попытаетесь свести к минимуму -2*sum (A[i] * B[(i k) %n] , вам все равно придется сделать это для всех k и i, так что все равно n ^ 2 операций. С другой стороны, вторая идея кажется мне очень интересной зацепкой. Я постараюсь реализовать его и держать вас в курсе. Большое вам спасибо.

2. @Niels вычисление его для одного конкретного k будет стоить O (n) времени, но свертка вычислит все n поворотов за O (n log n) время.

3. Почему sum_i A[i]**2 равно sum_i B[i]**2 ?

4. @STF Это не так, хороший улов. Важной частью было то, что мы можем отказаться k от этих терминов.

5. @Niels Для идеи 1, если вы просто оцените эту формулу напрямую, она действительно будет квадратичной. Я хочу сказать, что он поддается быстрому преобразованию Фурье , которое значительно ускоряет работу за счет распределения работы между различными значениями k. Для идеи 2 я имел в виду взять любую другую среднюю точку.