Geçişli geri besleme yay seti (TFAS): NP-tam mı?


13

Bir süre önce, her iki setin de kardinalliği ile ilgili olmayan bir özelliği yerine getirdiği kenarların 2 bölümünü bulmak istediğimiz grafik sorunları için bir referans isteği gönderdim . Aşağıdaki sorunun NP zor olduğunu kanıtlamaya çalışıyordum:

Bir turnuvası verildiğinde , geçişli bir ilişki tanımlayan set edilmiş bir geri besleme yayı var mı?G=(V,E)GFEG

Bir ispat girişiminde bulunmak için bir inşaatım var, ancak bunun çıkmaz bir yere gireceği anlaşılıyor, bu yüzden burada bariz bir şeyi kaçırıp kaçırmadığımı görmek isteyebileceğimi düşündüm. Yaratıcılığınızı kullandıklarımıza benzer düşünce çizgileriyle sınırlamak için, denememi burada yayınlamayacağım.

Bu problem NP zor mu? Eğer öyleyse, nasıl kanıtlanır?


1
mükemmel teşekkürler! (Yorumu sildim çünkü standart G = (V, E) yerine G = (E, V) yazdım :-)
Marzio De Biasi

6
Doğru anlarsam, bir turnuvadaki kenarların biri DAG'lara bölünüp bölünemeyeceğini sormakla eşdeğerdir, bunlardan biri geçişli olarak kapatılır.
dspyz

1
re dspyz'nin yorumu, DAG'ların karmaşıklığı nedeniyle incelenebilecek çok fazla sorun yok. DAG'larda bu kadar çok teorem bile var gibi görünüyor. ağaçlar biraz daha erişilebilir. probleminiz (oylarda yansıtıldığı gibi ilginç olsa da), alışılmadık unsurları bir araya getirip belirli bir kategoriye uymuyor gibi görünüyor.
vzn

5
@IgorShinkar herhangi bir digrafın yayları önemsiz bir şekilde iki DAG'a bölünebilir: köşeleri keyfi olarak sipariş edin; bir DAG ileri kenarlar, diğer DAG arka kenarlar.
Sasho Nikolov

1
Tabii ki @SashoNikolov!
Igor Shinkar

Yanıtlar:


4

Küçük bir bağlam eklemek için, geçişli geri besleme yayı ayarlanmamış bir grafik için bir yapı. Bu yapım için aşağıdaki gadget grafiğini kullanacağım:

Çıkarımları zorlamak için kullanılan gadget grafiği

Bu turnuva aşağıdaki özelliklere sahiptir (bir program kullanarak kontrol ettim, resmi olarak kanıtlamadım):

  • (2,7) belirli bir TFAS'ta değilse, (1,3)
  • (5,1) belirli bir TFAS içindeyse, (3,6)
  • (7,3) belirli bir TFAS'ta ise (5,1)

veya yüklem mantığı gösterimini biraz kötüye kullanma:

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

Her çıkarım için, iki kenarın çift olarak ayrık olduğunu fark edeceksiniz, bu nedenle aşağıdaki inşaat çalışır:

TFAS içermeyen grafik için yapı

Umarım grafik fikrini ortaya koyabilirsiniz: yukarıdaki turnuvanın ima özelliklerini kullanarak, her geçişli geribildirim yayının hem kenarını hem de kenarını , yani bir çelişkiyi içerdiği ve içermediği bir grafik oluşturabiliriz. grafikte geçişli bir geri besleme yayı seti yoktur. Aynı çelişki herhangi bir tamamlamada kalacağından, bu grafiğin tamamlanması da bir tane olamaz. Hepsi çıkarımlar için yukarıdaki turnuvanın yerini alarak türetilebilecek çok sayıda köşe noktası bıraktım.A


Üzgünüm, takip etmiyorum. Bir ASP çözücü ile çalıştırabilir ve doğrulamaya çalışabilir böylece sadece kenarların bir listesini gönderemezsiniz herhangi bir nedeni var mı? Clingo'ya göre, gadget grafiğinizde 8 farklı TFAS var. En küçüğü: tfas (kenar (5,0)) tfas (kenar (6,0)) tfas (kenar (7,0)) tfas (kenar (6,2)) tfas (kenar (7,3)) tfas (kenar (1,2)) tfas (kenar (1,3)) tfas (kenar (7,5))
dspyz

Gadget grafiğinde kenardan (6,3) bahsettiğinizi fark ettim, ancak sağladığınız görüntünün kenarı (3,6) var
dspyz

Anladım, güncellenmiş cevabımı görün: cstheory.stackexchange.com/a/20778/13643
dspyz

@ dspyz Yapının sadece kenar listesinden daha net olduğunu düşündüm, çünkü akıl yürütmem yanlışsa, doğrulamak için gereken tek şey, yapının üstündeki turnuvanın aslında bu ima özelliklerine sahip olup olmadığıdır. Edge (3,6) hakkındaki hatayı işaret ettiğiniz için teşekkür ederiz! Ayrıca, bu gadget için 8 TFAS aldım, listelediklerinizden biri.
G. Bach

