Je pense que ce problème est NP-difficile. J'essaie d'esquisser une réduction de MinSAT. Dans le problème MinSAT, on nous donne un CNF et notre objectif est de minimiser le nombre de clauses satisfaites. Ce problème est NP-difficile, voir par exemple http://epubs.siam.org/doi/abs/10.1137/S0895480191220836?journalCode=sjdmec
Divisez les sommets en deux groupes - certains représenteront des littéraux, les autres clauses, donc où est le nombre de variables du CNF (généralement dénoté par ) et est le nombre de clauses. Dirigez une arête de chaque sommet littéral vers le sommet de la clause où elle se produit. Définissez pour un sommet littéral qui représente comme (où est un paramètre arbitraire), donc soit et ou et . Pour chaque clause-vertix, soitn=2v+cvncSxi{i,i+v+k}kf(xi)=if(x¯i)=i+v+kf(x¯i)=if(xi)=i+v+kkS={v+1,…,v+k,2v+k+1,…,n}, donc des vertex de clause sont `` petits ''.k
Maintenant, le CNF a une affectation où au moins clauses sont fausses si et seulement si votre problème peut être résolu pour l'instance ci-dessus. Le problème MinSAT est exactement de tester si une formule CNF φ a une affectation qui rend faux au moins k clauses, donc cela montre que votre problème est NP-difficile.kφk
Pour vous aider à comprendre cette réduction, voici l'intuition: les petites étiquettes ( ) correspondent à la valeur de vérité Faux et les grandes étiquettes ( v + k + 1 , … , 2 v + k ) correspondent à Vrai. Les contraintes pour les sommets littéraux garantissent que chaque x i est soit vrai soit faux et que ¯ x i1,2,…,v+kv+k+1,…,2v+kxixi¯¯¯¯¯a la valeur de vérité opposée. Les arêtes garantissent que si un littéral est vrai, tous les sommets de clause qui le contiennent sont également affectés True. (En revanche, si tous les littéraux d'une clause se voient attribuer la valeur False, cette structure de graphe permet d'affecter le vertex de la clause à False ou True.) Enfin, le choix de garantit que k des vertex de la clause sont False et c - k d'entre eux ont la valeur True. Donc, s'il y a une sorte topologique valide de ce graphe, alors il y a une affectation aux variables qui fait au moins k des clauses de φkkc−kkφfalse (tous les vertex de clause affectés à False, plus peut-être certains de ceux à True). Inversement, s'il y a une affectation aux variables qui rend au moins des clauses de φ faux, alors il y a une sorte topologique valide de ce graphique (nous remplissons les étiquettes pour les sommets littéraux de la manière évidente; et pour chaque clause de φ qui est vraie, nous donnons à sa clause-sommet correspondante une étiquette qui correspond à True; les autres clauses-sommets peuvent recevoir des étiquettes correspondant à une valeur de vérité arbitraire).kφφ
Notez que si vous relâchez le problème en permettant à d'être arbitraire (pas nécessairement bijectif), alors il devient polynomial. L'algorithme procède de manière similaire au tri topologique: vous numérotez les sommets un par un, en conservant l'ensemble U de sommets non numérotés dont les voisins voisins ont été numérotés. Dans la mesure du possible, vous choisissez un sommet x ∈ U et le numérotez avec le plus petit élément de S ( x ) supérieur au nombre de ses voisins. Il n'est pas difficile de voir qu'une instance ( G , S ) a une solution si l'algorithme précédent s'exécute ( G ,f U x∈U S(x) (G,S) se termine par tous les sommets numérotés.(G,S)
la source
Une observation banale est que si pour tout x , alors ce problème est résoluble en temps polynomial, par réduction à 2SAT.|S(x)|≤2 x
Voici comment. Introduisez une variable pour chaque sommet x et chaque i tel que i ∈ S ( x ) . Pour chaque paire x , y de sommets, s'il y a un chemin de x à y , on obtient des contraintes: si i ∈ S ( x ) , j ∈ S ( y ) , et i > j , alors on obtient la contrainte ¬ v x , ivx,i x i i∈S(x) x,y x y i∈S(x) j∈S(y) i>j . La bijectivité nous donne un autre ensemble de contraintes: pour chaque paire x , y de sommets avec x ≠ y , si i ∈ S ( x ) et i ∈ S ( y ) , on ajoute ¬ v x , i ∨ ¬ v y , i . Enfin, l'exigence d'attribuer une étiquette à chaque sommet nous donne encore un autre ensemble de contraintes: pour chaque x , si S (¬vx,i∨¬vy,j x,y x≠y i∈S(x) i∈S(y) ¬vx,i∨¬vy,i x , on obtient la contrainte v x , i ∨ v x , j . (Notez que seul le dernier ensemble de contraintes exploite la promesse que | S ( x ) | ≤ 2 pour chaque x .)S(x)={i,j} vx,i∨vx,j |S(x)|≤2 x
Je réalise que cette observation ne vous aidera pas dans votre situation particulière. Désolé pour ça.
la source