Оптимизация от частичного решения: минимизировать сумму расстояний между парами

У меня есть проблема, которая мне нравится, и я обожаю думать о решениях, но к сожалению. Надеюсь, вам тоже понравится. Проблема заключается в следующем:

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

Я сделал простой пример, где цвет обозначает, из какого списка находится точка, а черные соединения - это решение.

Хотя это хорошая проблема, и я подозреваю, что NP-жесткий, он становится приятнее. Я могу опираться на существующие решения. Предположим, что у меня есть два списка и соответствующее решение (т.е. Множество пар), то проблема, которую мне нужно решить, состоит в том, чтобы повторно использовать это решение, когда точка добавляется или удаляется из любого списка.

Я, к сожалению, не смог придумать какой-либо алгоритм без грубой силы, обеспечивающий оптимальное решение. Надеюсь, ты сможешь. Любой алгоритм оценивается на любом (псевдо) языке, предпочтительно С#.

Ответ 1

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

Ответ 2

Ваша проблема - это пример проблемы взвешенного минимального максимального соответствия (как описано в этой статье в Википедии). Не существует алгоритма полиномиального времени даже для невзвешенной задачи (все расстояния равны). Существуют эффективные алгоритмы, позволяющие приблизительно решить его в полиномиальное время (в 2 раза).

Ответ 3

Это минимальная задача с евклидовым двудольным соглашением. Существует алгоритм O (n ^ (2 + эпсилон)).