Jeu d'arc à rétroaction transitive (TFAS): NP-complet?

13

Il y a quelque temps, j'ai publié une demande de référence pour les problèmes de graphe où nous voulons trouver une partition à 2 des bords où les deux ensembles remplissent une propriété sans rapport avec leur cardinalité. J'essayais de prouver que le problème suivant est NP-difficile:

Étant donné un tournoi , y a-t-il un arc de rétroaction F E dans G qui définit une relation transitive?G=(V,E)FEG

J'ai une construction pour une tentative de preuve, mais il semble que cela va aboutir à une impasse, alors j'ai pensé que je pourrais demander ici pour voir si je manque quelque chose d'évident. Afin de ne pas limiter votre créativité à des pistes de réflexion similaires à celles que j'ai utilisées, je ne posterai pas ma tentative ici.

Ce problème est-il difficile à résoudre? Si oui, comment le prouver?

G. Bach
la source
1
parfait merci! (J'ai supprimé le commentaire car j'ai écrit G = (E, V) au lieu du G = (V, E) standard :-)
Marzio De Biasi
6
Si je comprends bien, cela revient à demander si les bords d'un tournoi peuvent être partitionnés en deux DAG, dont l'un est transitoirement fermé.
dspyz
1
Concernant le commentaire de dspyz, il n'y a pas beaucoup de problèmes sur les DAG qui peuvent être étudiés en raison de leur complexité. il n'y a même pas beaucoup de théorèmes sur les DAG, semble-t-il. les arbres sont un peu plus accessibles. votre problème (bien qu'apparemment intéressant comme en témoignent les votes) semble mélanger beaucoup d'éléments inhabituels et ne rentrer dans aucune catégorie particulière.
vzn
5
@IgorShinkar les arcs de n'importe quel digraphe peuvent être divisés trivialement en deux DAG: ordonner les sommets arbitrairement; un DAG est les bords avant, l'autre DAG est les bords arrière.
Sasho Nikolov, le
1
@SashoNikolov bien sûr!
Igor Shinkar

Réponses:

4

Pour ajouter un peu de contexte, voici une construction pour un graphique qui n'a pas d'arc de rétroaction transitive défini. Pour cette construction, j'utiliserai le graphique de gadget suivant:

graphique de gadget utilisé pour forcer les implications

Ce tournoi a les propriétés suivantes (que j'ai vérifiées à l'aide d'un programme, je ne l'ai pas prouvé formellement):

  • si (2,7) n'est pas dans un TFAS donné, alors (1,3) est
  • si (5,1) est dans un TFAS donné, alors (3,6)
  • si (7,3) est dans un TFAS donné, alors (5,1) n'est pas

ou abusant légèrement de la notation logique des prédicats:

  • ¬(2,sept)(1,3)
  • (5,1)(3,6)
  • (sept,3)¬(5,1)

Vous remarquerez que pour chaque implication, les deux bords sont disjoints deux à deux, de sorte que la construction suivante fonctionne:

construction pour un graphique qui n'a pas de TFAS

UNE

G. Bach
la source
Je suis désolé, je ne suis pas. Y a-t-il une raison pour laquelle vous ne pouvez pas simplement publier une liste des bords afin que je puisse l'exécuter via un solveur ASP et essayer de le vérifier? Selon Clingo, votre graphique de gadget a 8 TFAS différents. Voici le plus petit: tfas (bord (5,0)) tfas (bord (6,0)) tfas (bord (7,0)) tfas (bord (6,2)) tfas (bord (7,3)) tfas (bord (1,2)) tfas (bord (1,3)) tfas (bord (7,5))
dspyz
Je viens de remarquer que vous avez mentionné le bord (6,3) dans le graphique du gadget, mais l'image que vous avez fournie a le bord (3,6)
dspyz
Je l'ai compris, voir ma réponse mise à jour: cstheory.stackexchange.com/a/20778/13643
dspyz
@dspyz Je pensais que la construction était plus claire qu'une simple liste des bords, car si mon raisonnement n'est pas faux, tout ce qui serait nécessaire pour vérifier est de savoir si le tournoi au-dessus de la construction a réellement ces propriétés d'implication. Merci d'avoir signalé l'erreur sur le bord (3,6)! J'ai également obtenu 8 TFAS pour ce gadget, celui que vous avez indiqué étant l'un d'eux.
G. Bach
Je suis désolé. J'ai mal construit le graphique. Je l'ai corrigé et clingo ne signale plus aucun TFAS.
dspyz
1

J'ai exécuté un court programme de clingo qui n'a signalé aucun graphique sans TFAS, mais il y avait un bug. Je l'ai corrigé et maintenant il vérifie qu'il n'y a pas de graphique sans TFAS pour n = 8 ou moins. Pour n = 9, il trouve celui-ci:

is_edge(edge(2,3)) is_edge(edge(1,4)) is_edge(edge(2,4)) is_edge(edge(3,5)) is_edge(edge(4,5)) is_edge(edge(1,6)) is_edge(edge(2,6)) is_edge(edge(3,6)) is_edge(edge(5,6)) is_edge(edge(1,7)) is_edge(edge(4,7)) is_edge(edge(5,7)) is_edge(edge(6,7)) is_edge(edge(1,8)) is_edge(edge(3,8)) is_edge(edge(4,8)) is_edge(edge(5,9)) is_edge(edge(6,9)) is_edge(edge(7,9)) is_edge(edge(2,1)) is_edge(edge(3,1)) is_edge(edge(4,3)) is_edge(edge(5,1)) is_edge(edge(5,2)) is_edge(edge(6,4)) is_edge(edge(7,2)) is_edge(edge(7,3)) is_edge(edge(8,2)) is_edge(edge(8,5)) is_edge(edge(8,6)) is_edge(edge(8,7)) is_edge(edge(9,1)) is_edge(edge(9,2)) is_edge(edge(9,3)) is_edge(edge(9,4)) is_edge(edge(9,8))

Voici l'encodage (fixe)

% tfas.asp
#show is_edge/1.
vertex(1..n).

opp_edges(edge(A,B),edge(B,A)) :- vertex(A), vertex(B), A < B.
possible_edge(E1;E2) :- opp_edges(E1,E2).

{is_edge(E1); is_edge(E2)} = 1 :- opp_edges(E1, E2).
ntfas(E) :- possible_edge(E), not is_edge(E).
ntfas(edge(X, X)) :- vertex(X).

tfas(E) | fs(E) :- is_edge(E).
ntfas(E) :- fs(E).

broken :- ntfas(edge(A,C)), tfas(edge(A, B)), tfas(edge(B,C)).

reachable(X, Y) :- fs(edge(X, Y)), is_edge(edge(X, Y)).
reachable(X, Z) :- reachable(X, Y), fs(edge(Y, Z)), is_edge(edge(Y, Z)).
broken :- reachable(X, X).

tfas(E) :- broken, possible_edge(E).
fs(E) :- broken, possible_edge(E).
:- not broken.

Exécutez-le avec clingo -c n=7 tfas.asp(Utilisation de clingo 4.2.1)

(le n = 7 indique des graphiques d'exactement 7 sommets)

Il devrait retourner satisfaisable si et seulement s'il existe un graphe sans TFAS sur 7 sommets.


Ok, j'ai compris quel graphique @ G.Bach décrivait et codé dans clingo (voir la description de clingo ci-dessous. Il commence par une description du graphique du gadget et continue à décrire comment joindre des copies ensemble pour obtenir le plein Le graphique du tournoi à 34 sommets décrit par G.Bach. J'ai également joint la description du graphique à la terre).

J'ai ensuite exécuté clingo sur ce graphique et il a prétendu avoir trouvé un TFAS avec 241 bords. Mais j'ai fait une erreur dans l'encodage du graphique. J'ai corrigé l'erreur et clingo rapporte désormais des insatisfaisants (c'est-à-dire qu'il n'y a pas de TFAS).

