En uygun siparişi bulun


9

Bu sorunla karşılaştım ve ona yaklaşmanın bir yolunu bulmaya çalışıyorum. Herhangi bir düşünce büyük mutluluk duyacağız!

Örneğin, matrisinin verildiğini varsayalım ,{1,0,1}n × k

[1010110001011011101110001]

Her bir permütasyonu denemeden, sıfır olmayan ilk elemanın olduğu satır sayısını en üst düzeye çıkaran sütunlarının bir bulun .ci1

Yukarıdaki örnek için, böyle bir sipariş (benzersiz değildir!) , yani,(c3,c4,c1,c2,c5)

[1010100101100110111100101]

Burada için üzerinden satır, ilk sıfır olmayan elemandır .451


Hangi algoritmik yaklaşımları denediniz? Bu problemle nerede karşılaştınız? Orijinal kaynağa kredi verebilir misiniz? Bağlam veya motivasyon hakkında bir şey paylaşabilir misiniz? Bu sayfayı sorunuzu geliştirmede yararlı bulabilirsiniz .
DW

1
Bir önişleme adımı önermek istiyorum: Yarı pozitif bir sütun (sırasıyla satır) sadece 0s ve 1s ile bir sütun (sırasıyla satır) olsun. Öneri tüm yarı pozitif sütunları ve ayrıca yarı pozitif bir sütunda 1 olan satırları kaldırmaktır. Örneğin, bu, 1, 3 ve 4 satırlarını kaldıracak. Artık, tümü -1s içeren satırlar ve sütunlar bırakacaksınız. Yardım etmeyebilir, ancak akıl yürütmek daha kolay olabilir.
Pål GD

Satır sayısının sütun sayısından çok daha az olduğunu varsayabilir miyiz? Bu, sorunu daha kolay hale getirebilir.
Angela Pretorius

1
@ Pål, benzer önişleme 1s içermeyen satır ve sütunlarla mümkündür. Ancak, bunun akıl yürütmeyi kolaylaştırdığını düşünmüyorum: sadece daha küçük.
Peter Taylor

1
FWIW bu bir çapraz gönderi . haijo, eğer bir yığına cevap alamazsanız ve bir diğerinin daha iyi olabileceğini düşünürseniz, onu işaretleyebilir ve taşıma talebinde bulunabilirsiniz. Çapraz gönderi iyi bir görgü kuralları değildir, çünkü cevap verenler diğer sitede aldığınız cevapların farkında değildir ve bunları tekrarlayarak zamanlarını harcayabilirler.
Peter Taylor

Yanıtlar:


4

Sütun Siparişi için CO diyeceğim bu sorun NP-zor . NP-zor problemi Vertex Cover'dan (VC) buna bir azalma :

VC ve CO'nun karar problem formları

Girdi VC örneği olsun (V,E,k). Şu soruyu temsil eder: "Grafik göz önüne alındığında(V,E), en fazla bir dizi seçmek mümkün mü k köşeleri V öyle ki her kenar E en az bir tepe noktasında olay var mı? " (A,k) sorusunu temsil eden CO ifadesi: "Matris verildi A elemanları ile {1,0,1}, sütunlarına izin vermek mümkün mü A öyle ki a 1 en azından -1'den önce görünür k"Bu iki problem, her birinin cevabının EVET ya da HAYIR olduğu biçim problemi şeklinde belirtilir : resmi olarak konuşursak, NP-tamamlanmış (ya da değil) bir problemdir. OP'nin sorusunda belirtilen daha doğal optimizasyon problem formunun karmaşıklık açısından kabaca eşdeğer olduğunu görün: eşik parametresinde ikili arama, bir problem problem çözücüsünü kullanarak optimizasyon problemini çözmek için kullanılabilirken, optimizasyon problemi çözücüsünün tek bir çağrılması , ardından tek bir karşılaştırma, karar sorunu çözmek için yeterlidir.

VC örneğinden CO örneği oluşturma

İzin Vermek n=|V| ve m=|E|. Bir matris oluşturacağızA ile (n+1)m+n satırlar ve n+1sütunlar. Üst(n+1)m satırlar m blokları n+1her satır, her blok kaplanması gereken bir kenarı temsil eder . Altn satırlar, CO çözümünün sol tarafına dahil edilirse (bir tepe noktasına karşılık gelen) bir sütunun (bir tepe noktasına karşılık gelen) sabit bir maliyete yol açmasına neden olacak şekilde "bayraklar" içerir (tepe noktasının tepe kapağına dahil edilen bir tepe noktasına karşılık gelir) VC çözeltisi).

Her köşe için vi, içinde bir sütun oluşturun:

  • en iyiler arasında (n+1)m satırlar j- bloğu n+1 kenarlarda satırların tümü +1 içerir ej olay vi, ve 0 ise, ve
  • altta n satır hariç tüm satırlar 0'dır. i-th, -1.

