Çok güzel bir soru!
İki kez haklısın:
- Sırt çantasındaki eşya sayısını yaymak en uygun çözümlere yol açmaz.
- 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 , j,benj
Ti , j,= maks. { Tben , j - 1, Ti - wj, j - 1+ 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 , NwjvjjCN-TC, 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
- İ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,TTben , j - 1< ( Ti - wj, j - 1+ vj)jppTi , j,= ( Ti - wj, j - 1+ vj)jpp
- İ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 , jTben , j - 1> ( Ti - wj, j - 1+ vj)Ti , j,= Tben , j - 1 p(j-1)j(p-1)(j-1)Tben , j - 1p( j - 1 )j( p - 1 )( j - 1 )
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 kTben , j , kbenjk
- öğ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ı : j≤kk T i , j , kTben , j , kj ≤ kkTben , j , k= maks. { Tben , j - 1 , k, Ti - wj, j - 1 , 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.{Tben , j , kj > kTben , j , k= maks. { Tben , j - 1 , k, Ti - wj, j - 1 , k - 1+ 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 )( k - 1 )T(k−1)(j−1)
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(k−1)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,(k−1)(j−1)Ti,j−1,k−1maxp=0,j−1{Ti,p}k(j−1)öğ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,