Самая маленькая сумма пар

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

Другими словами, если a1, a2.. расстояний между точками первых, вторых... и энной пары соответственно, тогда (a1+a2 +...) должен быть минимальным.

Давайте рассмотрим этот тестовый сценарий, если 2*5 точек: {20,20}, {40, 20}, {10, 10}, {2, 2}, {240, 6}, {12, 12}, {100, 120}, {6, 48}, {12, 18}, {0, 0}

Желаемый вывод 237.

Это не моя домашняя работа, я любознателен о разных подходах, а не "в лоб".

11
задан dmckee 7 February 2010 в 16:22
поделиться

3 ответа

Похоже, вы ищете Идеальное соответствие с минимальным весом .

Существуют алгоритмы, использующие тот факт, что это точки на плоскости. Эта статья: Идеальное соответствие Минкоста на плоскости содержит алгоритм, а также упоминает некоторые предыдущие работы над ним.


По запросу, вот краткое описание «простого» алгоритма минимально взвешенного идеального соответствия в графе. Это краткое изложение частей главы о взвешенном сопоставлении в книге Пападимитриу и Стейглица Комбинаторная оптимизация, алгоритмы и сложность .

Допустим, вам дан взвешенный неориентированный граф G (с четным числом узлов). Граф можно рассматривать как полный взвешенный граф, добавляя недостающие ребра и присваивая им очень большие веса.

Предположим, что вершины пронумерованы от 1 до n, а вес ребра между вершинами i и j равен c (i, j).

У нас есть n (n-1) / 2 переменных x (i, j), которые обозначают соответствие G. x (i, j) = 1, если ребро между i и j находится в сопоставлении и x (i , j) = 0, если это не так.

Теперь задачу сопоставления можно записать как задачу линейного программирования:

минимизировать Sum c (i, j) * x (i, j)

при условии, что

Sum x (1, j) = 1 , где j изменяется от 1 до n.

Sum x (2, j) = 1 , где j изменяется от 1 до n. . . .

Sum x (n, j) = 1 , где j изменяется от 1 до n.

(Сумма x (1, j) = 1 в основном означает, что мы выбираем ровно одно ребро, инцидентное вершине с меткой 1.)

И последнее условие, что

x (i, j)> = 0

(мы могли бы сказать x (i, j) = 0 или 1, но это не сделало бы это проблемой линейного программирования, поскольку ограничения являются либо линейными уравнениями, либо неравенствами)

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

Теперь, если бы G была двудольной, можно показать, что мы можем получить оптимальное решение, такое что x (i, j) = 0 или 1. Таким образом, решая эту задачу линейного программирования для двудольного графа, мы получаем множество присваиваний каждому x (i, j), каждое из которых равно 0 или 1. Теперь мы можем получить соответствие, выбрав те ребра (i, j), для которых x (i, j) = 1. Ограничения гарантируют, что это будет соответствие с наименьшим весом.

К сожалению, это неверно для общих графиков (т.е. x (i, j) равно 0 или 1). Эдмондс выяснил, что это было из-за наличия нечетных циклов на графике.

Таким образом, в дополнение к вышеуказанным ограничениям, Эдмондс добавил дополнительное ограничение, согласно которому в любом подмножестве вершин размера 2k + 1 (т.е. нечетного размера) количество совпадающих ребер не превышает k.

Перечислить каждое нечетное число подмножество вершин, чтобы получить список множеств S (1), S (2), ..., S (2 ^ n - n). Пусть размер S (r) равен 2 * s (r) + 1.

Тогда указанные выше ограничения для каждого набора S (r)

Sum x (i, j) + y (r) = s (r) для i, j в S (r).

Затем Эдмондс доказал, что этого достаточно, чтобы гарантировать, что каждый x (i, j) равен 0 или 1, что дает нам идеальное соответствие с минимальным весом.

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

Чтобы обойти это, Эдмондс рассматривает двойственную задачу линейного программирования (здесь я не буду вдаваться в подробности) и показывает, что первично-дуальный алгоритм при запуске на двойном алгоритме требует только O (n ^ 4) шагов для достичь решения, тем самым дав нам алгоритм с полиномиальным временем! Он показывает это, показывая, что не более O (n) из y (r) не равны нулю на любом этапе алгоритма (который он называет расцветом).

Вот ссылка, которая объясняет это более подробно: http://www.cs.ucl.ac.uk/staff/V.Kolmogorov/papers/blossom5.pdf , Раздел 2.

Книгу, о которой я упоминал ранее, стоит прочитать (хотя она может быть немного сухой), чтобы получить более глубокое понимание.

Уф. Надеюсь, это поможет!


7
ответ дан 3 December 2019 в 10:44
поделиться

В вашей окончательной сумме в основном будет преобладать наибольшее слагаемое. Простейший алгоритм использования этого мог бы выглядеть следующим образом (я не могу это доказать):

  1. точки сортировки по убыванию по расстоянию до ближайшего соседа
  2. образуют пару из первой записи и ее ближайшего соседа
  3. удаляют пару из списка
  4. ] if list not empty goto 1.

Это должно работать очень часто.

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

1
ответ дан 3 December 2019 в 10:44
поделиться

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

EDIT

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

Вот ссылка на алгоритм аппроксимации проблемы. Конечно, стиль работы тоже математический, но IMHO гораздо проще понять, чем работа Кука и Роэ. И в предисловии к ней говорится, что она нацелена именно на то, чтобы ее было легче реализовать, чем оригинальный алгоритм Эдмонда, так как линейный решатель программирования вам не нужен.

EDIT2:

После обдумывания проблемы, IMHO должно быть возможно установить A* поиск решения этой проблемы. Пространство поиска здесь представляет собой набор "частичных совпадений" (или частично парных наборов точек). Как уже писал Морон в своих комментариях, можно ограничить поиск ситуацией, когда не существует пар с пересекающимися соединительными линиями. Функция path-cost (для использования терминов из Википедии) - это сумма расстояний между уже существующими парными точками. Эвристическая функция h(x) может быть любой недооценкой для остальных расстояний, например, когда у вас есть 2M не парные точки, возьмите сумму M минимальных расстояний между всеми этими оставшимися точками.

Это, вероятно, будет не так эффективно, как указывал алгоритм, на который указывал Морон, но я подозреваю, что это будет намного лучше, чем "грубая сила", и намного проще в реализации.

0
ответ дан 3 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: