Bir seti, bazı koşullara bağlı olarak belirli sayıda ayrık alt kümeye nasıl bölebilirim?


11

Bana bir küme , bir tamsayı ve negatif olmayan tamsayı a_ {ij} verilir . Sorunum bulmaktır ler ayrık alt kümeleri S_j ait \ {1, \ ldots, k \} , öyle ki:A { 1 , ... , k } A{1,,k}ler k skbir i jaij s sS jSj { 1 , ... , k }{1,,k}

  1. s j = 1 S j = birsj=1Sj=A ; ve
  2. | S_j | \ leqslant a_ {ij} S_j ve j = 1, \ ldots, s içindeki| S j | bir i j|Sj|aij tüm i \ için .i S jiSjj = 1 , , sj=1,,s

Bu problem nasıl çözülür? Uygulanabilir bir çözüm bulmak zor mu?

Sorunu çözmek kolay değil, çünkü j { 1 , , n }j{1,,n} ile başlayan ve numaraya kadar \ {1, \ ldots, k \} tarafından atanan bir prosedür denedim. i { 1 , , k }i{1,,k}ve beni tahsis jj daha büyük olan a i jaij bazı beni verildi. Bazı sol olabilir çünkü Ama bu doğru değil beni herhangi atanamadı jj (çünkü onların arasında a i jaij memnun değil olabilir).

Kaba kuvvet yöntemi, A'nın tüm alt kümelerini oluşturmak birAve her birini test etmek zorunda kaldığımda benim için çalışıyor ( k = 8 , n = 3k=8,n=3 ) ama çok verimsiz.


Düzenlemenin sormak istediğiniz soruya karşılık gelip gelmediğini kontrol edin. Ayrıca, nereden geliyor? Bu sabit bir sabit mi (girişin bir parçası değil, her zaman sabittir), yoksa girişin bir parçası mı? Son olarak, pratik bir çözüm mü arıyorsunuz? yoksa bu sorunun teorik karmaşıklığını mı arıyorsunuz? Eğer eski ise, tamsayı doğrusal programlama kullanmayı denediniz mi? bir maksamax
DW

Yanıtlar:


10

Bu sorun, Vertex Cover'dan indirgeyerek NP-zordur.

Vertex Cover probleminde, bir grafiği ve bir sayısı verilir ve görevimiz, her kenarın olay olacak şekilde en fazla köşesinde bir alt kümesi olup olmadığını belirlemektir. en az bir tepe noktasında . (Eşdeğer olarak: her kenarı en fazla köşeyi silerek öldürmek mümkün müdür ?)G = ( V , E ) r U r V E U G rG=(V,E)rUrVEUGr

İlk olarak, bölümleme içine ayrık alt kümelerini her öğesi atama eşdeğerdir tam olarak bir mümkün etiketler. İndirgeme temel fikri bir etiket oluşturmak için her köşe için olarak ve her bir kenar aşağıdaki anlamda, sadece uç noktalarına karşılık gelen iki etiketlerden birine tahsis edilecek "izin" için: karşılık gelen bir bir kenar atama etiketi, başka hangi kenarlara aynı etikete atanabileceğine dair (gerçek) bir kısıtlama getirmezken, karşılık gelen olmayan bir etikete kenar atamak, başka bir kenarın aynı etikete atanmasını önler - ki elbette sayıyı yukarı itme etkisi vardır etiketlerin ayrı ayrı olması gerekir.A s A s S j v j VAsAsSjvjV

Sorununuzun bir örneğini Vertex Cover örneğinden oluşturmak için:( A , a , s ) ( G , r )(A,a,s)(G,r)

  1. Set etmekVe bir elemanı oluşturmak içinde her bir kenar için içinde . (Bu çiftler tamsayıları olarak düşünülebilir ; aralarındaki herhangi bir bijection bunu yapar.)k | E | ( i , j ) A v i v j E 1 , , kk|E|(i,j)AvivjE1,,k
  2. Set içinEğer ya da ; aksi takdirde, değerini 1 olarak ayarlayın.a ( b , c ) , d | E | d = b d = c a ( b , c ) , da(b,c),d|E|d=bd=cbir(b,c),d
  3. ayarlayın .s = rs=r