Üzgünüm. Grafiği yanlış inşa ettim. Bunu düzelttim ve clingo artık TFAS bildirmiyor.
dspyz

1

TFAS olmadan hiçbir grafik bildirmeyen kısa bir clingo programı çalıştırdım, ancak bir hata vardı. Düzelttim ve şimdi n = 8 veya daha az bir TFAS olmadan grafik olmadığını doğrular. N = 9 için bunu bulur:

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

İşte (sabit) kodlama

% 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Şununla çalıştır (clingo 4.2.1 kullanarak)

(n = 7, tam olarak 7 köşeli grafikleri gösterir)

Yalnızca 7 köşede TFAS içermeyen bir grafik varsa ve tatmin edici olmalıdır.


Tamam, @ G.Bach'ın hangi grafiği açıkladığını ve clingo'da kodladığını anladım (aşağıdaki clingo açıklamasına bakın. Gadget grafiğinin bir açıklamasıyla başlar ve tam kopyasını almak için kopyalarının nasıl birleştirileceğini açıklar 34-vertex turnuva grafiği G.Bach açıklıyor. Ben de topraklı grafik açıklamasını ekledim).

Daha sonra bu grafik üzerinde clingo çalıştırmaya devam ettim ve 241 kenarlı bir TFAS bulduğunu iddia etti. Ama grafik kodlamasında bir hata yaptım. Hatayı düzelttim ve clingo şimdi tatmin edilemez raporlar (yani TFAS yok).

İşte bir grafik üzerinde TFAS bulmak için program

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

İşte G.Bach'ın grafiğini oluşturmak için (güncellenmiş) program. Grafiğin iyi biçimlendirilmiş bir turnuva grafiği olup olmadığını kontrol etmek için sonuna göstergeler ekledim:

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'ı olmayan 18 köşede bir turnuva var.
G. Bach

Lütfen örnek verebilir misiniz? Kenarları listelenen bir dosya ekleyin
dspyz

Nasıl dosya eklerim? Birkaç saat sürebilir, şu anda elimde turnuva yok. Ayrıca yanlış hesapladım, 34 köşesi olmalı. Turnuvanın yapı taşlarını verip vermediğimi doğrulamak muhtemelen daha kolay.
G. Bach

Herhangi bir dosya ana bilgisayarına yükleyin ve ona bağlayın (bkz. Meta.stackexchange.com/a/4643/185877 ) veya düzenli bir yapısı varsa, sadece açıklayın (yapı taşlarını verin)
dspyz

henüz kodunuzu takip edemez ama sonlu n20 için doğruladığını iddia ediyorsun? son cümle tüm için geçerlidir ... eğer çok dikkat çekici (!) ama genel soruya bir "çözüm" (tüm boyut vakalarının bir kanıtı gerektirir). ps thx , bu siteye genel olarak nadir görülen ampirik bir gözlem göndermek için ... @ G.Bach mümkünse sadece kenar / köşe listeleri yerine grafiğin bir görüntüsünü görmek harika olurdun
vzn

0

SWAG varsayımı [hiçlikten daha iyi bir şey mi?]:

Bir turnuvası verildiğinde , geçişli bir ilişki tanımlayan dizisi ayarlanmış bir geri besleme yayı vardır . dolayısıyla sorunF E G O ( 1 )G=(V,E)FEGO(1)

notlar: aşağı sayım hiçbiri şimdiye kadar verilmemiş gibi görünüyor. daha da iyisi, belirli grafik sınıflarıyla ilgili kenar yönelim kalıplarının gözlemleri olabilir. ya da biraz daha fazla motivasyon veya mevcut literatüre bağlamak. Kanıtlar ve çürütmeler tarzında sunulan (Lakatos) ... Ayrıca, [henüz?] çok fazla ilgili olmayan, deneysel olarak çalışma önermek gibi sıradışı bir sorun gibi görünüyor ....


1
Bunun olup olmadığını kontrol etmek için bir program yaptım ve geçişli bir geri bildirim yayı seti olmayan turnuvalar olduğunu gördüm. Yarın bir tane göndereceğim, bugün buralara ulaşmayacağım.
G. Bach

@vzn rastgele bir turnuva için varsayımı kanıtlayabilir misiniz?
Igor Shinkar

Sadece 5 köşeli örnek: a-> b, a-> c, b-> c, d-> a, b-> d, c-> d, e-> a, e-> b, c-> e , d-> e. Herhangi dört köşe için, indüklenen grafik bir döngü içerir, bu nedenle geçişli bir DAG grafiğin 3 köşesi arasında en fazla 3 kenar içerebilir. Sadece 5 olasılık var (diğer tüm üçüzler döngüdür): abc, eab, dea, bcd, cde Beş durumda her birinin diğer 7 kenar arasında bir döngü olduğunu kontrol etmek kolaydır
dspyz

1
Evet, nvr zihin, bu bir karşı örnek değil
dspyz

1
@ dspyz 8 turnuvaya kadar tüm turnuvalarda kaba kuvvet kontrolü yaptım. Hepsinin geçişli geribildirim yay setleri vardır, ancak olmayan bir turnuva oluşturmak için kullanabileceğiniz bazıları vardır.
G. Bach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.