Set di arco di feedback transitivo (TFAS): NP-complete?


13

Qualche tempo fa, ho pubblicato una richiesta di riferimento per problemi con i grafici in cui desideriamo trovare una 2 partizione dei bordi in cui entrambi i set soddisfano una proprietà non correlata alla loro cardinalità. Stavo cercando di dimostrare che il seguente problema è NP-difficile:

Dato un torneo , esiste un arco di feedback impostato F E in G che definisce una relazione transitiva?G=(V,E)FEG

Ho una costruzione per un tentativo di prova, ma sembra che questo finirà in un vicolo cieco, quindi ho pensato di poter chiedere qui per vedere se mi manca qualcosa di ovvio. Per non limitare la tua creatività a linee di pensiero simili a quelle che ho usato, non posterò qui il mio tentativo.

Questo problema è NP-difficile? In tal caso, come dimostrarlo?


1
perfetto grazie! (Ho cancellato il commento perché ho scritto G = (E, V) invece dello standard G = (V, E) :-)
Marzio De Biasi

6
Se ho capito bene, questo equivale a chiedere se i bordi di un torneo possono essere suddivisi in due DAG, uno dei quali è chiuso in modo transitorio.
dspyz,

1
Per quanto riguarda il commento di dspyz, non ci sono molti problemi sui DAG che possono essere studiati a causa della loro complessità. non ci sono neppure molti teoremi sui DAG. gli alberi sono un po 'più accessibili. il tuo problema (mentre apparentemente interessante come si riflette nei voti) sembra mescolare insieme molti elementi insoliti e non rientrare in nessuna particolare categoria.
vzn

5
@IgorShinkar gli archi di qualsiasi digrafo possono essere suddivisi banalmente in due DAG: ordina arbitrariamente i vertici; un DAG è i bordi anteriori, l'altro DAG è i bordi posteriori.
Sasho Nikolov,

1
@SashoNikolov ovviamente!
Igor Shinkar,

Risposte:


4

Per aggiungere un piccolo contesto, ecco una costruzione per un grafico che non ha un arco di feedback transitivo impostato. Per questa costruzione, userò il seguente grafico del gadget:

grafico del gadget utilizzato per forzare le implicazioni

Questo torneo ha le seguenti proprietà (che ho verificato usando un programma, non l'ho provato formalmente):

  • se (2,7) non è in un dato TFAS, allora (1,3) è
  • se (5,1) è in un dato TFAS, allora lo è anche (3,6)
  • se (7,3) è in un dato TFAS, allora (5,1) non lo è

o abusando leggermente della notazione logica predicata:

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

Noterai che per ogni implicazione, i due bordi sono disgiunti in modo a coppie, quindi i seguenti lavori di costruzione:

costruzione per un grafico che non ha un TFAS

UN


Mi dispiace, non lo seguo. C'è qualche motivo per cui non puoi semplicemente pubblicare un elenco dei bordi in modo che io possa eseguirlo attraverso un risolutore ASP e provare a verificarlo? Secondo clingo, il grafico del tuo gadget ha 8 diversi TFAS. Ecco il più piccolo: tfas (edge ​​(5,0)) tfas (edge ​​(6,0)) tfas (edge ​​(7,0)) tfas (edge ​​(6,2)) tfas (edge ​​(7,3)) tfas (edge ​​(1,2)) tfas (edge ​​(1,3)) tfas (edge ​​(7,5))
dspyz

Ho appena notato che hai menzionato il bordo (6,3) nel grafico del gadget, ma l'immagine che hai fornito ha il bordo (3,6)
dspyz

L'ho capito, vedi la mia risposta aggiornata: cstheory.stackexchange.com/a/20778/13643
dspyz

@dspyz Ho pensato che la costruzione fosse più chiara di un semplice elenco dei bordi, poiché se il mio ragionamento non fosse sbagliato, tutto ciò che sarebbe necessario verificare è se il torneo sopra la costruzione avesse effettivamente tali proprietà di implicazione. Grazie per aver sottolineato l'errore su edge (3,6)! Ho anche ricevuto 8 TFAS per quel gadget, quello che hai elencato è uno di questi.
G. Bach,

Mi dispiace. Ho sbagliato a costruire il grafico. Ho risolto il problema e Clingo ora non segnala alcun TFAS.
dspyz,

1

Ho eseguito un breve programma di clingo che non riportava alcun grafico senza TFAS, ma c'era un bug. L'ho risolto e ora verifica che non ci sia un grafico senza TFAS per n = 8 o meno. Per n = 9, trova questo:

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))

