Как вычислить инъективную/сюръективную карту с минимальным весом?

#python #algorithm #graph-theory #implementation

Вопрос:

Нам дана m x n матрица w , которая представляет веса ребер в полном двудольном графе K_m,n . Мы хотим найти карту {1,...,m} -> {1,...,n} с минимальным весом, которая является инъективной или сюръективной. выбор карты эквивалентен v {1,...,m} выбору ровно одного ребра, падающего на каждую вершину v .


Позволь m<=n . Инъективную функцию с минимальным весом можно найти, выполнив поиск идеального соответствия с минимальным весом. В Python это реализовано в scipy :

 import numpy as np
import scipy, scipy.optimize
w=np.random.rand(5,10)
print(scipy.optimize.linear_sum_assignment(w))
 

Позволь m>=n . Как можно найти сюръективную функцию с минимальным весом? Я ищу конкретную реализацию в Python.

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

1. Все ли веса ребер неотрицательны? Если это так, этот пост может помочь ; так как это проблема с краевым покрытием с минимальным весом

2. @kcsquared Разве это не правда, что покрытие ребра может иметь ребра, которые падают на набор доменов из m вершин? Это означало бы, что у нас нет карты, а скорее многоуровневая карта.

3. Это правда. Насколько велики m и n и являются ли веса неотрицательными? Возможно, это можно преобразовать в целочисленную линейную программу (с экспоненциальным временем выполнения).

4. Я бы рекомендовал, чтобы computer science stackexchange с гораздо большей вероятностью предложил помощь в решении этой проблемы. В scipy.optimize нет функции для вашего вопроса, и эксперт в теории графов с большей вероятностью узнает, является ли это открытой проблемой или доказано, что она NP-трудна.

5. Это хорошее приближение, но оно не всегда самое дешевое (мне не ясен точный коэффициент приближения). Рассмотрим [[3 5 6], [4 3 8], [8 2 3], [8 5 5]] , какой из них имеет 4 строки и 3 столбца. Первые 3 строки имеют минимальное значение 9, например, столбцы 0,1,2 . Это распространяется на полную карту с минимальной стоимостью 14, добавив элемент последней строки. Однако столбцы 0,1,1,2 дают полную карту минимальной стоимости 13. Кроме того, назначение минимальной стоимости первых 3 строк не может быть расширено до карты минимальной стоимости всех 4. Чтобы использовать свою стратегию, вам также нужно будет перебрать все m choose n способы выбора первых n строк.

Ответ №1:

ПРАВКА: Оказывается, я, возможно, неправильно понял ваш вопрос.

От инъективного к сюръективному

Если m > n у вас уже есть алгоритм , который обрабатывает это дело m <= n , затем поменяйте местами два компонента. Ваш алгоритм даст вам инъективную функцию от второго компонента к первому. Возьмите обратную эту функцию; это будет сюръективная функция от подмножества первого компонента ко второму компоненту.

С помощью networkx

То, что вы ищете,-это соответствие максимальной мощности в двудольном графике.

Библиотека python networkx содержит несколько функций для этого. Стандартными проблемами являются «соответствие максимальной мощности» и «соответствие максимального веса»; Я был бы удивлен, если бы существовала функция для непосредственного решения вашей проблемы «соответствие максимальной мощности с минимальным весом».

Однако мне кажется , что ваша проблема была эквивалентна нахождению соответствия максимального веса в взвешенном графике, полученном путем замены каждого веса w на W-w , где W какое-то очень большое значение (например, в три раза больше максимального веса в исходном графике).

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

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

1. После перечитывания поста я подозреваю, что утверждение «Выбор карты эквивалентен тому, что для каждой вершины v в {1,…,m} выбор ровно одного ребра, инцидентного v» подразумевает, что OP хочет избежать выбора только подмножества m вершин

2. @kcsquare оооооооооооооооо я вижу

3. Если я правильно понял, вы обращаетесь к «инъекционной» части моего поста, но это я уже решил. Проблема, с которой я сталкиваюсь, связана с «сюръективной» частью.