ชุดคำติชม Transitive (TFAS): NP-complete


13

บางครั้งที่ผ่านมาฉันโพสต์คำขออ้างอิงสำหรับปัญหากราฟที่เราต้องการค้นหาพาร์ติชันของขอบที่ทั้งสองชุดตอบสนองคุณสมบัติที่ไม่เกี่ยวข้องกับ cardinality ของพวกเขา ฉันพยายามพิสูจน์ว่าปัญหาต่อไปนี้คือ NP-hard:

ได้รับทัวร์นาเมนต์ , มีชุดคำติชมส่วนโค้งF EในGที่กำหนดความสัมพันธ์สกรรมกริยาหรือไม่?G=(V,E)FEG

ฉันมีสิ่งก่อสร้างสำหรับการพยายามพิสูจน์ แต่ดูเหมือนว่ามันกำลังจะถึงจุดจบดังนั้นฉันคิดว่าฉันอาจขอให้ที่นี่เพื่อดูว่าฉันขาดอะไรบางอย่างที่ชัดเจน เพื่อไม่จำกัดความคิดสร้างสรรค์ของคุณไปยังแนวความคิดที่คล้ายกับสิ่งที่ฉันใช้ฉันจะไม่โพสต์ความพยายามของฉันที่นี่

ปัญหานี้เกิดจากปัญหา NP-hard หรือไม่ ถ้าเป็นเช่นนั้นจะพิสูจน์ได้อย่างไร?


1
สมบูรณ์แบบขอบคุณ! (ฉันลบความคิดเห็นเพราะฉันเขียน G = (E, V) แทนมาตรฐาน G = (V, E) :-)
Marzio De Biasi

6
หากฉันเข้าใจอย่างถูกต้องสิ่งนี้จะเทียบเท่ากับการถามว่าขอบในทัวร์นาเมนต์สามารถแบ่งออกเป็นสอง DAG ได้หรือไม่ซึ่งหนึ่งในนั้นถูกปิดการส่งผ่าน
dspyz

1
ความเห็นของ dspyz มีไม่มากที่ปัญหาเกี่ยวกับ DAG ที่สามารถศึกษาได้เนื่องจากความซับซ้อนของพวกเขา มี arent แม้กระทั่งว่ามีหลายทฤษฎีที่เกี่ยวกับ DAG มันจะดูเหมือน ต้นไม้สามารถเข้าถึงได้มากขึ้น ปัญหาของคุณ (ในขณะที่น่าสนใจสะท้อนให้เห็นในการลงคะแนน) ดูเหมือนว่าจะผสมผสานองค์ประกอบที่ผิดปกติจำนวนมากเข้าด้วยกันและไม่เหมาะกับหมวดหมู่ใด ๆ
vzn

5
@IgorShinkar ส่วนโค้งของกราฟิคใด ๆ สามารถแบ่งออกเป็นสองส่วนเล็กน้อยได้: สั่งจุดยอดโดยพลการ; หนึ่ง DAG คือขอบไปข้างหน้า DAG อื่นคือขอบด้านหลัง
Sasho Nikolov

1
@SashoNikolov แน่นอน!
Igor Shinkar

คำตอบ:


4

หากต้องการเพิ่มบริบทเล็ก ๆ น้อย ๆ นี่คือโครงสร้างของกราฟที่ไม่ได้มีชุดส่วนโค้งความคิดเห็นย้อนกลับ สำหรับการก่อสร้างนี้ฉันจะใช้กราฟแกดเจ็ตต่อไปนี้:

กราฟเครื่องมือที่ใช้บังคับความหมาย