Şunlardan oluşan bir "çit" sütunu daha oluşturun (n+1)m -1 kopyası, ardından n +1 kopyaları.

Son olarak, eşiği ayarlayın k oluşturulan CO örneği için: (n+1)m+nk. Başka bir deyişle, en fazlak+1'den önce -1'in göründüğü satırlar. Bu sayıda ihlal eden satıra CO çözümünün "maliyeti" diyelim.

Kanıt

CO örneğine yönelik bir çözüm ile orijinal VC örneğindeki bir köşe kümesi arasındaki yazışma şudur: Çitin solundaki her sütun, kümedeki bir tepe noktasına karşılık gelir ve çitin sağındaki her sütun aşağıdakilere karşılık gelir olmayan bir tepe noktası.

Sezgisel olarak, "çit" sütununun üstündeki -1'ler, sola yerleştirilecek sütunların bir alt kümesinin seçimini, birlikte tüm bu konumlarda + 1'ler içeren - her birinde meydana gelen bir köşe alt kümesine karşılık gelen şekilde zorlar kenar. "Çit" in solunda görünen bu sütunların her birinin alt kısmında bir yerde ayrı bir satırda -1 vardırn1 maliyeti olan satırlar; "çit" in altındaki + 1'ler sağa yerleştirilen tüm sütunların böyle bir maliyet ödememesini sağlar.

Açıkça en fazla kullanan bir VC çözümü k vertices en çok maliyetle inşa edilmiş CO örneğine bir çözüm getirir k: Tepe noktası kapağındaki köşelere karşılık gelen sütunları rastgele, ardından çit sütunu ve ardından kalan tüm sütunları istediğiniz sırayla sipariş edin.

CO örneğine en fazla maliyetle bir çözüm olduğunu göstermeye devam ediyor k bir tepe kapağına karşılık gelir k köşe noktası.

Aksine, CO örneğine en fazla maliyetle bir çözüm olduğunu varsayalım k üstte bir sıra bırakıyor (n+1)m+1'den önce -1 olan satırlar. Bu satır bir bloğa ait(n+1) belirli bir kenara karşılık gelen satırlar uv. Orijinal örnekte bu bloktaki her satırAyapı ile özdeştir; sütunlara izin vermek bu satırları değiştirebilir, ancak aynı olmalarını etkilemez. Böylece bunların her birin+1 özdeş satırlar, çözümde +1'den önce -1'e sahiptir, bu da en az maliyeti ifade eder n+1. Fakatkn<n+1: çelişki.

Her biri m üstteki satır blokları (n+1)msatırlar -1'den önce +1 değerine sahiptir, karşılık gelen kenarların her biri çitin solundaki bir sütuna karşılık gelen bir tepe noktasıyla kaplıdır: yani, köşelerin bu alt kümesi bir tepe örtüsü oluşturur. Üstlerin hiçbiri olmadığından(n+1)m Satırların + 1'den önce -1 değeri vardır, çözümde maliyetin tahakkuk edebileceği tek yer en alttadır nsatır, çitin soluna yerleştirilmiş sütunlardan. Her bir sütunun maliyeti tam olarak 1'dir, bu nedenle maliyetin en fazla olduğu göz önüne alındığındaken fazla olmalı k bu tür sütunlar ve dolayısıyla en fazla k kapak köşeleri.

Son olarak, CO örneğinin VC örneğinden polinom zamanda oluşturulabileceği açıktır, yani CO'nun çözümü için bir polinom-zaman algoritması mevcutsa, herhangi bir VC örneğinin de ilk önce açıklandığı gibi bir CO örneği yapılarak polinom zamanda çözülebileceği açıktır. yukarıda ve sonra çözme. VC NP-sert olduğundan CO da vardır.


Böyle güzel bir cevap olduğunda, "Sıcak Ağ Soruları" nın "Değerli Ağ Yanıtları" gibi bir şeyle değiştirilip değiştirilmemesi gerektiğini merak ediyorum.
John

Cevabı nasıl bulduğunuza biraz ışık tutabilir misiniz? Bu, cevabın kendisinden daha aydınlatıcı olmalıdır.
John

1
@ Apass.Jack: Teşekkürler! :) Özel bir stratejim yok ve yanlış yönde dolaşmak için uzun zaman harcayabilirim. Örneğin, burada uzun bir süre, inşaatımın alt tonlara karşılık gelen konfigürasyonlara izin vereceğini ve dolayısıyla işe yaramayacağını fark etmeden önce Hamilton Döngüsü'nden (öğeleri sipariş etmekle aynıdır) düşürebileceğimi düşünerek uzun zaman geçirdim. Kural olarak, her zaman Vertex Cover veya Partition'dan indirimler deniyorum, sonra belki Clique. "Değerli Ağ Yanıtları" harika bir fikir gibi geliyor :)
j_random_hacker

