algorithm - grafos - Partida bipartita ponderada máxima dirigida que permite compartir vértices de inicio/final
matching grafos (2)
Sea G (U u V, E) un gráfico bipartito dirigido ponderado (es decir, U y V son los dos conjuntos de nodos del gráfico bipartito y E contiene los bordes ponderados dirigidos de U a V o de V a U). Aquí hay un ejemplo:
En este caso:
U = {A,B,C}
V = {D,E,F}
E = {(A->E,7), (B->D,1), (C->E,3), (F->A,9)}
Definición: DirectionalMatching (inventé este término solo para aclarar las cosas): conjunto de bordes dirigidos que pueden compartir los vértices de inicio o fin. Es decir, si U-> V y U ''-> V'' pertenecen a una Trama Direccional, entonces V / = U ''y V'' / = U pero puede ser que U = U ''o V = V''.
Mi pregunta: ¿Cómo encontrar eficientemente un Trazado Direccional , como se definió anteriormente, para un gráfico bipartito ponderado direccional que maximiza la suma de los pesos de sus bordes?
De manera eficiente , me refiero a la complejidad polinómica o más rápida, ya sé cómo implementar un enfoque ingenuo de fuerza bruta.
En el ejemplo anterior, la combinación direccional máxima ponderada es: {F-> A, C-> E, B-> D}, con un valor de 13.
Demostrar formalmente la equivalencia de este problema a cualquier otro problema bien conocido en la teoría de grafos también sería valioso.
¡Gracias!
Nota 1: Esta pregunta se basa en la coincidencia bipartita máxima ponderada _con_ bordes dirigidos, pero con la relajación adicional que se permite para que los bordes de la coincidencia compartan el origen o el destino. Dado que esa relajación hace una gran diferencia, creé una pregunta independiente.
Nota 2: Esta es una coincidencia de peso máxima. La cardinalidad (cuántos bordes están presentes) y el número de vértices cubiertos por la coincidencia es irrelevante para un resultado correcto. Solo el peso máximo importa.
Nota 2: Durante mi investigación para resolver el problema que encontré en este documento, creo que sería útil para otros que intentan encontrar una solución: Ciclos y trayectorias alternas en multigrafos de colores de borde: una encuesta
Nota 3: en caso de que ayude, también puede pensar en el gráfico como su equivalente multigrafía bi-direccional no dirigida de 2 bordes. La formulación del problema se convertiría en: Encontrar el conjunto de bordes sin trayectorias alternas de color o ciclos que tiene una suma de peso máxima.
Nota 4: sospecho que el problema podría ser NP-hard, pero no tengo tanta experiencia con las reducciones, así que no he podido probarlo todavía.
Otro ejemplo más :
Imagina que tuviste
4 vértices: {u1, u2}
{v1, v2}
4 bordes: {u1->v1, u1->v2, u2->v1, v2->u2}
Entonces, independientemente de sus ponderaciones, u1->v2
y v2->u2
no pueden estar en la misma v2->u2
direccional , tampoco pueden v2->u2
u2->v1
y u2->v1
. Sin embargo, u1->v1
y u1->v2
pueden, y también pueden u1->v1
y u2->v1
.
Defina un nuevo gráfico no dirigido G''
desde G
siguiente manera.
-
G''
tiene un nodo(A, B)
con un pesow
para cada borde dirigido(A, B)
con un pesow
enG
-
G''
tiene borde no dirigido((A, B),(B, C))
si (A, B) y (B, C) son ambos bordes dirigidos en G
http://en.wikipedia.org/wiki/Line_graph#Line_digraphs
Ahora encuentre un vértice independiente máximo (ponderado) establecido en G''
.
http://en.wikipedia.org/wiki/Vertex_independent_set
Editar: las cosas después de este punto solo funcionan si todos los pesos de borde son los mismos: cuando los pesos de borde tienen valores diferentes, es un problema más difícil (google "conjunto de vértices independientes de peso máximo" para posibles algoritmos)
Típicamente esto sería un problema NP-difícil. Sin embargo, G''
es un gráfico bipartito, contiene solo ciclos pares. Encontrar el máximo vértice independiente (ponderado) establecido en un gráfico bipartito no es NP-difícil.
El algoritmo que ejecutará en G''
es el siguiente.
- Encuentre los componentes conectados de
G''
, digamosH_1, H_2, ..., H_k
- Para cada
H_i
haga un 2-coloreado (digamos rojo y azul) de los nodos. El enfoque del libro de cocina aquí es hacer una búsqueda de profundidad enH_i
alternar colores. Un enfoque simple sería colorear cada vértice enH_i
en función de si el borde correspondiente enG
va deU
aV
(rojo) o deV
aU
(azul). - Las dos opciones para las cuales los nodos para seleccionar de
H_i
son todos los nodos rojos o todos los nodos azules. Elija el nodo de color configurado con mayor peso. Por ejemplo, el conjunto de nodos rojos tiene un peso igual aH_i.nodes.where(node => node.color == red).sum(node => node.w)
. Llame al nodo de mayor peso establecidoN_i
. - Su conjunto máximo de vértices ponderado máximo ahora es
union(N_1, N_2, ..., N_k)
.
Como cada vértice en G''
corresponde a uno de los bordes dirigidos en G
, tienes tu Mapeo Direccional máximo.
Este problema se puede resolver en tiempo polinomial utilizando el algoritmo húngaro . La "prueba" de Vor anterior es incorrecta.
El método de estructurar el problema para el ejemplo anterior es el siguiente:
D E F
A # 7 9
B 1 # #
C # 3 #
donde "#" significa infinito negativo. A continuación, resuelve la matriz utilizando el algoritmo húngaro para determinar la coincidencia máxima. Puede multiplicar los números por -1 si quiere encontrar una coincidencia mínima.