Voici le programme pour trouver les TFAS sur un graphique

{tfas(E)} :- is_edge(E).
:- not tfas(edge(A,C)), tfas(edge(A, B)), tfas(edge(B,C)).

reachable(X, Y) :- not tfas(edge(X, Y)), is_edge(edge(X, Y)).
reachable(X, Z) :- reachable(X, Y), not tfas(edge(Y, Z)), is_edge(edge(Y, Z)).
:- reachable(X, X).

tfas_count(N) :- N = #count{tfas(E) : tfas(E)}.

#show tfas/1.
#show tfas_count/1.

Voici le programme (mis à jour) pour générer le graphique de G.Bach. J'ai ajouté des indicateurs à la fin pour vérifier que le graphique est un graphique de tournoi bien formé:

gadget_vertex(0..7).

gadget_edge(0,1).
gadget_edge(0,2).
gadget_edge(0,3).
gadget_edge(0,4).
gadget_edge(1,2).
gadget_edge(1,3).
gadget_edge(1,6).
gadget_edge(1,7).
gadget_edge(2,3).
gadget_edge(2,4).
gadget_edge(2,5).
gadget_edge(2,7).
gadget_edge(3,4).
gadget_edge(3,5).
gadget_edge(3,6).
gadget_edge(4,1).
gadget_edge(4,5).
gadget_edge(4,6).
gadget_edge(4,7).
gadget_edge(5,0).
gadget_edge(5,1).
gadget_edge(5,6).
gadget_edge(6,0).
gadget_edge(6,2).
gadget_edge(6,7).
gadget_edge(7,0).
gadget_edge(7,3).
gadget_edge(7,5).

special_edge(a;b;c;d;e).

forces(a,b).
forces(b,c).
forcesn(c,a).
nforces(a,d).
forces(d,e).
forces(e,a).

relates(A,B) :- forces(A,B).
relates(A,B) :- nforces(A,B).
relates(A,B) :- forcesn(A,B).

is_se_pair(se_pair(A,B)) :- relates(A,B).
vertex_name(v(V,P)) :- gadget_vertex(V), is_se_pair(P).

