Conjunto de arco de feedback transitivo (TFAS): NP-complete?


13

Há algum tempo, publiquei uma solicitação de referência para problemas gráficos, onde queremos encontrar uma partição em 2 das arestas, em que os dois conjuntos cumprem uma propriedade não relacionada à sua cardinalidade. Eu estava tentando provar que o seguinte problema é difícil de NP:

Dado um torneio , existe um arco de feedback definido F E em G que define uma relação transitiva?G=(V,E)FEG

Eu tenho uma construção para uma tentativa de prova, mas parece que isso vai acabar em um beco sem saída, então pensei em pedir aqui para ver se estou perdendo algo óbvio. Para não limitar sua criatividade a linhas de pensamento semelhantes às que usei, não publicarei minha tentativa aqui.

Este problema é NP-difícil? Se sim, como provar isso?


1
perfeito, obrigado! (I suprimido o comentário porque escreveu G = (E, V) em vez do L-padrão = (V, E) :-)
Marzio De Biasi

6
Se bem entendi, isso equivale a perguntar se as bordas de um torneio podem ser particionadas em dois DAGs, um dos quais é fechado temporariamente.
dspyz

1
No comentário de dspyz, não há muitos problemas nos DAGs que podem ser estudados devido à complexidade deles. nem sequer existem muitos teoremas sobre os DAGs. as árvores são um pouco mais acessíveis. seu problema (embora aparentemente interessante, como refletido nos votos) parece misturar muitos elementos incomuns e não se encaixa em nenhuma categoria específica.
vzn

5
@IgorShinkar, os arcos de qualquer dígrafo podem ser particionados trivialmente em dois DAGs: ordene os vértices arbitrariamente; um DAG são as arestas dianteiras, o outro DAG são as arestas traseiras.
Sasho Nikolov

1
@SashoNikolov, é claro!
Igor Shinkar

Respostas:


4

Para adicionar um pouco de contexto, aqui está uma construção para um gráfico que não possui um arco de feedback transitivo definido. Para esta construção, usarei o seguinte gráfico de gadget:

gráfico de gadgets usado para forçar implicações

Este torneio tem as seguintes propriedades (que eu verifiquei usando um programa, não o provei formalmente):

  • se (2,7) não estiver em um determinado TFAS, (1,3) será
  • se (5,1) está em um determinado TFAS, então o é (3,6)
  • se (7,3) estiver em um determinado TFAS, (5,1) não será

ou notação lógica de predicado abusando levemente:

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

Você notará que, para cada implicação, as duas arestas são separadas por pares, portanto, as seguintes obras de construção:

construção para gráfico que não possui um TFAS

A


Me desculpe, eu não sigo. Existe algum motivo para você não poder simplesmente postar uma lista das bordas para que eu possa executá-lo através de um solucionador ASP e tentar verificá-lo? De acordo com o clingo, seu gráfico de gadgets possui 8 TFAS diferentes. Aqui está o menor: tfas (borda (5,0)) tfas (borda (6,0)) tfas (borda (7,0)) tfas (borda (6,2)) tfas (borda (7,3)) tfas (borda (1,2)) tfas (borda (1,3)) tfas (borda (7,5))
dspyz

Acabei de notar que você mencionou a aresta (6,3) no gráfico de gadgets, mas a imagem que você forneceu tem a aresta (3,6)
dspyz

Eu percebi isso, ver a minha resposta atualização: cstheory.stackexchange.com/a/20778/13643
dspyz

@dspyz Eu pensei que a construção era mais clara do que apenas uma lista das arestas, pois se meu raciocínio não estiver errado, tudo o que seria necessário para verificar é se o torneio acima da construção realmente tem essas propriedades de implicação. Obrigado por apontar o erro sobre o edge (3,6)! Eu também tenho 8 TFAS para esse gadget, o que você listou como um deles.
G. Bach

