Bộ hồ quang phản hồi bắc cầu (TFAS): NP-đầy đủ?


13

Cách đây một thời gian, tôi đã đăng một yêu cầu tham chiếu cho các vấn đề về đồ thị trong đó chúng tôi muốn tìm một phân vùng 2 cạnh trong đó cả hai bộ đều thực hiện một thuộc tính không liên quan đến tính chính xác của chúng. Tôi đã cố gắng chứng minh rằng vấn đề sau đây là NP-hard:

Cho một giải đấu , có một vòng cung phản hồi nào được đặt trong xác định mối quan hệ không?F E GG= =(V,E)FEG

Tôi có một bản dựng để thử một bằng chứng, nhưng có vẻ như điều đó sẽ đi vào ngõ cụt, vì vậy tôi nghĩ tôi có thể hỏi ở đây để xem liệu tôi có thiếu điều gì rõ ràng không. Để không giới hạn sự sáng tạo của bạn với những dòng suy nghĩ tương tự như những gì tôi đã sử dụng, tôi sẽ không đăng nỗ lực của mình ở đây.

Vấn đề này có khó NP không? Nếu vậy, làm thế nào để chứng minh điều đó?


1
hoàn hảo, cảm ơn (Tôi đã xóa nhận xét vì tôi đã viết G = (E, V) thay vì tiêu chuẩn G = (V, E) :-)
Marzio De Biasi

6
Nếu tôi hiểu chính xác, điều này tương đương với việc hỏi liệu các cạnh trong một giải đấu có thể được phân chia thành hai DAG hay không, một trong số đó được đóng liên tục.
dspyz

1
Nhận xét của dspyz, không có nhiều vấn đề về DAG có thể được nghiên cứu do sự phức tạp của chúng. thậm chí không có nhiều định lý về DAG dường như. cây dễ tiếp cận hơn một chút. vấn đề của bạn (mặc dù có vẻ thú vị như được phản ánh trong phiếu bầu) dường như trộn lẫn rất nhiều yếu tố bất thường với nhau & không phù hợp với bất kỳ danh mục cụ thể nào.
vzn

5
@IgorShinkar các cung của bất kỳ máy đào nào có thể được phân chia tầm thường thành hai DAG: sắp xếp các đỉnh tùy ý; một DAG là các cạnh phía trước, DAG khác là các cạnh lùi.
Sasho Nikolov

1
@SashoNikolov tất nhiên!
Igor Shinkar

Câu trả lời:


4

Để thêm một bối cảnh nhỏ, đây là một bản dựng cho một biểu đồ không có bộ cung phản hồi bắc cầu. Đối với việc xây dựng này, tôi sẽ sử dụng biểu đồ tiện ích sau:

đồ thị tiện ích được sử dụng để buộc ngụ ý

Giải đấu này có các thuộc tính sau (mà tôi đã kiểm tra bằng chương trình, tôi không chứng minh được chính thức):

  • nếu (2,7) không nằm trong một TFAS nhất định, thì (1,3) là
  • nếu (5,1) trong một TFAS nhất định, thì (3,6) cũng vậy
  • nếu (7,3) nằm trong một TFAS nhất định, thì (5,1) không

hoặc hơi lạm dụng ký hiệu logic vị ngữ:

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

Bạn sẽ nhận thấy rằng với mỗi hàm ý, hai cạnh được tách rời nhau, do đó, các công trình xây dựng sau:

xây dựng cho đồ thị không có TFAS

Một


Tôi xin lỗi, tôi không làm theo. Có bất kỳ lý do nào bạn không thể chỉ đăng một danh sách các cạnh để tôi có thể chạy nó thông qua một bộ giải ASP và cố gắng xác minh nó không? Theo clingo, biểu đồ tiện ích của bạn có 8 TFAS khác nhau. Đây là cái nhỏ nhất: tfas (cạnh (5,0)) tfas (cạnh (6,0)) tfas (cạnh (7,0)) tfas (cạnh (6,2)) tfas (cạnh (7,3)) tfas (cạnh (1,2)) tfas (cạnh (1,3)) tfas (cạnh (7,5))
dspyz

Tôi chỉ nhận thấy bạn đã đề cập đến cạnh (6,3) trong biểu đồ tiện ích, nhưng hình ảnh bạn cung cấp có cạnh (3,6)
dspyz

Tôi đã tìm ra nó, xem câu trả lời cập nhật của tôi: cstheory.stackexchange.com/a/20778/13643
dspyz

@dspyz Tôi nghĩ rằng việc xây dựng rõ ràng hơn chỉ là một danh sách các cạnh, vì nếu lý luận của tôi không sai, tất cả những gì sẽ được yêu cầu để xác minh là liệu giải đấu trên công trình có thực sự có các thuộc tính ngụ ý đó không. Cảm ơn đã chỉ ra sai lầm về cạnh (3,6)! Tôi cũng có 8 TFAS cho tiện ích đó, cái mà bạn liệt kê là một trong số chúng.
G. Bạch

