Set busur umpan balik transitif (TFAS): Lengkap dengan NP?

13

Beberapa waktu yang lalu, saya memposting permintaan referensi untuk masalah grafik di mana kami ingin menemukan 2-partisi tepi di mana kedua set memenuhi properti yang tidak terkait dengan kardinalitas mereka. Saya mencoba membuktikan bahwa masalah berikut ini NP-hard:

Diberikan turnamen , apakah ada busur umpan balik yang menetapkan dalam yang mendefinisikan hubungan transitif?G=(V,E)FEG

Saya memang memiliki konstruksi untuk mencoba pembuktian, tetapi tampaknya itu akan menemui jalan buntu, jadi saya pikir saya mungkin bertanya di sini untuk melihat apakah saya kehilangan sesuatu yang jelas. Agar tidak membatasi kreativitas Anda pada alur pemikiran yang serupa dengan yang saya gunakan, saya tidak akan memposting upaya saya di sini.

Apakah ini masalah NP-hard? Jika demikian, bagaimana cara membuktikannya?

G. Bach
sumber
1
sempurna, terima kasih! (Saya menghapus komentar karena saya menulis G = (E, V) alih-alih standar G = (V, E) :-)
Marzio De Biasi
6
Jika saya mengerti benar, ini setara dengan menanyakan apakah tepi dalam turnamen dapat dipartisi menjadi dua DAG, yang salah satunya ditutup secara transitif.
dspyz
1
komentar ulang dspyz, tidak ada banyak masalah pada DAG yang dapat dipelajari karena kompleksitasnya. bahkan tidak ada banyak teorema sama sekali tentang DAG yang akan muncul. pohon sedikit lebih mudah diakses. masalah Anda (sementara tampaknya menarik seperti tercermin dalam suara) tampaknya mencampur banyak elemen yang tidak biasa bersama-sama & tidak masuk ke dalam kategori tertentu.
vzn
5
@IgorShinkar, busur dari setiap digraf dapat dipartisi secara sepele menjadi dua DAGs: memesan simpul secara sewenang-wenang; satu DAG adalah tepi ke depan, DAG lainnya adalah tepi ke belakang.
Sasho Nikolov
1
@SashoNikolov tentu saja!
Igor Shinkar

Jawaban:

4

Untuk menambahkan sedikit konteks, berikut adalah konstruksi untuk grafik yang tidak memiliki set arc umpan balik transitif. Untuk konstruksi ini, saya akan menggunakan grafik gadget berikut:

grafik gadget yang digunakan untuk memaksakan implikasi

Turnamen ini memiliki properti berikut (yang saya periksa menggunakan program, saya tidak membuktikannya secara resmi):

  • jika (2,7) tidak ada dalam TFAS yang diberikan, maka (1,3) adalah
  • jika (5,1) dalam TFAS yang diberikan, maka demikian juga (3,6)
  • jika (7,3) dalam TFAS yang diberikan, maka (5,1) tidak

atau sedikit menyalahgunakan notasi logika predikat:

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

Anda akan melihat bahwa untuk setiap implikasi, kedua sisi saling berpasangan, sehingga konstruksi berikut berfungsi:

konstruksi untuk grafik yang tidak memiliki TFAS

SEBUAH

G. Bach
sumber
Maaf, saya tidak mengikuti. Apakah ada alasan Anda tidak bisa begitu saja memposting daftar tepi sehingga saya dapat menjalankannya melalui pemecah ASP dan mencoba memverifikasinya? Menurut clingo, grafik gadget Anda memiliki 8 TFAS berbeda. Inilah yang terkecil: 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
Saya baru saja memperhatikan Anda menyebutkan tepi (6,3) dalam grafik gadget, tetapi gambar yang Anda berikan memiliki tepi (3,6)
dspyz
Saya menemukan jawabannya, lihat jawaban saya yang diperbarui: cstheory.stackexchange.com/a/20778/13643
dspyz
@ dspyz Saya pikir konstruksinya lebih jelas daripada hanya daftar tepi, karena jika alasan saya tidak salah, semua yang diperlukan untuk memverifikasi adalah apakah turnamen di atas konstruksi benar-benar memiliki properti implikasi tersebut. Terima kasih telah menunjukkan kesalahan tentang edge (3,6)! Saya juga mendapat 8 TFAS untuk gadget itu, yang Anda cantumkan salah satunya.
G. Bach
Maafkan saya. Saya membuat grafik yang salah. Saya memperbaikinya dan clingo sekarang melaporkan tidak ada TFAS.
dspyz
1