Eu sinto Muito. Eu construí o gráfico errado. Corrigi o problema e o clingo agora não reporta nenhum TFAS.
Dspyz

1

Eu executei um pequeno programa clingo que não relatava gráfico sem um TFAS, mas havia um erro. Corrigi-o e agora verifica se não há gráfico sem um TFAS para n = 8 ou menos. Para n = 9, encontra este:

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

Aqui está a codificação (fixa)

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

Execute-o com clingo -c n=7 tfas.asp(Usando o clingo 4.2.1)

(o n = 7 indica gráficos de exatamente 7 vértices)

Ele deve retornar satisfatório se, e somente se, existir um gráfico sem TFAS em 7 vértices.


Ok, eu descobri o gráfico que o G.Bach estava descrevendo e o codifiquei no clingo (veja a descrição do clingo abaixo. Começa com uma descrição do gráfico de gadgets e passa a descrever como juntar cópias dele para obter o máximo O gráfico de torneio de 34 vértices G.Bach está descrevendo. Anexei também a descrição do gráfico fundamentado).

Comecei a rodar o clingo nesse gráfico e ele alegou ter encontrado um TFAS com 241 arestas. Mas cometi um erro na codificação do gráfico. Corrigi o erro e o clingo agora relata insatisfatório (ou seja, não existe TFAS).

Aqui está o programa para encontrar TFAS em um gráfico

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

Aqui está o programa (atualizado) para gerar o gráfico de G.Bach. Adicionei indicadores no final para verificar se o gráfico é um gráfico de torneio bem formado:

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.

Tenho certeza de que há um torneio em 18 vértices que não possui um TFAS.
G. Bach

Você pode dar um exemplo? Apenas anexar um arquivo com as bordas listados
dspyz

Como anexar um arquivo? Pode demorar algumas horas, não tenho o torneio em mãos agora. Eu também calculei mal, deveria ter 34 vértices. Provavelmente é mais fácil verificar se eu dou os alicerces do torneio.
G. Bach

Faça o upload para qualquer host de arquivo e vincule-o (consulte meta.stackexchange.com/a/4643/185877 ) ou, se tiver uma estrutura regular, descreva-a (forneça os blocos de construção)
dspyz

n

0

Conjectura SWAG [algo melhor que nada?]:

G=(V,E)FEGO(1)

notas: contra-exemplos de derrubadas são bem-vindos! nenhum parece ter sido dado até agora. melhor ainda, algumas observações de padrões de orientações de arestas relacionadas a classes gráficas específicas. ou um pouco mais de motivação ou vinculação a alguma literatura existente. oferecido no estilo de Provas e refutações (Lakatos) ... também, como parece um problema tão incomum que ainda não se relaciona a muito, sugiro estudá-lo empiricamente ...


1
Eu executei um programa para verificar se isso é válido e descobri que existem torneios que não têm um arco de feedback transitivo definido. Vou postar um amanhã, não vou dar a volta hoje.
G. Bach

@vzn você pode provar a conjectura de um torneio aleatório?
Igor Shinkar

Contraexemplo com apenas 5 vértices: a-> b, a-> c, b-> c, d-> a, b-> d, c-> d, e-> a, e-> b, c-> e , d-> e. Para quaisquer quatro vértices, o gráfico induzido contém um ciclo, portanto, um DAG transitivo pode conter no máximo 3 arestas entre 3 vértices do gráfico. Existem apenas 5 possibilidades (todos os outros trigêmeos são ciclos): abc, eab, dea, bcd, cde É fácil verificar se em cada um dos cinco casos existe um ciclo entre as outras 7 arestas
dspyz

1
Sim, mente NVR, não é um contra
dspyz

1
@dspyz Fiz uma verificação de força bruta em todos os torneios em até 8 vértices. Todos eles têm conjuntos de arco de feedback transitivo, mas existem alguns que você pode usar para criar um torneio que não possui.
G. Bach
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.