- 相關(guān)推薦
用動(dòng)態(tài)規(guī)劃法和貪心法解決背包問題
算法與語言
用動(dòng)態(tài)規(guī)劃法和貪心法解決背包問題
唐
敏1,劉冠蓉1,鄧國(guó)強(qiáng)
2
(1.武漢理工大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北武漢430070;
2.武漢理工大學(xué)理學(xué)院,湖北武漢430070)
摘要:0-1背包問題和背包問題是一類經(jīng)典的NP困難問題。采用動(dòng)態(tài)規(guī)劃法和貪心法對(duì)該問題進(jìn)行求
解,分析和比較這兩種算法在求解同一問題時(shí)的差異。
關(guān)鍵詞:背包問題;0-1背包問題;動(dòng)態(tài)規(guī)劃法;貪心法中圖分類號(hào):TP312
文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1672-7800(2007)03-0111-03
10-1背包問題與背包問題
1.10-1背包問題
給定n個(gè)重量為(w1,w2,∧,vn)價(jià)值為(v1,v2,∧,vn)的物品和一個(gè)承重量為W的背包,求這些物品中最有價(jià)值的一個(gè)子集,并且要能夠裝到背包中。
在選擇裝入背包的物品i時(shí),對(duì)每種物品只有兩種選擇,即裝入背包或不裝入背包。不能將物品裝入背包多次,也不能只裝入部分的物品。在這里假設(shè)所有的重量和背包的承重量都是正整數(shù)。
選擇物品裝入背包時(shí),可以選擇物品的一部分,而不一定要全部裝入背包。
2n,所以不論生成獨(dú)立子集的效率有多高,
窮舉查找都會(huì)導(dǎo)致一個(gè)-(2n)的算法。即對(duì)于任何輸入都非常缺乏效率的算法。這就是所謂的困難問題,目前沒有已知的,效率可以用多項(xiàng)式來表示的算法。
表2窮舉過程和實(shí)例的解子
集
總重量
總價(jià)值
1.4背包問題的形式化描述
給定W>0,Wi>0,vi>0,1≤i≤n,要求找出n元0-1向量(x1,x2,∧,xn),0≤xi≤1,1≤
n
n
i≤n使得%wixi≤W,而且%vixi≤W達(dá)
i=1
i=1
到最大。
20-1背包問題的一個(gè)小規(guī)模的實(shí)
例
表1
物品
重量
價(jià)值
⊙{1}{2}{3}{4}{1,2}{1,3}{1,4}www.dameics.com{2,3}{2,4}{3,4}{1,2,3}{1,2,4}{1,3,4}{2,3,4}{1,2,3,4}
大價(jià)值為37美元。
0213235443565768
01210201522322302535
不可行
1.20-1背包問題的形式化描述
給定W>0,Wi>0,vi>0,1≤i≤n,要求找出n元0-1向量(x1,x2,∧,xn),xi∈{0,1},
n
n
1234
承重量W=5
2132
12美元10美元20美元15美元
1≤i≤n使得%wixi≤W,而且&vixi達(dá)
i=1
i=1
到最大。因此,0-1背包問題是一個(gè)特殊的整數(shù)規(guī)劃問題。
n
考慮下面數(shù)據(jù)給出的實(shí)例:
在0-1背包問題中,采用窮舉查找需要考慮給定的n個(gè)物品集合的所有子集,為了找出可行的子集(也就是說,總重量不超過背包承重能力的子集)。要計(jì)算出每個(gè)子集的總重量,然后在它們中間找到價(jià)值最大的子集。
因?yàn)橐粋(gè)n元素集合的子集數(shù)量是
max&vixi
i=1
(
****)i****+
37
不可行不可行不可行
&wx≤W
=1
ii
n
xi∈{0,1},1≤i≤n
1.3背包問題最優(yōu)解為{物品1,物品2,物品4},最
與0-1背包問題類似,所不同的是在
作者簡(jiǎn)介:唐敏(1980-),女,廣西桂林人,武漢理工大學(xué)助教、碩士,研究方向?yàn)橹悄苡?jì)算;劉冠蓉,男,武漢理工大學(xué)教授,主要研究領(lǐng)域?yàn)橹悄苡?jì)算、數(shù)
據(jù)挖掘;鄧國(guó)強(qiáng)(1979-),男,武漢理工大學(xué)助教、碩士,研究方向?yàn)檠莼?jì)算。
月號(hào)111
算法與語言
3動(dòng)態(tài)規(guī)劃法
表4動(dòng)態(tài)規(guī)劃算法解背包問題實(shí)例次大,且能夠裝入背包,此時(shí)背包已滿。這時(shí)得到的總價(jià)值為35,它是一個(gè)次優(yōu)解。因此,按物品效益值的非遞增次序裝包不一定能得到最優(yōu)解。
為什么每一步使目標(biāo)函數(shù)值獲得當(dāng)前最大增值的貪心策略卻沒有獲得最優(yōu)解呢?原因在于:雖然每一步獲得了效益值的極大增長(zhǎng),但背包容量消耗太快。
(2)以容量為度量標(biāo)準(zhǔn)。物品2(承重
3.1動(dòng)態(tài)規(guī)劃法的基本思想
動(dòng)態(tài)規(guī)劃法是一種強(qiáng)有力的算法設(shè)計(jì)技術(shù),它被廣泛用于求解組合最優(yōu)化問題。這種技術(shù)采用自底向上的方式遞推求值,將待求解的問題分解成若干個(gè)子問題,先求解子問題,并把子問題的解存儲(chǔ)起來以便以后用來計(jì)算所需要求的解。
3.2遞推公式
為了設(shè)計(jì)一種動(dòng)態(tài)規(guī)劃算法,需要推導(dǎo)出一個(gè)遞推關(guān)系,用較小實(shí)例的解的形式來表示背包問題的實(shí)例的解。
解決0-1背包問題的遞推式如下:
優(yōu)子集的一部分。因?yàn)椋郑郏玻常荨伲郑郏,3],物品2是最?yōu)選擇的一部分,這個(gè)最優(yōu)子集用元素V[1,3-1]來指定余下的組成部分。同樣道理,因?yàn)椋郑郏,2]≠V[0,2],物品1是最?yōu)解{物品1,物品2,物品4}的最后一個(gè)部分。
該算法的時(shí)間效率和空間效率都屬于!(nW)。用來求最優(yōu)解的具體組成的
(1)
時(shí)間效率屬于O(n+W)。
量=1,價(jià)值=10美元)承重量最小的首先裝包,剩下4個(gè)承重量,再裝入物品4(承重量=2,價(jià)值=15美元),此時(shí)剩下2個(gè)承重量,裝入物品1(承重量=2,價(jià)值=12美元),背包已滿,此時(shí)得到的總價(jià)值為37美元。此時(shí)得到了該問題的最優(yōu)解。
(3)貪心法小結(jié)。從用貪心法解決0-1背包問題可以看出,采用不同的貪心策略對(duì)求解問題的結(jié)果也有所不同。所以,當(dāng)我們?cè)谑褂秘澬姆〞r(shí),必須證明該算法可以導(dǎo)致問題的最優(yōu)解。
和在動(dòng)態(tài)規(guī)劃算法的情況中一樣,貪心法通常用來求解最優(yōu)化問題,即量的最大化或最小化。然而,貪心法不像動(dòng)態(tài)規(guī)劃算法,它通常包含一個(gè)用以尋找局部最優(yōu)解的迭代過程。在某些實(shí)例中,這些局部最優(yōu)解轉(zhuǎn)變成了全局最優(yōu)解,而在另外一些情況下,則無法找到最優(yōu)解。
貪心法在少量計(jì)算的基礎(chǔ)上作出了正確猜想,而不急于考慮以后的情況,這樣,它一步步地來構(gòu)筑解,每一步均是建立在局部最優(yōu)解的基礎(chǔ)之上,而每一步又都擴(kuò)大了部分解的規(guī)模,做出的選擇產(chǎn)生最大效益而又保持可行性。因?yàn)槊恳徊降墓ぷ骱苌偾一谏倭啃畔,所得算法特別有效。
V[i,j]=
max{V[i-1,j],vi+V[i-1,j-wi]}如果j-wi≥0
V[i-1,j],如果j-wi<0
定義初始條件:當(dāng)時(shí)j≥0時(shí),V[0,j]=0;當(dāng)i≥0時(shí),V[i,0]=0
(2)
我們的目標(biāo)是求V[n,w],即一個(gè)給定
4
4.1
貪心法
貪心法的基本思想
貪心法總是作出在當(dāng)前看來最好的選擇,也就是說貪心法并不從整體最優(yōu)考慮,它所作出的選擇只是在某種意義上的局部最優(yōu)選擇。雖然貪心法不能對(duì)所有的問題都得到整體最優(yōu)解,但對(duì)于許多問題它能產(chǎn)生整體最優(yōu)解。在一些情況下,即使貪心法不能得到整體最優(yōu)解,其最終結(jié)果卻是最優(yōu)解的很好近似。
貪心法是一種最直接的設(shè)計(jì)技術(shù),它能應(yīng)用于求解多種問題。這類問題的一般特征是有n個(gè)輸入以及一組約束條件,滿足約束條件的任一輸入的子集稱為可行解,其可行解由這n個(gè)輸入的某個(gè)子集組成。顯然,滿足約束條件的子集可能不止一個(gè),因此,可行解是不唯一的。為了衡量可行解的優(yōu)劣,事先也給出一定的標(biāo)準(zhǔn)。
物品中能夠放進(jìn)承重量為W的背包的子集的最大總價(jià)值,以及最優(yōu)子集本身。
3.3動(dòng)態(tài)規(guī)劃表的設(shè)計(jì)
當(dāng)i,j>0時(shí),為了計(jì)算第i行第j列的單元格V[i,j],我們拿前一行同一列的單元格與vi加上前一行左邊wi列的單元格的和作比較,計(jì)算出兩者的較大值。這個(gè)表格可以一行一行地填,也可以一列一列地填。
表3動(dòng)態(tài)規(guī)劃表
5
5.1
動(dòng)態(tài)規(guī)劃法和貪心法的分析
動(dòng)態(tài)規(guī)劃法的設(shè)計(jì)原理
考慮表1給出的實(shí)例,表4給出了用公式(1)(2)填寫的動(dòng)態(tài)規(guī)劃表。
這些標(biāo)準(zhǔn)一般以函數(shù)的形式給出,這些函數(shù)稱為目標(biāo)函數(shù)?墒鼓繕(biāo)函數(shù)達(dá)到極值(極大或者極。┑目尚薪,稱為最優(yōu)解。對(duì)于其中的某些問題,可用貪心法求解。
動(dòng)態(tài)規(guī)劃是基于遞歸的技術(shù),遞歸算法通常擁有十分簡(jiǎn)單的歸納證明。算法設(shè)計(jì)中一個(gè)十分重要的原理,稱為最優(yōu)化原理:給定一個(gè)最優(yōu)的決策序列,每個(gè)子系列自身必須是最優(yōu)的決策序列。
在動(dòng)態(tài)規(guī)劃算法中,每步所做出的選擇往往依賴于相關(guān)子問題的解。因而,只有在解出相關(guān)子問題后,才能作出選擇。
動(dòng)態(tài)規(guī)劃法通常以自底向上的方式
3.4最優(yōu)解和最優(yōu)子集
因此,最大總價(jià)值為V[4,5]=37美元。可以通過回溯這個(gè)表格單元的計(jì)算過程來求得最優(yōu)子集的組成元素。因?yàn)椋郑郏,5?/p>
4.2用貪心法解0-1背包問題(仍引用表
1的實(shí)例)
(1)以目標(biāo)函數(shù)為度量標(biāo)準(zhǔn)進(jìn)行裝包。物品3(承重量=3,價(jià)值=20美元)效益最大的首先裝包,剩下2個(gè)承重量,再裝入物品4(承重量=2,價(jià)值=15美元)效益
≠V[3,5],物品4以及填滿背包余下5-2=3個(gè)單位承重量的一個(gè)最優(yōu)子集都包括
在最優(yōu)解中。而后者是由元素V[3,3]來表示的。因?yàn)椋郑郏,3]=V[2,3],物品3不是?/p>
算法與語言
解各個(gè)子問題。質(zhì)。問題的最優(yōu)子結(jié)構(gòu)性質(zhì)是該問題可用入背包。依此策略一直進(jìn)行下去,直到背5.2貪心法的基本要素
動(dòng)態(tài)規(guī)劃算法或貪心法求解的關(guān)鍵特征。
包裝滿為止。
5.2.1貪心選擇性質(zhì)
5.3動(dòng)態(tài)規(guī)劃法與貪心法的差異
對(duì)于0-1背包問題,貪心選擇之所以所謂貪心選擇性質(zhì)是指所求問題的
動(dòng)態(tài)規(guī)劃法和貪心法都要求問題具不能得到最優(yōu)解是因?yàn)樵谶@種情況下,它整體最優(yōu)解可以通過一系列局部最優(yōu)的有最優(yōu)子結(jié)構(gòu)性質(zhì),這是兩類算法的一個(gè)無法保證最終能將背包裝滿,部分閑置的選擇,即貪心選擇來達(dá)到。這是貪心法可共同點(diǎn)。但是,對(duì)于具有最優(yōu)子結(jié)構(gòu)的問背包空間使每單位背包空間的價(jià)值降低行的第一個(gè)基本要素,也是貪心法與動(dòng)態(tài)題應(yīng)該選用動(dòng)態(tài)規(guī)劃法還是貪心法求解?了。事實(shí)上,在考慮0-1背包問題時(shí),應(yīng)比規(guī)劃算法的主要區(qū)別。
是否能用動(dòng)態(tài)規(guī)劃算法求解的問題也能較選擇該物品和不選擇該物品所導(dǎo)致的貪心法所做出的貪心選擇可以依賴用貪心法求解?
最終方案,然后再做出最好選擇。由此就于以往所做過的選擇,但決不依賴于將來0-1背包問題與背包問題這兩類問
導(dǎo)出許多互相重疊的子問題。這正是該問所做的選擇,也不依賴于子問題的解。
題都具有最優(yōu)子結(jié)構(gòu)性質(zhì)。對(duì)于0-1背包題可用動(dòng)態(tài)規(guī)劃算法求解的另一重要特貪心法通常以自頂向下的方式進(jìn)行,問題,設(shè)A是能夠裝入容量為W的背包征。實(shí)際上也是如此,動(dòng)態(tài)規(guī)劃算法的確以迭代的方式做出相繼的貪心選擇,每做價(jià)值的物品集合,則Aj=A-{j}是n-1個(gè)物可以有效地解0-1背包問題。
出一次貪心選擇就將所求問題簡(jiǎn)化為規(guī)品1,2,∧,j-1,j+1,∧,n可裝入容量為W-wj動(dòng)態(tài)規(guī)劃法和貪心法的基本區(qū)別在模更小的子問題。
的背包的具有最大價(jià)值的物品集合。對(duì)于于,貪心法僅產(chǎn)生一個(gè)判定序列,而動(dòng)態(tài)對(duì)于一個(gè)具體問題,要確定它是否具背包問題,類似地,若它的一個(gè)最優(yōu)解包規(guī)劃法可能產(chǎn)生許多判定序列,但是按照有貪心選擇性質(zhì),必須證明每一步所作出含物品j,則從該最優(yōu)解中拿出所含的物最優(yōu)原理,包含非局部最優(yōu)的部分序列的的貪心選擇最終導(dǎo)致問題的整體最優(yōu)解。品j的那部分重量w,剩下的將是n-1個(gè)結(jié)果肯定不可能是最優(yōu)的,所以不予考首先考察問題的一個(gè)整體最優(yōu)解,并證明原重物品1,2,∧,j-1,j+1,∧,n以及重為wj-
慮。設(shè)計(jì)貪心法的困難部分就是要證明該可修改這個(gè)最優(yōu)解,使其以貪心選擇開w的物品j中可裝入容量為W-w的背包
算法確實(shí)是求解了它所需要解決的問題。
始。做出貪心選擇后,原問題簡(jiǎn)化為規(guī)模且具有最大價(jià)值的物品。
參考文獻(xiàn):
更小的類似子問題。然后,用數(shù)學(xué)歸納法雖然這兩個(gè)問題極為相似,但背包問證明,通過每一步做貪心選擇,最終可得題可以用貪心法求解,而0-1背包問題卻[1]王曉東.算法設(shè)計(jì)與分析[M].北京:清華大
到問題的整體最優(yōu)解。其中,證明貪心選不能用貪心法求解。用貪心法解背包問題學(xué)出版社,2003.
擇后的問題簡(jiǎn)化為規(guī)模更小的類似子問的基本步驟是:首先計(jì)算每種物品單位重[2]宋文,吳晟,杜亞軍.算法設(shè)計(jì)與分析[M].
重慶:重慶大學(xué)出版社,2002.
題的關(guān)鍵在于利用該問題的最優(yōu)子結(jié)構(gòu)量的價(jià)值vi/wi,然后,依貪心選擇策略,將[3]AnanyLevitin.算法設(shè)計(jì)與分析基礎(chǔ)[M].北
性質(zhì)。
盡可能多的單位重量?jī)r(jià)值最高的物品裝京:清華大學(xué)出版社,2004.
5.2.2最優(yōu)子結(jié)構(gòu)性質(zhì)
入背包。若將這種物品全部裝入背包后,[4]盧開澄.計(jì)算機(jī)算法導(dǎo)引—設(shè)計(jì)與分析[M].
當(dāng)一個(gè)問題的最優(yōu)解包含其子問題
背包內(nèi)的物品總重量未超過W,則選擇單北京:清華大學(xué)出版社,2003.
的最優(yōu)解時(shí),稱此問題具有最優(yōu)子結(jié)構(gòu)性
位重量?jī)r(jià)值次高的物品并盡可能多地裝
(責(zé)任編輯:曙光)
Solving0-1KnapsackProblemsbyDynamicProgrammingMethodandGreedyMethod
TANGMin,LIUGuan-rong1,DENGGuo-qiang2
(1.SchoolofComputerScienceandTechnology,WuhanUniversityofTechnology,Wuhan430070,China;
2.SchoolofNatureScience,WuhanUniversityofTechndogy,Wuhan430070,China)
Abstract:0-1knapsackproblemsandknapsackproblemsareaclassicalNPhardproblems.Thispaperadoptsdynamicprogrammingmethodandgreedymethodtosolvesuchproblems,thenanalyzesandcomparesthedifferencesoftwoalgo-rithms.
Keywords:0-1knapsackproblems;knapsackproblems;dynamicprogrammingmethod;greedymethod
月號(hào)113
【用動(dòng)態(tài)規(guī)劃法和貪心法解決背包問題】相關(guān)文章:
用智慧解決問題作文08-10
教案:用除法解決問題04-24
《用除法解決實(shí)際問題》教案03-04
用比例解決問題教學(xué)反思04-22
用連乘解決問題教學(xué)反思04-22
用新理念解決政工新問題04-26
8和9解決問題課后反思04-12