Saya menjalankan program clingo pendek yang melaporkan tidak ada grafik tanpa TFAS, tetapi ada bug. Saya memperbaikinya dan sekarang memverifikasi tidak ada grafik tanpa TFAS untuk n = 8 atau kurang. Untuk n = 9, ia menemukan yang ini:

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

Inilah pengkodean (diperbaiki)

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

Jalankan dengan clingo -c n=7 tfas.asp(Menggunakan clingo 4.2.1)

(n = 7 menunjukkan grafik tepat 7 simpul)

Ini harus mengembalikan memuaskan jika dan hanya jika ada grafik tanpa TFAS pada 7 simpul.


Oke, saya sudah tahu grafik apa yang dijelaskan oleh @Bach, dan buat kode itu di clingo (lihat deskripsi clingo di bawah. Itu dimulai dengan deskripsi grafik gadget dan dilanjutkan dengan menggambarkan cara menggabungkan salinannya bersama-sama untuk mendapatkan yang lengkap. Grafik 34-vertex turnamen G.Bach menjelaskan. Saya sudah melampirkan deskripsi grafik juga).

Saya kemudian melanjutkan untuk menjalankan clingo pada grafik itu dan mengklaim telah menemukan TFAS dengan 241 tepi. Tapi saya membuat kesalahan dalam pengkodean grafik. Saya memperbaiki kesalahan dan kloning sekarang melaporkan tidak memuaskan (yaitu tidak ada TFAS).

Inilah program untuk menemukan TFAS pada grafik

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

Inilah program (yang diperbarui) untuk membuat grafik G.Bach. Saya menambahkan indikator di akhir untuk memeriksa bahwa grafik tersebut adalah grafik turnamen yang tersusun dengan baik:

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
sumber
Saya yakin ada turnamen pada 18 simpul yang tidak memiliki TFAS.
G. Bach
Bisakah Anda memberikannya sebagai contoh? Cukup lampirkan file dengan tepian yang terdaftar
dspyz
Bagaimana cara saya melampirkan file? Mungkin butuh beberapa jam, saya tidak punya turnamen untuk diserahkan sekarang. Saya juga salah hitung, seharusnya ada 34 simpul. Mungkin lebih mudah untuk memverifikasi jika saya memberikan blok bangunan turnamen.
G. Bach
Unggah ke host file apa saja dan tautkan ke sana (lihat meta.stackexchange.com/a/4643/185877 ), atau jika memiliki struktur reguler, cukup jelaskan (berikan blok
penyusun
n
0

Dugaan SWAG [sesuatu yang lebih baik daripada tidak sama sekali?]:

G=(V,E)FEGHAI(1)

Catatan: countdowncontoh shootdown diterima! sepertinya tidak ada yang diberikan sejauh ini. bahkan yang lebih baik adalah beberapa pengamatan pola orientasi tepi yang terkait dengan kelas grafik tertentu. atau lebih banyak motivasi atau mengikatnya ke dalam beberapa literatur yang ada. ditawarkan dalam gaya Bukti dan sanggahan (Lakatos) ... juga, karena tampaknya masalah yang tidak biasa yang belum [banyak berhubungan], menyarankan untuk mempelajarinya secara empiris ....

vzn
sumber
1
Saya memang menjalankan program untuk memeriksa apakah ini berlaku dan menemukan bahwa ada turnamen yang tidak memiliki set busur umpan balik transitif. Saya akan memposting satu besok, saya tidak akan sampai hari ini.
G. Bach
@vzn dapatkah Anda membuktikan dugaan untuk turnamen acak?
Igor Shinkar
Contoh tandingan dengan hanya 5 simpul: a-> b, a-> c, b-> c, d-> a, b-> d, c-> d, e-> a, e-> b, c-> e , d-> e. Untuk setiap empat simpul, grafik yang diinduksi mengandung siklus, sehingga DAG transitif dapat berisi paling banyak 3 tepi di antara 3 simpul grafik. Hanya ada 5 kemungkinan (semua kembar tiga lainnya adalah siklus): abc, eab, dea, bcd, cde Sangat mudah untuk memeriksa bahwa dalam masing-masing dari lima kasus ada siklus di antara 7 tepi lainnya
dspyz
1
Ya, tidak keberatan, ini bukan contoh tandingan
dspyz
1
@ dspyz Saya menjalankan pemeriksaan brute force pada semua turnamen hingga 8 simpul. Semuanya memiliki set busur umpan balik transitif, tetapi ada beberapa yang dapat Anda gunakan untuk membuat turnamen yang tidak.
G. Bach