Венгерский алгоритм, соответствующий одному набору

Я ищу вариант венгерского алгоритма (я думаю), который соединит N людей с собой, исключая самопары и обратные пары, где N четно.

Например, учитывая N0 - N6 и матрицу C затрат для каждой пары, как я могу получить набор из 3 пар с наименьшей стоимостью?

C = [ [ - 5 6 1 9 4 ]
      [ 5 - 4 8 6 2 ]
      [ 6 4 - 3 7 6 ]
      [ 1 8 3 - 8 9 ]
      [ 9 6 7 8 - 5 ]
      [ 4 2 6 9 5 - ] ]

В этом примере результирующие пары будут:

N0, N3
N1, N4
N2, N5

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

Есть ли вариант венгерского, который работает на неквадратной матрице?

Или есть другой алгоритм, который решает эту проблему?

1 ответ

Увеличение значений нижней половины может привести к неверному решению. Вы можете видеть это, поскольку угловые координаты (в вашем примере с координатами 0,1 и 5,6) верхней половины всегда будут считаться находящимися в минимальных парах X, где X - размер матрицы.

Мое решение для поиска минимальных пар X

Взять стандартный венгерский алгоритм

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

1) Первый шаг стандартного алгоритма состоит в том, чтобы пройти каждую строку, а затем каждый столбец, уменьшив каждую строку и столбец в отдельности, так чтобы минимум каждой строки и столбца был равен нулю. Это без изменений.

Общий принцип этого решения заключается в отражении каждого последующего шага исходного алгоритма вокруг диагонали.

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

3) Следующим шагом является проверка правильности решения, которое в стандартном алгоритме означает проверку того, равно ли количество выбранных строк и столбцов размеру матрицы, - в вашем примере, если выбрано шесть строк и столбцов, Однако для этого варианта при расчете времени окончания алгоритм обрабатывает каждую зеркальную пару строк / столбцов как один выбор строки или столбца. Если у вас есть правильное решение, тогда закончите алгоритм здесь.

4) Если количество строк и столбцов меньше размера матрицы, найдите самый маленький невыбранный элемент и назовите его k. Вычтите k из всех непокрытых элементов и добавьте его ко всем элементам, которые покрыты дважды (опять же, считая зеркальный выбор строки / столбца как один выбор).
Мое изменение алгоритма означает, что при изменении значений вы будете изменять их зеркальные значения одинаково (это должно происходить естественным образом в результате процесса зеркального выбора).

Затем вернитесь к шагу 2 и повторяйте шаги 2-4, пока шаг 3 не покажет, что алгоритм завершен.

Это приведет к появлению пар зеркальных ответов (которые являются координатами - чтобы получить значение этих координат, относящихся к исходной матрице) - вы можете безопасно удалить половину каждой пары произвольно.

Чтобы изменить этот алгоритм, чтобы найти минимальное количество пар R, где R меньше размера матрицы, уменьшите точку остановки на шаге 3 до R. Это изменение необходимо для ответа на ваш вопрос.

Как @Niklas B, заявил, что вы решаете проблему взвешенного идеального соответствия, взгляните на это

вот часть документа, описывающая алгоритм Primal-dual для взвешенного идеального соответствия введите описание изображения здесь

Пожалуйста, прочитайте все и дайте мне знать, если это полезно для вас

Другие вопросы по тегам