传递反馈弧集(TFAS):NP是否完整?


13

前段时间,我发布了一个关于图问题的参考请求,我们想要找到边的2分区,其中两个集合都实现了与基数无关的属性。我试图证明以下问题是NP难题:

给定一个比赛,有一个反馈弧集在限定传递关系?˚F È ģG=(V,E)FEG

我确实有一个尝试进行证明的构造,但是看来这将陷入死胡同,所以我想我可能想在这里问一下我是否缺少明显的东西。为了不将您的创造力限制在与我所使用的相似的思维方式上,我不会在这里发表尝试。

这个问题对NP很难吗?如果是这样,如何证明呢?


1
很好,谢谢!(我删除了评论,因为我写了G =(E,V)而不是标准的G =(V,E):-)
Marzio De Biasi 2014年

6
如果我理解正确的话,这等同于询问是否可以将锦标赛的边缘划分为两个DAG,其中一个DAG是可传递地封闭。
dspyz 2014年

1
关于dspyz的评论,由于DAG的复杂性,因此没有太多可以研究的问题。在DAG上甚至根本没有很多定理。树木更容易接近。您的问题(虽然很明显很有趣,如投票所反映的那样)似乎将很多不同寻常的元素混在一起,并且不适合任何特定类别。
vzn 2014年

5
@IgorShinkar任何有向图的弧都可以平分为两个DAG:任意排序顶点;一个DAG是前边缘,另一个DAG是后边缘。
Sasho Nikolov 2014年

1
@SashoNikolov当然!
Igor Shinkar 2014年

Answers:


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 2014年

我刚刚注意到您在小工具图中提到了边缘(6,3),但是您提供的图像具有边缘(3,6)
dspyz 2014年

我知道了,请参阅更新后的答案:cstheory.stackexchange.com/a/20778/13643
dspyz 2014年

@dspyz我认为结构比边缘列表更清晰,因为如果我的推理没有错,则需要验证的只是结构之上的锦标赛是否实际上具有那些暗示属性。感谢您指出关于边(3,6)的错误!我还为该小工具获得了8 TFAS,您列出的是其中之一。
G. Bach

对不起。我将图形构造错了。我已修复它,而clingo现在没有报告TFAS。
dspyz 2014年

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个顶点的图)

当且仅当存在在7个顶点上没有TFAS的图时,它才应该返回可满足的值。


好的,我弄清楚了@ G.Bach正在描述什么图形并在clingo中对其进行了编码(请参见下面的clingo描述。它从对小工具图的描述开始,然后继续描述如何将其副本连接在一起以获得完整的图G.Bach正在描述34个顶点的比赛图形。我也附上了接地图形说明)。

然后,我继续在该图上运行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 2014年

如何附加文件?可能要花几个小时,我现在没有比赛。我也计算错了,它应该有34个顶点。验证我是否提供比赛的基础可能会更容易。
G. Bach 2014年

上传到任何文件主机并链接到它(请参见meta.stackexchange.com/a/4643/185877),或者如果它具有规则的结构,则只需对其进行描述(提供构件)
dspyz 2014年

n

0

SWAG猜想[有总比没有好?]:

G=(V,E)FEGO(1)

注意:欢迎提供击落反例!到目前为止,似乎都没有给出。更好的观察是与特定图类有关的边缘方向的模式。或更多动机或将其与现有文献联系起来。以证明和反驳(Lakatos)的形式提供...,而且,因为似乎这样的另类问题与[还没有]有很大关系,所以建议凭经验进行研究...。


1
我确实运行了一个程序来检查这种情况是否成立,并且发现有些锦标赛没有设置传递反馈弧。我明天发布一个,今天不讨论。
G. Bach

@vzn可以证明随机锦标赛的猜​​想吗?
Igor Shinkar,2014年

仅具有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很容易检查一下,在这5种情况下,其他7个边均存在一个循环
dspyz,2014年

1
是的,nvr介意,这不是一个反例
dspyz 2014年

1
@dspyz我在多达8个顶点的所有锦标赛上进行了蛮力检查。它们都具有传递反馈弧集,但是您可以使用一些反馈弧集来实现。
G. Bach 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.