과도 피드백 아크 세트 (TFAS) : NP- 완료?


13

얼마 전에 두 세트가 카디널리티와 관련이없는 속성을 충족시키는 가장자리의 2 파티션을 찾고자하는 그래프 문제 에 대한 참조 요청 을 게시 했습니다 . 나는 다음과 같은 문제가 NP-hard라는 것을 증명하려고 노력했다.

토너먼트 가 주어지면, 전 이적 관계를 정의하는 피드백 아크 세트 F EG 에 있습니까?G=(V,E)FEG

나는 증거를 시도하기위한 구성을 가지고 있지만 그것이 막 다른 길에 빠질 것 같습니다. 그래서 나는 여기에 분명한 것이 빠져 있는지 여부를 물어볼 수 있다고 생각했습니다. 내가 사용한 것과 비슷한 사고 방식으로 창의력을 제한하지 않기 위해 여기에 내 시도를 게시하지 않습니다.

이 문제가 NP-hard입니까? 그렇다면 어떻게 증명해야합니까?


1
고마워요! (표준 G = (V, E) 대신 G = (E, V)를 작성했기 때문에 주석을 삭제했습니다.
Marzio De Biasi

6
올바르게 이해하면 토너먼트의 가장자리를 두 개의 DAG로 나눌 수 있는지 묻는 것과 같습니다. 그 중 하나는 전 이적으로 닫힙니다.
dspyz

1
dspyz의 의견에 따르면, DAG에는 복잡성으로 인해 연구 할 수있는 많은 문제가 없습니다. 심지어 DAG에 대한 많은 정리가 보이지 않을 것입니다. 나무는 조금 더 접근하기 쉽습니다. 귀하의 문제 (투표에 반영 된 것처럼 분명히 흥미로운)는 많은 특이한 요소를 함께 혼합하여 특정 범주에 맞지 않는 것으로 보입니다.
vzn

5
@IgorShinkar 모든 digraph의 호는 두 개의 DAG로 사소하게 나눌 수 있습니다. 정점을 임의로 정렬하십시오. 한 DAG는 앞쪽 가장자리이고 다른 DAG는 뒷쪽 가장자리입니다.
Sasho Nikolov

1
물론 @SashoNikolov!
Igor Shinkar

답변:


4

약간의 맥락을 추가하기 위해 다음은 전이 피드백 아크 세트가없는 그래프의 구성입니다. 이 구성에는 다음 가젯 그래프를 사용합니다.

시사점을 강요하는 데 사용되는 가젯 그래프

이 토너먼트에는 다음과 같은 속성이 있습니다 (프로그램을 사용하여 확인했지만 공식적으로 증명하지 않았습니다).

  • (2,7)이 주어진 TFAS에 없으면 (1,3)은
  • 주어진 TFAS에 (5,1)이 있으면 (3,6)도
  • (7,3)이 주어진 TFAS에 있으면 (5,1)은 그렇지 않습니다

또는 약간 남용하는 술어 논리 표기법 :

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

각 의미에 대해 두 모서리가 쌍으로 분리되어 있으므로 다음과 같은 구성 작업이 수행됩니다.

TFAS가없는 그래프 구성

A


미안하지만 따르지 않습니다. 가장자리 목록을 게시하여 ASP 솔버를 통해 실행하고 확인하려고 할 수있는 이유가 있습니까? clingo에 따르면 가젯 그래프에는 8 가지 TFAS가 있습니다. 가장 작은 것이 있습니다 : 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 2016 년

방금 가젯 그래프에서 가장자리 (6,3)를 언급 한 것을 보았지만 제공 한 이미지의 가장자리 (3,6)
dspyz

나는 그것을 알아 냈습니다. 내 업데이트 된 답변을보십시오 : cstheory.stackexchange.com/a/20778/13643
dspyz

@dspyz 나는 추론이 틀리지 않은 경우, 건축 위의 토너먼트가 실제로 그 함의 속성을 가지고 있는지 여부를 확인하기 때문에 가장자리 목록보다 구조가 더 명확하다고 생각했습니다. edge (3,6)에 대한 실수를 지적 해 주셔서 감사합니다! 또한 해당 가제트에 대해 8 개의 TFAS를 얻었습니다.
G. Bach

죄송 해요. 그래프를 잘못 구성했습니다. 나는 그것을 고쳤으며 clingo는 이제 TFAS를보고하지 않습니다.
dspyz

1

TFAS없이 그래프를보고하지 않는 짧은 clingo 프로그램을 실행했지만 버그가있었습니다. 나는 그것을 고쳤고 이제는 TFAS가없는 그래프가 n = 8 이하인지 확인합니다. n = 9 인 경우 다음을 찾습니다.

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

다음은 (고정) 인코딩입니다.

% 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.asp(clingo 4.2.1 사용)으로 실행하십시오.

(n = 7은 정확히 7 개의 꼭짓점의 그래프를 나타냅니다)

7 개의 꼭짓점에 TFAS가없는 그래프가있는 경우에만 만족스러운 결과를 반환해야합니다.


좋아, 나는 @ G.Bach가 어떤 그래프를 설명하고 clingo로 그것을 코딩했는지 알아 냈다. 34-vertex 토너먼트 그래프 G.Bach가 설명하고 있습니다 (접지 그래프 설명도 첨부했습니다).

그런 다음 해당 그래프에서 clingo를 실행했으며 가장자리가 241 인 TFAS를 찾았다 고 주장했습니다. 그러나 그래프 인코딩에서 실수를했습니다. 나는 실수를 고쳤고 clingo는 이제 만족할 수 없다고보고했다 (즉, TFAS가 없다).

그래프에서 TFAS를 찾는 프로그램은 다음과 같습니다.

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

다음은 G.Bach의 그래프를 생성하기위한 (업데이트 된) 프로그램입니다. 그래프가 올바른 토너먼트 그래프인지 확인하기 위해 끝에 표시기를 추가했습니다.

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.

TFAS가없는 18 개의 정점에 대한 토너먼트가 있습니다.
G. Bach

예를 들어 주시겠습니까? 표시된 모서리를 가진 파일을 첨부하십시오
dspyz

파일을 어떻게 첨부합니까? 몇 시간이 걸릴 수 있습니다. 토너먼트가 없습니다. 나는 또한 잘못 계산하여 34 개의 정점이 있어야합니다. 토너먼트의 빌딩 블록을 제공하는지 확인하는 것이 더 쉽습니다.
G. Bach

(참조 그 어떤 파일 호스트와 링크에 업로드 meta.stackexchange.com/a/4643/185877을 ), 또는 정기적 구조를 가지고있는 경우, 그냥 (빌딩 블록을 제공) 기술
dspyz

n

0

SWAG 추측 [아무것보다 나은 것이 있습니까?] :

G=(V,E)FEGO(1)

참고 : 슛 다운 카운터 예제를 환영합니다! 지금까지 아무도 주어지지 않은 것 같습니다. 특정 그래프 클래스와 관련된 가장자리 방향의 패턴을 관찰하는 것이 더 좋습니다. 또는 더 많은 동기 부여 또는 기존 문학과의 연계. 증거와 반박 (Lakatos) 의 스타일로 제공됩니다 ... 또한, 아직 그다지 관련이없는 외설적 인 문제로 보이므로 경험적으로 연구하는 것이 좋습니다 ....


1
나는 이것이 개최되는지 여부를 확인하기 위해 프로그램을 실행했으며 전 이적 피드백 아크 세트가없는 토너먼트가 있음을 발견했습니다. 나는 내일 하나를 올릴 것이다, 나는 오늘 그것에 도착하지 않을 것이다.
G. Bach

@vzn 당신은 무작위 토너먼트에 대한 추측을 증명할 수 있습니까?
Igor Shinkar

a-> b, a-> c, b-> c, d-> a, b-> d, c-> d, e-> a, e-> b, c-> e의 5 개의 정점 만있는 반례 , d-> e. 4 개의 정점에 대해, 유도 된 그래프는주기를 포함하므로, 전 이적 DAG는 그래프의 3 개의 정점 중 최대 3 개의 모서리를 포함 할 수 있습니다. 5 가능성이있다 (다른 모든 세 쌍둥이 사이클이다) : abc 방송, EAB, DEA, BCD, 그것은 다른 7 가장자리 사이의주기가 다섯 각각의 경우에 그것을 확인하는 것은 쉽다 CDE
dspyz

1
예, nvr 마음, 그것은 반례가 아닙니다
dspyz

1
@dspyz 저는 최대 8 개의 정점에서 모든 토너먼트에서 무차별 대국 점검을 실시했습니다. 그들 모두는 전 이적 피드백 아크 세트를 가지고 있지만, 그렇지 않은 토너먼트를 만드는 데 사용할 수있는 것이 있습니다.
G. Bach
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.