Mise en correspondance bipartite dirigée maximum pondéré permettant le partage des sommets de début et de fin
soit G (U u u V, E) soit un graphe bipartite dirigé pondéré (i.e. U et V sont les deux ensembles de noeuds du graphe bipartite et E contient des arêtes dirigées pondérées de U à V ou de V à U). Voici un exemple:
dans ce cas:
U = {A,B,C}
V = {D,E,F}
E = {(A->E,7), (B->D,1), (C->E,3), (F->A,9)}
définition: correspondance directe (j'ai inventé ce terme juste pour faire des choses adhérent): ensemble d'arêtes orientées peuvent partager le début ou la fin de sommets. C'est-à-dire, si U - >V et U' - >V' appartiennent tous deux à une DirectionalMatching alors V /= U' et V' /= U mais il se peut que U = U' ou V = V'.
Ma question: la Façon la plus efficace de trouver un DirectionalMatching , tel que défini ci-dessus, pour un bipartite directionnelle pondérée graphique qui maximise la somme des poids de ses arêtes?
par efficacement , je veux dire complexité polynomiale ou plus rapide, je sais déjà mettre en œuvre une approche naïve de la force brute.
dans l'exemple au-dessus du maximum pondéré est: {F->A,C->E,B - >D}, avec une valeur de 13.
démontrer formellement l'équivalence de ce problème à tout autre problème bien connu dans la théorie des graphes serait également valable.
Merci!
Note 1: cette question est basée sur correspondance bipartite pondérée avec les bords dirigés mais avec l'assouplissement supplémentaire qu'il est permis pour les bords dans la correspondance pour partager l'origine ou la destination. Puisque cette relaxation fait une grande différence, j'ai créé une question indépendante.
Note 2: il s'agit d'un maximum poids correspondant. La cardinalité (nombre de bords présents) et le nombre de sommets couverts par l'appariement ne sont pas pertinents pour un résultat correct. Seul le poids maximum compte.
Note 2: au cours de mes recherches pour résoudre le problème, j'ai trouvé cet article, je pense qu'il serait utile à d'autres essayant de trouver une solution: alternant des cycles et des chemins dans bord-coloré multigraphes: une enquête
Note 3: La formulation du problème se transformerait alors en: trouver l'ensemble des bords sans couleur-chemins alternatifs ou cycles qui a la somme de poids maximale.
Note 4: je soupçonne que le problème pourrait être NP-dur, mais je ne suis pas que l'expérience avec réductions, donc je n'ai pas réussi à le prouver encore.
encore un autre exemple :
Imaginez que vous aviez
4 sommets: {u1, u2}
{v1, v2}
4 arêtes: {u1->v1, u1->v2, u2->v1, v2->u2}
alors, quel que soit leur poids, u1->v2
et v2->u2
ne peuvent pas être dans le même correspondance directe , ne peut pas non plus v2->u2
et u2->v1
. Toutefois u1->v1
et u1->v2
peut, et donc peut u1->v1
et u2->v1
.
2 réponses
définit un nouveau graphe non corrigé G'
de G
comme suit.
-
G'
a un noeud(A, B)
avec le poidsw
pour chaque bord dirigé(A, B)
avec le poidsw
dansG
-
G'
a une arête non dirigée((A, B),(B, C))
si (A, B) et (B, C) sont deux arêtes dirigées en G
http://en.wikipedia.org/wiki/Line_graph#Line_digraphs
Trouvez maintenant un vertex indépendant maximal (pondéré) défini dans G'
.
http://en.wikipedia.org/wiki/Vertex_independent_set
Edit: trucs après ce point ne fonctionne que si l'ensemble de l'arête de poids sont les même lors de l'arête de poids ont des valeurs différentes de ses un problème plus difficile à résoudre (google "poids maximum indépendant vertex set" pour possible algorithmes)
en général, ce serait un problème difficile à résoudre. Cependant, G'
est un graphe bipartite -- il ne contient que des cycles égaux. Trouver le vertex indépendant maximal (pondéré) dans un graphe bipartite est et non NP-dur.
l'algorithme que vous exécuterez sur G'
est le suivant.
- trouver les composants connectés de
G'
, direH_1, H_2, ..., H_k
- pour chaque
H_i
faire un 2-coloration (rouge et bleu) des noeuds. L'approche cookbook ici est de faire une recherche en profondeur-première surH_i
couleurs alternées. Une approche simple serait de colorer chaque vertex dansH_i
en se basant sur le fait que le bord correspondant dansG
va deU
àV
(rouge) ou deV
àU
(bleu). - les deux options pour quels noeuds à sélectionnez
H_i
sont soit de tous les noeuds rouges ou tous les nœuds bleus. Choisissez l'ensemble de noeuds colorés avec un poids plus élevé. Par exemple, l'ensemble de noeuds rouges a un poids égal àH_i.nodes.where(node => node.color == red).sum(node => node.w)
. Appeler l'ensemble de noeuds de poids plus élevéN_i
. - votre jeu de vertex indépendant pondéré est maintenant
union(N_1, N_2, ..., N_k)
.
puisque chaque vertex dans G'
correspond à un des bords dirigés dans G
, vous avez votre maximum DirectionalMatching.
ce problème peut être résolu en temps polynomial en utilisant algorithme hongrois . La" preuve " de Vor ci-dessus est fausse.
La méthode de structuration du problème de l'exemple ci-dessus est la suivante:
D E F
A # 7 9
B 1 # #
C # 3 #
où "#" signifie l'infini négatif. Vous résolvez ensuite la matrice en utilisant l'algorithme hongrois pour déterminer la correspondance maximale. Vous pouvez multiplier les nombres par -1 si vous voulez trouver un minimum correspondre.