Sırt çantası sorununun çeşidi


11

Artık sırt çantasındaki öğe sayısını sabit bir ile sınırlamanız gerekiyorsa dinamik bir programlama durumunda sırt çantası sorununa nasıl yaklaşırsınız ? Bu aynı sorundur (maksimum ağırlık , her öğenin değeri ve ağırlık ) ancak sırt çantasına yalnızca öğeleri ekleyebilir ve açık bir şekilde sırt çantasının değerini optimize etmeniz gerekir.W v w ppWvwp

3. boyuta ihtiyacımız var mı yoksa onsuz başka bir yaklaşım bulabilir miyiz? Basitçe hücredeki sırt çantasındaki öğe sayısını eklemeye ve sonunda <= sayısı ile maksimum değeri almaya çalıştım ama EN İYİ çözüm değil.p


Bu güzel bir ödev çalışması. Ne denedin? Dinamik programlama yapmakta rahat mısınız? (Değilse, belki pratik yapmak için bazı alıştırmalar yapmayı deneyin.) Sırt çantası problemi için standart dinamik programlama algoritmasını incelediniz mi? Bu standart yaklaşımı değiştirmenin bir yolunu arayın. Ana göreviniz alt problemler kümesinin ne olması gerektiğini tasarlamaktır. Standart yaklaşımda, bir alt problem bir parametre ile karakterize edilir (öğelerin ağırlığına bağlı). İki parametre kullanmayı düşünebilirsiniz (bu nedenle daha geniş bir alt sorun kümesi). Çeşitli olasılıkları deneyin - ne elde edersiniz?
DW

Yanıtlar:


9

Çok güzel bir soru!

İki kez haklısın:

  1. Sırt çantasındaki eşya sayısını yaymak en uygun çözümlere yol açmaz.
  2. Bir çözüm üçüncü bir boyut eklemekten oluşur. Bu oldukça basittir ancak bunu yaparken bazı gerçekleri dikkate almak gerekir. Ancak bunun tek alternatif olmadığını unutmayın

Aşağıda, dinamik programlamaya dayalı çözümü bildiğinizi varsayıyorum. Özellikle, çözümü belirlemek için tabloyu nasıl geriye doğru hareket ettireceğimi tartışmayacağım .

Önce tipik duruma odaklanalım: öğe sayısı sınırsız . Bu durumda, sadece bir tablo oluşturmak knapsack genel kapasite eşit olduğunda optimum değeri içeren ve sadece ilk öğeler olarak kabul edilir. Buradan:T i , j i jTTi,jij

Ti,j=max{Ti,j1,Tiwj,j1+vj}

burada ve , sırasıyla öğesinin ağırlığını ve değerini temsil eder . Eğer senin sırt çantası genel kapasitesidir ve toplamda vardır optimal çözüm verilir öğeler . Bu algoritmanın sahte-polinom zamanında çalıştığı bilinmektedir ve güzelliklerinden biri sadece maksimum kapasiteye uyan kombinasyonları dikkate almasıdır.v j j C N T C , NwjvjjCNTC,N

Ancak, sınırınızı eklerken bu yeterli değildir: maksimum öğe sayısı . Bunun nedeni, önceki yineleme formülünün farklı öğe kombinasyonlarını dikkate almamasıdır:p

  1. İlk olarak, eğer daha sonra böylece -inci madde olarak kabul öğeleri, maksimum sayıda rağmen çantaya eklenir size kısıtlamayı ihlal edebilecek, böylece ---. Burada, her adımda eklenen öğe sayısını takip ederek önceki formülü uygulamak ve sırt çantasında bulunan öğe sayısı aşarsa başkalarını eklememek cazip gelebilir , ancak,TTi,j1<(Tiwj,j1+vj)jppTi,j=(Tiwj,j1+vj)jpp
  2. İkinci olarak, eğer daha sonra , bu madde ilave edilmez, böylece, ancak optimum çözüm zaten sırt çantasına yerleştirilecek maksimum öğe sayısından oluşuyorsa büyük bir hata olabilir . Bunun nedeni, doğru bir şekilde karşılaştırmamamızdır: bir yandan, önceki arasından seçilen maddelerden oluşan optimal çözümü korumak için ; Öte yandan, öğeyi eklemek ve ek olarak önceki arasında öğelerle en iyi alt kümesi düşünün .T i , j = T i , j - 1 T i , jTi,j1>(Tiwj,j1+vj)Ti,j=Ti,j1 p(j-1)j(p-1)(j-1)Ti,j1p(j1)j(p1)(j1)