ทัวร์นาเมนต์นี้มีคุณสมบัติดังต่อไปนี้ (ซึ่งฉันตรวจสอบโดยใช้โปรแกรมฉันไม่ได้พิสูจน์อย่างเป็นทางการ):

  • ถ้า (2,7) ไม่ได้อยู่ใน TFAS ที่กำหนดดังนั้น (1,3) คือ
  • ถ้า (5,1) อยู่ใน TFAS ที่กำหนดดังนั้นจะเป็น (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

ฉันเพิ่งสังเกตเห็นว่าคุณพูดถึงขอบ (6,3) ในกราฟแกดเจ็ต แต่ภาพที่คุณระบุมีขอบ (3,6)
dspyz

ฉันคิดออกดูคำตอบที่อัปเดตของฉัน: cstheory.stackexchange.com/a/20778/13643
dspyz

@ dspyz ฉันคิดว่าการก่อสร้างนั้นชัดเจนกว่าเพียงแค่รายการของขอบเพราะถ้าเหตุผลของฉันไม่ผิดทุกสิ่งที่จะต้องตรวจสอบคือการแข่งขันที่เหนือการก่อสร้างนั้นมีความหมายจริงหรือไม่ ขอบคุณที่ชี้ความผิดพลาดเกี่ยวกับ edge (3,6)! ฉันยังได้รับ 8 TFAS สำหรับแกดเจ็ตนั้นอีกรายการหนึ่งที่คุณระบุว่าเป็นหนึ่งในนั้น
G. Bach

ฉันขอโทษ. ฉันสร้างกราฟผิด ฉันแก้ไขแล้วและตอนนี้ clingo รายงานว่าไม่มี TFAS
dspyz

1

ฉันรันโปรแกรม clingo สั้น ๆ ซึ่งรายงานว่าไม่มีกราฟหากไม่มี TFAS แต่มีข้อผิดพลาด ฉันแก้ไขมันและตอนนี้มันตรวจสอบว่าไม่มีกราฟหากไม่มี 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 จุด)

มันควรจะกลับมาที่น่าพอใจถ้าหากมีกราฟที่ไม่มี TFAS ใน 7 จุดยอด


ตกลงฉันคิดว่ากราฟ @ G.Bach อธิบายอะไรและเขียนมันเป็น clingo (ดูคำอธิบาย clingo ด้านล่างมันเริ่มต้นด้วยคำอธิบายกราฟกราฟของแกดเจ็ตและวิธีอธิบายวิธีเข้าร่วมสำเนาทั้งหมดเข้าด้วยกัน กราฟการแข่งขัน 34 จุดสุดยอด G.Bach กำลังอธิบายอยู่ฉันได้แนบคำอธิบายกราฟที่มีการต่อสายแล้วเช่นกัน)

จากนั้นฉันก็ดำเนินการเรียกใช้ clingo บนกราฟนั้นและมันอ้างว่าพบ TFAS ที่มีขอบ 241 แต่ฉันทำผิดพลาดในการเข้ารหัสกราฟ ฉันแก้ไขข้อผิดพลาดและ 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.

ฉันคิดว่ามีทัวร์นาเมนต์ใน 18 จุดยอดที่ไม่มี TFAS
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

ตัวอย่างที่มีจุดยอดเพียง 5: a-> b, a-> c, b-> c, d-> a, b-> d, c-> d, e-> a, e-> b, c-> e , d-> e. สำหรับจุดยอดสี่จุดใด ๆ กราฟที่เหนี่ยวนำจะมีวัฏจักรดังนั้น DAG สกรรมกริยาสามารถบรรจุได้สูงสุด 3 ขอบท่ามกลาง 3 จุดยอดของกราฟ มีความเป็นไปได้เพียง 5 อย่างเท่านั้น (ทริปเปิลอื่น ๆ ทั้งหมดเป็นวัฏจักร): abc, eab, dea, bcd, cde มันง่ายที่จะตรวจสอบว่าในแต่ละห้ากรณีมีวัฏจักรอยู่ระหว่าง 7 ขอบอื่น ๆ
dspyz

1
ใช่ใจ NVR ก็ไม่ counterexample
dspyz

1
@ dspyz ฉันวิ่งตรวจสอบกำลังดุเดือดในทุกทัวร์นาเมนต์ในจุดสูงสุด 8 จุด ทุกคนมีชุดคำติชมสกรรมกริยา แต่มีบางอย่างที่คุณสามารถใช้เพื่อสร้างการแข่งขันที่ไม่ได้
G. Bach
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.