1
@ Apass.Jack: Yararlı bir genel fikir, bir hedef problem örneğini cevabını değiştirmeden nasıl "ölçeklendirebileceğinizi" düşünmektir - örneğin hedef problem (zorlamaya çalıştığımız şey) Vertex Cover ise, tamsayı r grafiğin ayrık kopyaları ve eşiği çarpma k tarafından rcevabı değişmeden bırakır. Genellikle belirli ihlallerin (geçerli kaynak çözümlerine karşılık gelmeyen hedef çözümler) bazı diğerlerini "üstesinden gelmesini" istersiniz ve bu durumda daha önemli ihlale karşılık gelen gadget'ları "çoğaltabilirsiniz".
j_random_hacker

1
Cevabımın azaltılması için, iki "kuvvetin" olduğu bir sorunun örneğini kodlamak istiyoruz: Tüm kenarları örtmeye çalışın ve mümkün olduğunca az köşe kullanın. İlki burada daha önemli, bu yüzden kenarlara karşılık gelen satırları "çarptım": şimdi tek bir kenar ihlali maliyetin+1yani tek bir kenarı kaçırmak tüm köşeleri eklemekten daha kötüdür. Ve şimdi , eşik parametrelerinin sorun örneğinin bir parçası olduğu bu iki sorunun karar problemi sürümleriyle uğraştığımızı açıkça belirtmek için cevabı düzenlemem gerektiğini fark ettim ...
j_random_hacker

2

Aslında bir polinom çözümü olup olmadığını bilmiyorum. Yine de Pål GD'nin yorumuna dayanarak, bir sadeleştirme işlevi oluşturabilirsiniz. Çıkış dizisini oluştururken ilk matris basitleştirilirS.

function simplification:
while(true)
    if any row i$ has no 1 or no -1 left, remove it
    if any column j has no -1 then,
       remove it and put j on the leftmost available position in S,
       remove all rows where column j has 1.
    if any column j has no 1 then, 
       remove it and put j on the rightmost available position in S.
    if no modification has been done on this loop, break

Ardından, tekrarlayıcı işlev seçimini kullanarak birleştiricilerin tam bir keşfini yapmalısınız:

function pick(k):
    put column k on the leftmost available position in S
    remove any row where column k is -1 or 1

Her seçimden sonra, keşfedilecek olasılıkların sayısını azaltmak için bir basitleştirme yapabilirsiniz. Daha az -1'e sahip sütundan başlayarak açgözlülükle keşfetmenizi öneririm, böylece bir durdurma kriteri yaparak alt sınırlara ulaşabilirsiniz.

Verilen örnekte, ilk basitleştirme (Pål GD'nin açıklamada açıkladığı gibi)

  • S[0]=c3, r1, r3'ü kaldır
  • S[1]=c4, r4'ü kaldır
  • S[2]=c2 Bu, keşfetmeniz için basit bir matrisle izin verir.
    [1111]

Bu yöntemi oldukça verimsiz hale getiren bir matrisin, tam olarak 1 ve satır / sütun başına bir -1'e sahip olacağını düşünüyorum.

[110000110000001100001100000011000011]

Bununla birlikte, sadeleştirme hala keşif adımlarının yaklaşık yarısını oluşturmaktadır. Ve bu tip matris birkaç bağımsız alt matrise bölünebilir.


1
@ Apass.Jack Daha kesin olmak için düzenledim. Evet, çıkış sırasındaki sütun konumunu kastediyorum.
Optidad

Sadeleştirme adımı pratik amaçlar için yeterli olabilir (çevrimiçi programlama alıştırmaları gibi?).
John

Teşekkürler, aslında amortisman zaman maliyetini tahmin etmek istedim ama nasıl yapacağımı gerçekten bilmiyorum. Mümkün mü ? Yoksa çok probleme bağımlı mı?
Optidad

2
Zor görünen amortize edilmiş zaman analizini denemiştim. NP eksikliğinden şüpheleniyorum . Öte yandan, sadeleştirme adımı daha genel olabilir. Sütun içini ve j öyle ki, paylaşılan sıfır olmayan kısım bunların sıfır olmayan kısmı i, sütun j ekstra sıfır olmayan kısmı kaldırılabilir j 1 ve sütun içermiyor i ekstra sıfır olmayan kısmı kaldırılabilir j-1 içermez.
John

1
Başka bir üstünlük kuralı: İki sütununuz olduğunda i ve j en az 1 sıra olacak şekilde i -1 ve j +1 değerine sahip ve burada satır yok i +1 ve j -1'e sahipse, yerleştirmenin hiçbir avantajı yoktur iilk. Diyelim kij ağırlıkta olmak ibu durumda. Bunu seçim içinde uygulayabilirsiniz (k) kyerleştirilmiş sütunlardan herhangi birine hükmeder: öyleyse arama ağacının bu dalını budaabilirsiniz.
19:14, 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.