Ecco la codifica (fissa)

% 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.

clingo -c n=7 tfas.aspEseguilo con (Uso di clingo 4.2.1)

(n = 7 indica grafici di esattamente 7 vertici)

Dovrebbe tornare soddisfacente se e solo se esiste un grafico senza TFAS su 7 vertici.


Ok, ho capito quale grafico @ G.Bach stava descrivendo e lo ho codificato in clingo (vedi la descrizione di clingo sotto. Inizia con una descrizione del grafico del gadget e procede a descrivere come unire copie di esso insieme per ottenere il pieno Il grafico del torneo a 34 vertici G.Bach sta descrivendo. Ho allegato anche la descrizione del grafico a terra).

Ho quindi proceduto a eseguire clingo su quel grafico e ha affermato di aver trovato un TFAS con 241 bordi. Ma ho fatto un errore nella codifica del grafico. Ho risolto l'errore e clingo ora risulta insoddisfacente (cioè non c'è TFAS).

Ecco il programma per trovare i TFAS su un grafico

{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.

Ecco il programma (aggiornato) per generare il grafico di G.Bach. Ho aggiunto degli indicatori alla fine per verificare che il grafico sia un grafico di torneo ben formato:

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.

Sono sicuro che c'è un torneo su 18 vertici che non ha un TFAS.
G. Bach,

Puoi per favore darlo come esempio? Basta allegare un file con i bordi elencati
dspyz,

Come allego un file? Potrebbero essere necessarie alcune ore, al momento non ho il torneo. Ho anche calcolato male, dovrebbe avere 34 vertici. Probabilmente è più facile verificare se fornisco i mattoni del torneo.
G. Bach,

Carica su qualsiasi host di file e link ad esso (vedi meta.stackexchange.com/a/4643/185877 ), o se ha una struttura regolare, descrivilo (dai i mattoni)
dspyz

non riesci ancora a seguire il tuo codice ma stai affermando che stai convalidando per n≤20 finito? ultima frase che afferma che è vero per tuttin... se così notevole (!) ma non una "soluzione" alla domanda generale (che richiederebbe una prova di tutti i casi di dimensioni). ps thx per lavorare / pubblicare un'osservazione empirica su questo sito che in generale è raro ... @ G. Bach sarebbe bello vedere un'immagine del grafico piuttosto che solo elenchi di bordi / vertici, se possibile
vzn,

0

Congettura SWAG [qualcosa di meglio che niente?]:

Dato un torneo sol=(V,E), esiste un arco di feedback impostato FE nel solche definisce una relazione transitiva. quindi il problema èO(1)

note: contro-esempi di sparatorie benvenuti! nessuno sembra essere stato dato finora. ancora meglio sarebbero alcune osservazioni di modelli di orientamenti dei bordi relativi a particolari classi di grafi. o qualche altra motivazione o legandola a qualche letteratura esistente. offerto nello stile di Prove e confutazioni (Lakatos) ... inoltre, poiché sembra un problema così insolito che [non ancora?] si riferisce a molto, suggerisce di studiarlo empiricamente ....


1
Ho eseguito un programma per verificare se questo vale e ho scoperto che ci sono tornei che non hanno un arco di feedback transitivo impostato. Ne pubblicherò uno domani, non ci riuscirò oggi.
G. Bach,

@vzn puoi provare la congettura per un torneo casuale?
Igor Shinkar,

Controesempio con solo 5 vertici: a-> b, a-> c, b-> c, d-> a, b-> d, c-> d, e-> a, e-> b, c-> e , d-> e. Per quattro vertici, il grafico indotto contiene un ciclo, quindi un DAG transitivo può contenere al massimo 3 spigoli tra 3 vertici del grafico. Ci sono solo 5 possibilità (tutte le altre terzine sono cicli): abc, eab, dea, bcd, cde È facile verificare che in ciascuno dei cinque casi sia presente un ciclo tra gli altri 7 bordi
dspyz

1
Sì, nvr mente, non è un controesempio
dspyz,

1
@dspyz Ho eseguito un controllo della forza bruta su tutti i tornei su un massimo di 8 vertici. Tutti hanno set di archi di feedback transitivi, ma ce ne sono alcuni che puoi usare per costruire un torneo che non lo è.
G. Bach,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.