Böylece birinci çözüm üçüncü bir boyut eklemekten ibarettir. Sizin durumunuz için, sırt çantası kapasitesi olduğunda en uygun çözüm olsun , sadece ilk öğeleri göz önünde bulundurulur ve sırt çantasına öğesinden daha fazlasının konmasına izin verilmez . Şimdi, i j kTi,j,kijk

  • öğe sayısından ( ) kesinlikle daha az veya eşit sayıda öğe için hesaplıyorsanız her zamanki gibi devam edin, ancak aynı : jkk T i , j , kTi,j,kjkkTi,j,k=max{Ti,j1,k,Tiwj,j1,k+vj}
  • Şimdi, eklenebilecek öğe sayısından ( ) kesinlikle daha büyük sayıda öğe için hesaplamanız gerekiyorsa : j>k T i , j , k =maks.{Ti,j,kj>kTi,j,k=max{Ti,j1,k,Tiwj,j1,k1+vj}

İlk ifade açık olmalıdır. İkinci tablonun tablosunun katmanı, yukarıda gerektiği gibi ilk arasındaki öğelerinin en iyi kombinasyonunu takip eder .T ( k - 1 ) ( j - 1 )(k1)T(k1)(j1)

Bu algoritmanın etkili bir şekilde uygulanmasının tüm için hesaplamasına gerek yoktur . Önceki rekürrens ilişkilerinin katmanını ile ilişkilendirdiğine dikkat edin ve böylece birbirini takip eden iki katman arasında geçiş yapmak mümkündür (örneğin, ile optimal çözümle ilgileniyorsanız, sadece iki ardışık katman kullanırsınız: 0 ve 1, 1 ve 2, 2 ve 3, 3 ve 4 ve işiniz bitti). Başka bir deyişle, bu algoritma, dinamik programlamaya dayanan geleneksel yaklaşımın gerektirdiği belleği iki katına çıkarır ve bu nedenle yine de sözde polinom zamanında çalıştırılabilir. k k ( k - 1 ) k = 4Ti,j,kkk(k1)k=4

Ancak bunun tek çözüm olmadığını unutmayın! Daha zarif bulabileceğiniz bir tane daha var. Önceki formüllerde, olarak ilk arasında en fazla maddeden oluşan optimal çözümü elde ettik . Ancak, bunun sadece orijinal tabloyu kullanarak ile tam olarak eşit olduğu açık olmalıdır !! yani. öğeden fazla olmayan en uygun çözüm, 1 öğe, 2 öğe, 3 öğe, vb. ile en uygun çözümler dikkate alınarak da elde edilebilir ...( j - 1 ) , T i , j - 1 , k - 1 maksimum p = 0 , j - 1 { t i , s } K ( j - 1 ) k,(k1)(j1)Ti,j1,k1maxp=0,j1{Ti,p}k(j1)öğeler ... Bu formülasyonun işe yaraması için, her kısmi çözümde dikkate alınan öğe sayısını da takip etmelisiniz, böylece hücre başına iki tamsayıya ihtiyacınız olacaktır. Bu bellek işgali, yukarıda gösterilen algoritmanın tam olarak aynı bellek gereksinimlerine yol açar (katmanlar biçiminde üçüncü bir boyut kullanılarak )k .

Bu yardımcı olur umarım,


Çok iyi yanıt, teşekkür ederim. 3. boyut da uygulayarak gönderinizden önce bunu başardım.
user11536

Ah, soruyu kapattığınız için çok teşekkürler ve yanıtı sevdiğinizi duyduğuma sevindim. Fikirlerimi netleştirmek için Python'da bu algoritmanın uygulanmasını da denedim. Eğer bir göz atmak istiyorsanız, bana bildirin, ben de mutlu bir şekilde gönderirim (ya da size gönderirim). Şerefe,
Carlos Linares López

Çok boyutlu sırt çantası sorununun şaşırtıcı açıklaması.Ancak benzer bir durumumuz olup olmadığını merak ediyordum ama tam olarak k unsurları ile, sadece 3. boyutun kth sütununun döndürdüğü değerlere bakacağız. Haklı olup olmadığımdan emin değilim çünkü dinamik programlamaya hâlâ yeniyim.
SteveIrwin

@ CarlosLinaresLópez harika bir cevap. Lütfen python betiğini de paylaşabilir misiniz? Belki de gist.github.com adresine gönderebilirsin?
Saad Malik

1
Merhaba Carlos! Alternatif formülünüzü burada kullanmak için bir soru gönderdim: 0/1 Sırt Çantası'ndaki n-en iyi öğeleri bulma . Neyse umarım tatilin tadını çıkarırsın!
Saad Malik
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.