價值密度優先貪心策略對分數揹包問題的正確性證明
分數揹包問題是0/1揹包問題的變形,其中物品可以被分解成小塊,這就導致可以使用貪心演算法來解決此問題。 那麼如何證明對於價值密度優先貪心策略用於分數揹包問題(the greedy strategy of proft density frst for fractional knapsack problem)可以獲得一個最優解呢?
思路就是將貪心法的解與任意一個最優解進行比較來證明——運用反證法,如果這兩個解不同,就找出不相等的解,然後從中推出與假設矛盾的結論,從而證得原命題成立.
證明:用《演算法導論》的話來說,分數揹包問題中商品就好比“金砂”. 設預處理:對於這些不同品質金砂,若有某些不同金砂的價值密度相同(vm = vl, m != l),不妨將這幾種金砂看作是同種金砂(或者說混合在一起成為一種商品),這就大大簡化了證明.
(一)設揹包容量為c,價值密度優先貪心策略演算法為pdf, 經預處理後商品總共有n類,每樣商品的全部重量為Wrk(1<=k<=n),S(i)={Wi1,…,Win}(0<=Wik<=Wrk)是一個全域性最優解;∑Wik=c.
設S={W1,W2,...,Wn}是pdf所獲得的解,且不是最優解,其中v1>v2>...>vn(*),∑Wk=c. 根據預處理可知,(*)式不會取到等號。如果所有商品全部裝入揹包,顯然這個解就是最優解;如果不是所有商品裝入揹包,則設j是使Wk!=1的最小下標,由演算法可知,對於1<=k<j,Wk=Wrk; 對於j<k<=n, Wk =0;對於j, 有0<=Wk<Wrk. 設m是使得Wik != Wk的最小下標,由上面的假設,可以推得Wim <Wm ,這可從三種可能發生的情況,即m<j,m=j或m>j分別得到證明:
若m<j,則Wm=Wrm,因Wim != Wm,且0<=Wik<=Wrk,從而Wim<Wm 。
若m=j,(1)先證在這種情況下Wm!=0. 假設Wm=0,此時有Wk=Wrk=Wik(1<=k<m), 否則,與m是使得Wik != Wk的最小下標矛盾;這樣就有Wim>Wm=0, 然而,此時∑Wik>∑Wk=c, 與S(i)是可行解矛盾. 故當Wm>0;(2)對於1<=k<m,有Wk= Wik = Wrk ,若Wim >Wm ,則∑Wik>∑Wk=c ,與S(i)是可行解矛盾. 若Wim=Wm ,與Wim != Wm矛盾,故Wim<Wm .
若m>j,則Wim>Wm=0, 所以∑Wik>∑Wk=c,與S(i)是可行解矛盾.綜上,Wim < Wm.
(二)現在,假定把Wim增加到Wm,那麼必須從{Wim+1,…Win}中減去同樣多的量,使得所用的總容量仍是c,這將導致一個新的解Z={z1,…,zn},其中zk=Wk (1<=k<=m).
根據假設,重量改變數 = zm - Wim - ∑(Wik-zk)(m<k<=n) = 0.
Z總價值量=∑zkvk(1<=k<=n) = ∑Wikvk(1<=k<=n) + 價值改變數
= ∑Wikvk(1<=k<=n) + (zm - Wim)vm - ∑(Wik-zk)vk(m<k<=n)
> ∑Wikvk(1<=k<=n) + (zm - Wim)vm - vm∑(Wik-zk)(m<k<=n) (*)
= ∑Wikvk(1<=k<=n) + vm(zm - Wim - ∑(Wik-zk)(m<k<=n))
= ∑Wikvk(1<=k<=n)
從而得出了∑zkvk(1<=k<=n)>∑Wikvk(1<=k<=n), 這與S(i)是一個全域性最優解相矛盾.
綜上所述,黑體字假設不成立,從而得出了價值密度優先貪心策略用於分數揹包問題獲得的解是最優解的結論.
相關文章
- 演算法——貪心演算法解0-1揹包問題演算法
- 揹包問題(01揹包與完全揹包)
- 8.13(優先佇列貪心維護+打表找規律+對頂堆優先佇列+DFS減枝+貪心dp)佇列
- 01揹包優先佇列優化佇列優化
- 揹包問題
- 揹包問題演算法全解析:動態規劃和貪心演算法詳解演算法動態規劃
- 關於https 證明公開金鑰正確性的證書HTTP
- ACM 揹包問題ACM
- 01揹包問題
- 多重揹包問題的單調佇列優化佇列優化
- 分組揹包、完全揹包
- 揹包問題大合集
- 探索貪心演算法:解決最佳化問題的高效策略演算法
- HDU5630 Hiking(貪心+優先佇列)佇列
- 從【零錢兌換】問題看01揹包和完全揹包問題
- 01揹包問題的解決
- 揹包問題的演算法演算法
- BZOJ 1629 [Usaco2005 Nov]Cow Acrobats:貪心【區域性證明】BAT
- JavaScript中揹包問題(面試題)JavaScript面試題
- 揹包問題例題總結
- 揹包計數問題的多項式最佳化
- JavaScript 揹包問題詳解JavaScript
- Sunscreen POJ - 3614(防曬油) 貪心-優先佇列佇列
- 揹包問題的一道經典問題
- 全排列價值(數學問題)
- 揹包問題解題方法總結
- JS驗證18位身份證號的正確性JS
- CodeForces - 960B:Minimize the error(優先佇列+貪心)Error佇列
- uva10954Add All(貪心+優先佇列)佇列
- 貪心演算法——換酒問題演算法
- 揹包問題----動態規劃動態規劃
- 【動態規劃】揹包問題動態規劃
- Java實現-揹包問題IJava
- Java實現-揹包問題IIJava
- Java實現-揹包問題VIJava
- chapter12-2-揹包問題APT
- 二維費用揹包問題
- 演算法基礎–貪心策略演算法