Nous avons un DAG. Nous avons une fonction sur les nœuds (en gros, nous numérotons les nœuds). Nous aimerions créer un nouveau graphique dirigé avec ces règles:
- Seuls les nœuds avec le même numéro peuvent être contractés dans le même nouveau nœud. . (Cependant, .)
- Nous ajoutons tous les anciens bords entre les nouveaux nœuds: .
- Ce nouveau graphique est toujours un DAG.
Quel est le minimal? Qu'est-ce qu'un algorithme créant un nouveau graphique minimal?
Réponses:
Une approche pour résoudre ce problème serait d'utiliser la programmation linéaire entière (ILP). Abordons la version décisionnelle du problème: étant donné , existe-t-il un moyen de contracter des sommets de même couleur pour obtenir un DAG de taille ?≤ kk ≤ k
Cela peut être exprimé comme une instance ILP en utilisant des techniques standard. On nous donne la couleur de chaque sommet dans le graphique d'origine. Je suggère que nous étiquetons chaque sommet avec une étiquette dans ; tous les sommets avec la même étiquette et la même couleur seront contractés. Ainsi, le problème de décision devient: existe-t-il un étiquetage, tel que la contraction de tous les sommets de même couleur de même étiquette donne un DAG?{ 1 , 2 , … , k }
Pour exprimer cela comme un programme linéaire entier, introduisez une variable entière pour chaque sommet , pour représenter l'étiquette sur le sommet . Ajoutez l'inégalité . v v 1 ≤ ℓ v ≤ kℓv v v 1 ≤ ℓv≤ k
L'étape suivante consiste à exprimer l'exigence selon laquelle le graphique contracté doit être un DAG. Notez que s'il existe un étiquetage du formulaire ci-dessus, sans perte de généralité, il existe un tel étiquetage où les étiquettes induisent un tri topologique sur le graphique contracté (c'est-à-dire, si précède dans le graphique contracté, alors l'étiquette de est plus petit que 'étiquette de ). Donc, pour chaque arête dans le graphe d'origine, nous ajouterons la contrainte selon laquelle soit et ont la même étiquette et la même couleur, soit l' étiquette de est plus petite que l'étiquette de . Plus précisément, pour chaque arêtew v w v → w v w v w v → w v , w ℓ v ≤ ℓ w v → w v , w ℓ v < ℓ wv w v w v → w v w v w v → w dans le graphe initial où ont la même couleur, ajoutez l'inégalité . Pour chaque arête où ont des couleurs différentes, ajoutez l'inégalité .v , w ℓv≤ ℓw v→ w v, w ℓv< ℓw
Voyons maintenant s'il existe une solution possible à ce programme linéaire entier. Il y aura une solution réalisable si et seulement si l'étiquetage est de la forme souhaitée (c'est-à-dire que la contraction de tous les sommets de même couleur de même étiquette donne un DAG). En d'autres termes, il y aura une solution réalisable si et seulement s'il existe un moyen de contracter le graphe d'origine à un DAG de taille . Nous pouvons utiliser n'importe quel solveur de programmation linéaire entier; si le solveur ILP nous donne une réponse, nous avons une réponse au problème de décision d'origine.≤ k
Bien sûr, cela n'est pas garanti de se terminer en temps polynomial. Il n'y a aucune garantie. Cependant, les solveurs ILP sont devenus assez bons. Je m'attends à ce que, pour un graphique de taille raisonnable, vous ayez une chance décente qu'un solveur ILP puisse résoudre ce problème dans un délai raisonnable.
Il est également possible de coder cela en tant qu'instance SAT et d'utiliser un solveur SAT. Je ne sais pas si ce serait plus efficace. Cependant, la version ILP est probablement plus facile à penser.
(J'espère que cela est vrai. Je n'ai pas vérifié tous les détails attentivement, alors s'il vous plaît revérifiez mon raisonnement! J'espère que je n'ai pas mal tourné quelque part.)
Mise à jour (10/21): Il semble que les ILP de cette forme puissent être résolus en temps linéaire, en traitant le DAG dans un ordre trié par topologie et en gardant une trace de la limite inférieure sur l'étiquette pour chaque sommet. Cela me fait douter de ma solution: ai-je fait une erreur quelque part?
la source
NOTE: AFAICT, DW a trouvé un trou dans cette réduction et c'est faux (voir commentaires). Le garder ici pour des raisons historiques.
Intro : je vais d'abord réduire le problème Monotone 3SAT à notre problème. Bien que le problème du Monotone 3SAT soit trivialement satisfaisable, notre problème peut en outre résoudre le problème Minimum True Monotone 3SAT , qui est NP-difficile; ce problème est donc NP-difficile.
Réduction de Monotone 3SAT à notre problème
Nous avons une formule booléenne monotone exprimée comme une séquence de variables et une séquence de clauses. Le CNF est de la forme telle que:Φ = ( V, C)
et
Conversion
Nous construisons un graphe, . Chaque sommet de G ' a une étiquette; les sommets avec la même étiquette sont éligibles pour la contraction.g′= V′, E′ g′
Nous construisons d'abord le graphique comme suit: pour chaque , nous faisons deux nœuds, chacun étiqueté x i , et un bord dirigé de l'un à l'autre (cliquez sur les images pour une vue haute résolution).Xje∈V Xje
Ces nœuds peuvent bien sûr être contractés, car ils ont la même étiquette. Nous considérerons les variables / nœuds contractés comme étant évalués comme faux et ceux qui ne sont pas contractés comme évalués comme vrais :
Voici une autre visualisation, déroulant la contrainte de clause:
Ainsi, chaque contrainte de clause nécessite qu'au moins une des variables qu'elle contient reste non contractée; comme les nœuds non contractés sont évalués comme vrais, cela nécessite qu'une des variables soit vraie; exactement ce que Monotone SAT requiert pour ses clauses.
Réduction du minimum vrai monotone 3SAT
Monotone 3SAT est trivialement satisfaisable; vous pouvez simplement définir toutes les variables sur true.
Cependant, puisque notre problème de minimisation DAG consiste à trouver le plus de contractions, cela se traduit par la recherche de l'affectation satisfaisante qui produit le plus de fausses variables dans notre CNF; ce qui revient à trouver les vraies variables minimales. Ce problème est parfois appelé Minimum True Monotone 3SAT ou ici (comme problème d'optimisation ou problème de décision), ou k-True Monotone 2SAT (comme problème de décision plus faible); les deux problèmes NP-difficiles. Ainsi, notre problème est NP-difficile.
Les références:
Sources du graphique:
la source
Avec chaque remplacement (sauf pour les remplacements directs parent-enfant), vous ajoutez de nouvelles relations ancêtre-descendant qui rendent non trivial la détermination de celle qui en vaut la peine à long terme. Par conséquent, un simple algorithme gourmand échouera dans le cas général. Cependant, si vous effectuez une approche par force brute, vous pouvez déterminer le plus petit graphique:
Python-ish (non testé):
Je ne sais pas si c'est vraiment un problème difficile, mais en jouant avec certains graphiques manuellement, cela semble très combinatoire. Je suis curieux de savoir si quelque chose de difficile peut être réduit à ce problème, ou s'il existe un algorithme avec un meilleur temps de fonctionnement.
la source