Eğer sadece etiket çekme: Vertex Kapak bir VAR-örneğidir, o zaman sadece sorunun inşa örneği de bir VAR örnekli olduğunu görmek kolaydır köşe tekabül bir çözelti içinde ve her kenar veya etiketlerinden hangisi (her iki etiket de seçilmişse isteğe bağlı olarak seçin karşılık gelen öğeyi atayın . Bu çözüm altkümelerini kullanır ve geçerlidir; çünkü yürürlükteki tek karşılık gelenlerdir.( G , r ) S j v j U v b v cE ( b , c ) A S b S c s a i j(G,r)SjvjUvbvcE(b,c)ASbScsaij den daha fazlasını önlemenin (non) etkisi olan etiketler kenarlara aynı etiket atanır. | E ||E|

Sorununuzun bir YES örneği orijinalinin Vertex Cover'ın YES örneği olduğunu ima ettiğini göstermeye devam etmektedir . Bu biraz daha geçerli bir çözelti, çünkü karmaşık için olabilir genel ata bir kenar bir sigara -corresponding etiket yani, anlamı, sevemeyeceğimizdir mutlaka geçerli bir çözüm geçerli bir tepe noktası "okunması" .X = ( A , a , s ) ( G , r ) Y X ( i , j ) S m m { i , j } U YX=(A,a,s)(G,r)YX(i,j)Smm{i,j}UY

Bununla birlikte, sigara karşılık gelen etiketin tahsisi ciddi çözeltisi yapısını sınırlayan yüksek bir maliyet: bir kenar zaman bir etiket tahsis edilir ile, , aslında bu sağlar olması gerekir ancak bu etiket verilir kenarı. Dolayısıyla, karşılık gelen böyle bir etiketlenmemiş kenar içeren herhangi bir çözeltisinde , aşağıdaki gibi alternatif bir çözeltisi oluşturabiliriz :( i , j ) S m m { i , j } a ( i , j ) , m = 1(i,j)Smm{i,j}a(i,j),m=1Y ( i , j ) S m Y Y(i,j)Sm

  1. Keyfi Yeni etiket seçmek için ya olmaya veya .S z ( i , j ) S i S j
  2. Bu yeni etiketi atayın . Bu geçersiz bir çözümle sonuçlanıyorsa, bunun nedeni tam olarak bir diğer kenara , zaten etiketi atanmış . Bu durumda, ve 1. adıma gidin.( i , j ) ( i , j ) z { i , j } S z ( i , j ) = ( i , j )

Yukarıdaki algoritma iki yoldan biriyle sona ermelidir: ya çelişki yeni bir etiketi ya da tam bir köşe noktası döngüsü bulunur. İlk durumda, setleri ile geçerli yeni bir çözüm bulunurken, ikinci durumda setleri ile geçerli yeni bir çözüm bulunur; her iki durumda da, karşılık gelen bir etikete atanmış en az bir kenar daha olacak şekilde geçerli yeni bir çözüm oluşturduk . Tüm bu işlemi en fazlaZaman, geçerli bir çözüm ürettiler olacak orijinal Vertex Kapak soruna bir çözüm hangi olabilir okunabilir.S z s - 1 s | E | Y

Bu yapı açıkça polinom zamanıdır, bu nedenle probleminiz NP-serttir.


Yardımın için teşekkürler. Bu sorunu nasıl (yaklaşık olarak) çözebileceğiniz hakkında bir fikriniz var mı? (Örneğin, tepe kapağı problemini çözmek için teknikler kullanabilir miyim?) Bazı açgözlü bir yaklaşım denedim, ancak bazen uygun bir çözüm üretemedi. ( seçme , bir çözümün var olabileceği açgözlü yaklaşımı başarısız kılar.)S j
drzbir

Eh, açgözlü bir yaklaşım bazen hep yapsam beri, sen poli zamanlı olarak bir NP-zor problem çözme olacağını, çıkışa uygun bir çözüm başarısız olacağını bekleniyor ;-) o değil unutmayın mutlaka yanlış eğer yapamaz bir çözüm bulun: uygun bir çözüm bulunmuyor olabilir.
j_random_hacker

Çözüm teknikleri ile ilgili olarak, sevdiğim birisine ışın arama denir. Bu, temel olarak bellek kullanımını sınırlamak için yeterince kötü kısmi çözümleri "unutan" bir tür dal ve sınırdır. (B & B kendisi çok iyi bir yaklaşımdır ve bazen sorunları hızlı bir şekilde çözer ve ışın aramadan biraz daha basittir, bu yüzden
çekilmeye

(Aşağıdakilerin hepsi de B & B yanı sıra ışın arama için geçerlidir.) B & B çok genel bir tekniktir. Bununla ilgili en önemli şey, verdiğiniz kararları organize etmek için sorunun ayrıntılarını kullanmaktır, böylece mümkün olduğunca kötü kararlar (yani, uygulanabilir çözümlere yol açmayan kararlar) arama ağacında erken alınır . (Bu kararlar bir yerde verilecek ve her seviye daha derinleştirildiklerinde kaç kez ikiye katlandıklarını göreceksiniz .) Sorununuz için, önce öğeleri "kötülük" azalan düzeninde sıralamayı öneriyorum . ..bir
j_random_hacker

... öğesinin kötülüğü , örneğin, tüm üzerindeki nin asgari değeri olabilir, bağları ikinci-minimum, sonra üçüncü-minimum, vb. eklendiği tüm kümeleri en ciddi şekilde kısıtlar. Arama ağacındaki derinliğindeki her bir düğümde , ilk (ve dolayısıyla "en kötü") öğelerinin kümelere önceden atandığı kısmi bir çözümünüz olacaktır ; öğesinden hangisinin öğesini atayacağınızı seçmeniz gerekir : yani, en fazla yinelemeli çağrı yapmanız gerekir . ("Kadar" çünkü umarım elimizde, ...i a i j j d d n ( d + 1 ) n
j_random_hacker
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.