Tôi xin lỗi. Tôi xây dựng đồ thị sai. Tôi đã sửa nó và clingo bây giờ báo cáo không có TFAS.
dspyz

1

Tôi đã chạy một chương trình clingo ngắn báo cáo không có đồ thị mà không có TFAS, nhưng có một lỗi. Tôi đã sửa nó và bây giờ nó xác minh không có đồ thị nào mà không có TFAS cho n = 8 hoặc ít hơn. Với n = 9, nó tìm thấy cái này:

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

Đây là mã hóa (cố định)

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

Chạy nó với clingo -c n=7 tfas.asp(Sử dụng clingo 4.2.1)

(n = 7 chỉ ra đồ thị của chính xác 7 đỉnh)

Nó sẽ trả về thỏa đáng khi và chỉ khi tồn tại một đồ thị không có TFAS trên 7 đỉnh.


Ok, tôi đã tìm ra biểu đồ nào @ G.Bach đã mô tả và mã hóa nó trong clingo (xem mô tả clingo bên dưới. Nó bắt đầu với một mô tả về biểu đồ tiện ích và tiến hành mô tả cách nối các bản sao của nó với nhau để có được đầy đủ Biểu đồ giải đấu 34 đỉnh G.Bach đang mô tả. Tôi cũng đã đính kèm mô tả biểu đồ căn cứ).

Sau đó tôi đã tiến hành chạy clingo trên biểu đồ đó và nó tuyên bố đã tìm thấy một TFAS với 241 cạnh. Nhưng tôi đã mắc một lỗi trong mã hóa đồ thị. Tôi đã sửa lỗi và clingo hiện báo cáo không thỏa đáng (nghĩa là không có TFAS).

Đây là chương trình tìm TFAS trên biểu đồ

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

Đây là chương trình (đã cập nhật) để tạo biểu đồ của G.Bach. Tôi đã thêm các chỉ số ở cuối để kiểm tra xem biểu đồ có phải là biểu đồ giải đấu được hình thành tốt không:

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.

Tôi khẳng định có một giải đấu trên 18 đỉnh không có TFAS.
G. Bạch

Bạn có thể vui lòng cho nó làm ví dụ? Chỉ cần đính kèm một tệp với các cạnh được liệt kê
dspyz

Làm cách nào để đính kèm một tập tin? Có thể mất vài giờ, tôi không có giải đấu để trao tay ngay bây giờ. Tôi cũng tính toán sai, nó nên có 34 đỉnh. Có lẽ dễ xác minh hơn nếu tôi đưa ra các khối xây dựng của giải đấu.
G. Bạch

Tải lên bất kỳ máy chủ lưu trữ tệp nào và liên kết với nó (xem meta.stackexchange.com/a/4643/185877 ) hoặc nếu nó có cấu trúc thông thường, chỉ cần mô tả nó (đưa ra các khối xây dựng)
dspyz

n

0

Phỏng đoán SWAG [một cái gì đó tốt hơn không có gì?]:

G= =(V,E)FEGÔi(1)

ghi chú: phản ứng bắn súng chào mừng! dường như không được đưa ra cho đến nay. thậm chí tốt hơn sẽ là một số quan sát về các mẫu của các hướng cạnh liên quan đến các lớp biểu đồ cụ thể. hoặc một số động lực hơn hoặc gắn nó vào một số tài liệu hiện có. được cung cấp theo kiểu Chứng minh và bác bỏ (Lakatos) ... cũng vậy, vì có vẻ như đó là một vấn đề khác thường không [chưa?] liên quan đến nhiều, đề nghị nghiên cứu nó theo kinh nghiệm ....


1
Tôi đã chạy một chương trình để kiểm tra xem liệu điều này có được tổ chức hay không và thấy rằng có những giải đấu không có vòng cung phản hồi bắc cầu. Tôi sẽ đăng một cái vào ngày mai, tôi sẽ không nhận được nó ngày hôm nay.
G. Bạch

@vzn bạn có thể chứng minh phỏng đoán cho một giải đấu ngẫu nhiên không?
Igor Shinkar

Ví dụ chỉ có 5 đỉnh: a-> b, a-> c, b-> c, d-> a, b-> d, c-> d, e-> a, e-> b, c-> e , d-> e. Đối với bốn đỉnh bất kỳ, đồ thị cảm ứng chứa một chu kỳ, do đó, một DAG bắc cầu có thể chứa tối đa 3 cạnh trong số 3 đỉnh của đồ thị. Chỉ có 5 khả năng (tất cả các bộ ba khác là chu kỳ): abc, eab, dea, bcd, cde Thật dễ dàng để kiểm tra xem trong mỗi năm trường hợp có một chu kỳ giữa 7 cạnh còn lại
dspyz

1
Vâng, nv tâm trí, nó không phải là một ví dụ
dspyz

1
@dspyz Tôi đã chạy một cuộc kiểm tra vũ phu trên tất cả các giải đấu trên 8 đỉnh. Tất cả chúng đều có bộ vòng cung phản hồi bắc cầu, nhưng có một số bạn có thể sử dụng để xây dựng một giải đấu không.
G. Bạch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.