Набір дуги перехідного зворотного зв’язку (TFAS): NP-завершено?


13

Деякий час тому я опублікував довідковий запит щодо проблем із графіками, де ми хочемо знайти 2-х розділ ребер, де обидва набори виконують властивість, не пов’язану з їх кардинальністю. Я намагався довести, що наступна проблема є важкою для NP:

Враховуючи турнір , чи існує дуга зворотного зв’язку F E в G, яка визначає перехідне відношення?G=(V,E)FEG

У мене є конструкція для спроби доказування, але здається, що це зіткнеться в глухий кут, тому я подумав, що я можу попросити тут подивитися, чи не пропускаю я щось очевидне. Щоб не обмежувати свою творчість лише думками, подібними до тих, що я використовував, я не буду публікувати свої спроби тут.

Ця проблема NP-важка? Якщо так, то як це довести?


1
ідеально, дякую! (Я видалив коментар, тому що написав G = (E, V) замість стандартного G = (V, E) :-)
Marzio De Biasi

6
Якщо я правильно розумію, це рівнозначно питанню, чи можна розділити краї в турнірі на два DAG, один з яких транзитивно закритий.
dspyz

1
Повторюючи коментар dspyz, існує не так багато проблем із DAG, які можна вивчити через їх складність. Існує навіть не так багато теорем на DAGs, здавалося б. дерева трохи доступніші. Ваша проблема (хоча, мабуть, цікава як відображена в голосах), здається, поєднує багато незвичайних елементів разом і не вписується в якусь конкретну категорію.
vzn

5
@IgorShinkar дуги будь-якого диграфа можна тривіально розділити на два DAG: упорядкувати вершини довільно; один DAG - це передні краї, інший DAG - зворотні краї.
Сашо Ніколов

1
@SashoNikolov звичайно!
Ігор Шинкар

Відповіді:


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 вирішувач і спробувати перевірити його? За даними клінго, у вашому графіку гаджетів є 8 різних TFAS. Ось найменший: tfas (край (5,0)) tfas (край (6,0)) tfas (край (7,0)) tfas (край (6,2)) tfas (край (7,3)) tfas (край (1,2)) tfas (край (1,3)) tfas (край (7,5))
dspyz

Я щойно помітив, що ви згадали про грань (6,3) у графіці гаджета, але зображення, яке ви надали, має край (3,6)
dspyz

Я зрозумів це, дивіться мою оновлену відповідь: cstheory.stackexchange.com/a/20778/13643
dspyz

@dspyz Я думав, що конструкція була чіткішою, ніж просто перелік ребер, оскільки якщо мої міркування не помиляються, все, що потрібно було б перевірити, - чи турнір над конструкцією насправді має ці властивості. Дякуємо, що вказали на помилку щодо краю (3,6)! Я також отримав 8 TFAS для цього гаджета, один із яких ви перерахували, один із них.
Г. Бах

Мені шкода. Я неправильно побудував графік. Я виправив це, і чілінго тепер не повідомляє про TFAS.
dspyz

1

Я запустив коротку програму клінго, яка не повідомила жодного графіка без TFAS, але помилка. Я виправив це, і тепер він перевіряє, що немає n графіку без 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(використовуючи кланго 4.2.1)

(n = 7 вказує графіки рівно 7 вершин)

Він повинен повернутися задовольняючим, якщо і лише тоді, коли існує графік без TFAS на 7 вершин.


Гаразд, я зрозумів, що описує граф @ G.Bach і зашифрував його в клінго (див. Опис клінго нижче. Він починається з опису графіка гаджетів і переходить до опису, як з'єднати його копії разом, щоб отримати повну 34-вершинний графік турніру G.Bach описує. Я також додав обґрунтований опис графа).

Потім я продовжив запускати чілінго на цьому графіку, і він стверджував, що знайшов TFAS з 241 ребрами. Але я помилився в кодуванні графіка. Я виправив помилку, і тепер чілінго звітує незадовільно (тобто 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.
Г. Бах

Чи можете ви надати це як приклад? Просто додайте файл із переліченими краями
dspyz

Як додати файл? Це може зайняти кілька годин, я зараз не маю турніру. Я також неправильно підрахував, він повинен мати 34 вершини. Це, мабуть, простіше перевірити, якщо я даю складові турніру.
Г. Бах

Завантажте будь-який хост файлу та посилання на нього (див. Meta.stackexchange.com/a/4643/185877 ), або якщо він має регулярну структуру, просто опишіть його (надайте будівельні блоки)
dspyz

n

0

Здогад SWAG [щось краще, ніж нічого?]:

G=(V,E)FEGO(1)

Примітки: зустрічні зразки пристрелення вітаються! жоден, здається, не дається поки що. ще кращими будуть спостереження за зразками орієнтацій ребер, що стосуються конкретних класів графіків. або якась ще мотивація чи прив'язка її до якоїсь існуючої літератури. пропонований у стилі доказів та спростувань (Лакатос) ... також, оскільки, здається, така неперевершена проблема, яка ще [поки що] не стосується багатьох, пропонуємо вивчити її емпіричним шляхом ....


1
Я запустив програму, щоб перевірити, чи відповідає це, і виявив, що існують турніри, на яких не встановлено перехідну дугу зворотного зв'язку. Я відправлю його завтра, я не обійдусь сьогодні.
Г. Бах

@vzn Ви можете довести догадку для випадкового турніру?
Ігор Шинкар

Контрприклад лише з 5 вершинами: a-> b, a-> c, b-> c, d-> a, b-> d, c-> d, e-> a, e-> b, c-> e , d-> е. Для будь-яких чотирьох вершин індукований графік містить цикл, тому перехідний DAG може містити щонайбільше 3 ребра серед 3 вершин графа. Існує лише 5 можливостей (усі інші триплети - це цикли): abc, eab, dea, bcd, cde Легко перевірити, що в кожному з п’яти випадків є цикл серед інших 7 ребер
dspyz

1
Так, nvr розум, це не контрприклад
dspyz

1
@dspyz Я провів грубу перевірку на всіх турнірах до 8 вершин. Усі вони мають перехідні дуги наборів зворотного зв'язку, але є деякі, які ви можете використовувати для створення турніру, який цього не робить.
Г. Бах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.