matches(from(A), v(5, se_pair(A,B))) :- forces(A,B).
matches(to(A), v(1, se_pair(A,B))) :- forces(A,B).
matches(from(B), v(3, se_pair(A,B))) :- forces(A,B).
matches(to(B), v(6, se_pair(A,B))) :- forces(A,B).

matches(from(A), v(2, se_pair(A,B))) :- nforces(A,B).
matches(to(A), v(7, se_pair(A,B))) :- nforces(A,B).
matches(from(B), v(1, se_pair(A,B))) :- nforces(A,B).
matches(to(B), v(3, se_pair(A,B))) :- nforces(A,B).

matches(from(A), v(7, se_pair(A,B))) :- forcesn(A,B).
matches(to(A), v(3, se_pair(A,B))) :- forcesn(A,B).
matches(from(B), v(5, se_pair(A,B))) :- forcesn(A,B).
matches(to(B), v(1, se_pair(A,B))) :- forcesn(A,B).

same_vertex(V, V) :- vertex_name(V).
same_vertex(M, N; N, M) :- matches(X, M), matches(X, N).

already_found(v(Y,N2)) :- vertex_name(v(X,N1)), same_vertex(v(X,N1),v(Y,N2)), N1 < N2.
vertex(V) :- vertex_name(V), not already_found(V).

named_gadget_edge(edge(v(X,SE),v(Y,SE))) :- gadget_edge(X,Y), is_se_pair(SE).
from_gadget_edge_named(edge(A, B), edge(C,D)) :- named_gadget_edge(edge(C,D)), same_vertex(A,C), same_vertex(B,D), vertex(A), vertex(B).
from_gadget_edge(edge(A,B)) :- from_gadget_edge_named(edge(A,B),edge(C,D)).
is_edge(E) :- from_gadget_edge(E).
is_edge(edge(A,B)) :- vertex(A), vertex(B), A < B, not from_gadget_edge(edge(B,A)).

vertex_count(VN) :- VN = #count{vertex(V) : vertex(V)}.
edge_count(EN) :- EN = #count{is_edge(E) : is_edge(E)}.

#show vertex_count/1.
#show edge_count/1.

bidirectional :- is_edge(edge(A,B)), is_edge(edge(B,A)).
phantom_vertex :- is_edge(edge(A,B)), not vertex(A).
phantom_vertex :- is_edge(edge(A,B)), not vertex(B).
incomplete :- vertex(A), vertex(B), not is_edge(edge(A,B)), not is_edge(edge(B,A)), A != B.

#show bidirectional/0.
#show phantom_vertex/0.
#show incomplete/0.
dspyz
la source
Je suis certain qu'il y a un tournoi sur 18 sommets qui n'a pas de TFAS.
G. Bach
Pouvez-vous s'il vous plaît donner un exemple? Il suffit de joindre un fichier avec les bords répertoriés
dspyz
Comment joindre un fichier? Cela peut prendre quelques heures, je n'ai pas le tournoi en main pour l'instant. J'ai également mal calculé, il devrait avoir 34 sommets. Il est probablement plus facile de vérifier si je donne les éléments de base du tournoi.
G. Bach
Téléchargez vers n'importe quel hôte de fichier et liez-le (voir meta.stackexchange.com/a/4643/185877 ), ou s'il a une structure régulière, décrivez-le simplement (donnez les blocs de construction)
dspyz
n
0

Conjecture SWAG [quelque chose de mieux que rien?]:

g=(V,E)FEgO(1)

notes: contre-exemples de shootdown bienvenus! aucun ne semble avoir été donné jusqu'à présent. encore mieux seraient quelques observations de modèles d'orientations de bords liés à des classes de graphes particulières. ou un peu plus de motivation ou de le lier à une littérature existante. offert dans le style des preuves et des réfutations (Lakatos) ... aussi, comme il semble qu'un problème si décalé qui ne se rapporte pas [encore?] à beaucoup, suggère de l'étudier empiriquement ....

vzn
la source
1
J'ai exécuté un programme pour vérifier si cela tient et j'ai constaté qu'il y avait des tournois qui n'avaient pas d'arc de rétroaction transitive. J'en posterai un demain, je n'y reviendrai pas aujourd'hui.
G. Bach
@vzn pouvez-vous prouver la conjecture d'un tournoi aléatoire?
Igor Shinkar
Contre-exemple avec seulement 5 sommets: a-> b, a-> c, b-> c, d-> a, b-> d, c-> d, e-> a, e-> b, c-> e , d-> e. Pour quatre sommets quelconques, le graphe induit contient un cycle, donc un DAG transitif peut contenir au plus 3 arêtes parmi 3 sommets du graphe. Il n'y a que 5 possibilités (tous les autres triplets sont des cycles): abc, eab, dea, bcd, cde Il est facile de vérifier que dans chacun des cinq cas il y a un cycle parmi les 7 autres bords
dspyz
1
Oui, l'esprit NVR, ce n'est pas un contre
dspyz
1
@dspyz J'ai effectué un test de force brute sur tous les tournois sur un maximum de 8 sommets. Tous ont des jeux d'arc à rétroaction transitive, mais vous pouvez en utiliser certains pour créer un tournoi qui n'en a pas.
G. Bach