推移的フィードバックアークセット(TFAS):NP完全?


13

少し前に、両方のセットがカーディナリティに関係のないプロパティを満たすエッジの2つのパーティションを検索するグラフ問題の参照リクエストを投稿しました。私は次の問題がNP困難であることを証明しようとしていました:

トーナメント所与、フィードバック・アーク・セットが存在するF EにおけるG推移関係を定義しますか?G=VEFEG

私は証明の試みのための構造を持っていますが、それは行き止まりに陥るだろうと思われるので、私はここで私が明白な何かを見逃していないかどうかを尋ねるかもしれないと思った。あなたの創造性を、私が使用したものと同様の思考の線に限定しないために、ここに私の試みを投稿しません。

この問題はNP困難ですか?もしそうなら、それを証明する方法は?


1
完璧、ありがとう!(標準のG =(V、E)ではなくG =(E、V)を書いたため、コメントを削除しました:-)
Marzio De Biasi 14年

6
正しく理解していれば、これはトーナメントのエッジを2つのDAGに分割できるかどうかを尋ねることに相当し、その1つは一時的に閉じられます。
dspyz 14年

1
dspyzのコメントを参照してください。DAGの複雑さのために、調査できるDAGの問題はそれほど多くありません。DAGについては、あれほど多くの定理さえありません。木はもう少しアクセスしやすいです。あなたの問題は(投票に反映されているように見えるが、明らかに興味深い)多くの異常な要素が混ざり合っており、特定のカテゴリに当てはまらないようです。
vzn

5
@IgorShinkar任意の有向グラフのアークを2つのDAGに簡単に分割できます。頂点を任意に順序付けします。1つのDAGは前方エッジ、もう1つのDAGは後方エッジです。
サショニコロフ

1
@SashoNikolovもちろん!
イゴールシンカール14年

回答:


4

少しコンテキストを追加するために、推移的なフィードバックアークセットを持たないグラフの構成を次に示します。この構築には、次のガジェットグラフを使用します。

含意を強制するために使用されるガジェットグラフ

このトーナメントには次のプロパティがあります(プログラムを使用して確認しましたが、正式には証明しませんでした)。

  • (2,7)が特定のTFASにない場合、(1,3)は
  • (5,1)が与えられたTFASにある場合、(3,6)もそうです。
  • (7,3)が特定のTFASにある場合、(5,1)はありません

または、述語論理表記を少し乱用します:

  • ¬2713
  • 5136
  • 73¬51

各含意について、2つのエッジがペアワイズで互いに素であることに気付くでしょう。したがって、次の構成が機能します。

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

私はちょうどあなたがガジェットグラフのエッジ(6,3)を言及気づいていますが、提供された画像は、エッジ(3,6)を持っている
dspyz

私はそれを考え出した、私の更新された答えを参照してください:cstheory.stackexchange.com/a/20778/13643
dspyz

@dspyz構造はエッジのリストよりも明確であると考えました。なぜなら、私の推論が間違っていなければ、構造の上のトーナメントが実際にそれらの含意特性を持っているかどうかを検証するために必要だからです。エッジ(3,6)についての間違いを指摘してくれてありがとう!また、そのガジェット用に8つのTFASを取得しましたが、リストに挙げたものはそのうちの1つです。
G.バッハ

申し訳ありません。グラフを間違って作成しました。私はそれを修正し、clingoはTFASを報告しなくなりました。
dspyz 14

1

TFASなしでグラフを報告しない短いクリンゴプログラムを実行しましたが、バグがありました。これを修正し、n = 8以下のTFASがないグラフがないことを確認しました。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のないグラフが存在する場合にのみ、充足可能を返す必要があります。


OK、@ G.Bachがどのようなグラフを記述しているかを把握し、clingoでコーディングしました(下記のclingoの説明を参照してください。ガジェットグラフの説明から始め、そのコピーを結合して完全な34頂点のトーナメントグラフG.Bachが説明しています。接地グラフの説明も添付しました)。

その後、そのグラフで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.バッハ14年

例として挙げていただけますか?ただ、記載されたエッジを持つファイルを添付
dspyz

ファイルを添付するにはどうすればよいですか?数時間かかるかもしれません、私は今トーナメントを手にすることができません。また、誤って計算され、頂点が34個あるはずです。トーナメントのビルディングブロックを提供するかどうかを確認する方がおそらく簡単です。
G.バッハ14年

任意のファイルホストにアップロードしてリンクします(meta.stackexchange.com/a/4643/185877を参照)。または、通常の構造を持っている場合は、それを記述します(構成要素を示します)
dspyz 14年

n

0

SWAG推測[何もないより良いもの]:

G=VEFEGO1

注:撃down反例は歓迎です!これまでのところ何も与えられていないようです。さらに良いのは、特定のグラフクラスに関連するエッジの向きのパターンを観察することです。または、もう少し動機付けするか、既存の文献に結び付けます。証明と反論(ラカトス)のスタイルで提供されます...また、あまり関連していないような奇妙な問題と思われるため、経験的に研究することをお勧めします。


1
プログラムを実行して、これが成立するかどうかを確認したところ、推移的なフィードバックアークセットを持たないトーナメントがあることがわかりました。明日は1つ投稿しますが、今日はそこに行きません。
G.バッハ

@vznランダムトーナメントの予想を証明できますか?
イゴールシンカール14年

頂点が5つだけの反例:a-> b、a-> c、b-> c、d-> a、b-> d、c-> d、e-> a、e-> b、c-> e 、d-> e。4つの頂点の場合、誘導されたグラフにはサイクルが含まれるため、推移的DAGにはグラフの3つの頂点のうち最大で3つのエッジを含めることができます。ABC、EAB、DEA、BCD、それが5例、それぞれに他の7つのエッジの中のサイクルがあることを確認するのは簡単ですCDE:のみ5の可能性(他のすべてのトリプレットはサイクルです)があります
dspyz

1
うん、NVRの心は、それは反例ではありません
dspyz

1
@dspyz最大8つの頂点のすべてのトーナメントでブルートフォースチェックを実行しました。すべてに推移的なフィードバックアークセットがありますが、そうでないトーナメントを構築するために使用できるものがあります。
G.バッハ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.