背包问题的多项式时间近似解
背包問題的多項式時間近似解
- 一些概念
- 背包問題的偽多項式時間算法
- 強NP難問題和FPTAS
一些概念
- ∏\prod∏ 是一個NP難問題的優化問題
- f∏f_{\prod}f∏? 是這個優化問題的目標函數,也就是我們要優化得到的近似解
- I 是問題實例
- ?\epsilon? 是錯誤參數,我們得到的近似算法,有下面的性質
- 如果ΠΠΠ是一個最小化問題,則fΠf_ΠfΠ?(I,s)≤(1 +ε)· OPT。
- 如果ΠΠΠ是一個最大化問題,則fΠf_ΠfΠ?(I,s)≥(1-ε)· OPT。
PTAS:Polynomial-Time Approximation Scheme ,多項式時間的近似模式,對于任意一個整數ε,這個模式的執行時間不超過問題實例規模n的多項式。這個多項式能隨著?\epsilon?的減小而增長得十分迅速。如O(n2?)O(n^{\frac{2}{\epsilon}})O(n?2?)
FPTAS:Fully Polynomial-Time Approximation Scheme,完全多項式時間的近似模式,由于PTAS中,多項式時間受到?\epsilon?的約束是任意的,那么,這個多項式可能增長得很快,因此,我們希望多項式受到的約束是1?\frac{1}{\epsilon}?1?的,這樣多項式的增長就不會因為?\epsilon?的變化而增長得很快。如本文中講提到的背包問題的近似算法的時間復雜度為O(n3?)O(\frac{n^3}{\epsilon})O(?n3?)
【下面這部分是來自別的博客,因此放上圖片】
【這一部分其實沒有特別好的理解】
在下文中,我們能將以III來作為實例的輸入規模,IuI_uIu?保存這些二進制數據的一元形式。(IuI_uIu? will denote instance I with all numbers occurring in it written in unary. The unary size of instance III, denoted ∣Iu∣|I_u|∣Iu?∣, is defined as the number of bits needed to write IuI_uIu?.)
問題Π的算法,在實例III的運行時間受| IuI_uIu? |中的多項式限制 將被稱為偽多項式時間算法
背包問題是NP難的問題,沒有多項式時間算法,但是有偽多項式時間算法, 這個算法是基于動態規劃的。
背包問題的偽多項式時間算法
偽多項式算法大多采用的是動態規劃的方式,因此,我們可以通過一個背包問題的例子來了解。
動態規劃的主要方式就是采用bellman-fold方程,這個方程的主要思想就是遞歸。下面是最優子結構的思想。
1.當前的物品是i,容量為j,如果物品的重量WiW_iWi?>j,那么放不下,f(i,j)=f(i-1,j)。這個式子表示,往回看重量更輕的物品,容量不改變(因為本輪沒有放入物品)
2.放得下,那么,是放入這個物品好呢,還是不放,留這個空間好呢?
所以進行遞歸調用操作,計算兩種結果,首先是不放這個物品,留下空間,那么就是f(i-1,j);其次,放下物品,那么對應要加上這個物品的價值,可存放物品數i-1,容量j也要減掉對應物品的重量WiW_iWi?。也就是式子vi+f(i?1,j?wi)v_i+f(i-1,j-w_i)vi?+f(i?1,j?wi?).這兩種情況取一個max,要這兩種情況下獲利最大的。
3.如果可以放入的物品i=0,或者容量為0,那么就無法放入物品了,當前的f(i,j)=0。
遞歸是自頂向下的構造方式,如果每一次的計算都要遞歸的話,會重復計算多次,所以,如果我們可以自底向上做。就是,先構造一個表,表里對應著每一個f(i,j)的最優值,那么,做到后面的時候,只需要查前面的表就可以。
構造出來的最優值表是這樣的(四個物品,可以承受的總重j為5)
對應的最優子結構是這樣的
比如對于f(4,5)來說,就是需要max{f(3,5),13+f(3,1))}.根據f表中元素可知,f(3,5)=22,13+f(3,1)=13+6=19,因此選擇了f(3,5)。其余類似。
這個算法需要填的表的大小是n×V,其中V=∑i=1nvi∑^n_{i=1}v_i∑i=1n?vi?,因此這個算法時間復雜度是O(n×V).
這個動態規劃算法中,得到的時間復雜度O(nV)n是頂點數,V為容量。其中只有V不是多項式相關的,那么,如果我們做一個簡化,讓V變成多項式相關的,這個算法就變成了多項式算法了。
令vi^=?viK?\widehat{v_i}=\lfloor\frac{v_i}{K}\rfloorvi??=?Kvi???
其中,K為偽多項式的V轉換成多項式算法的vi^\widehat{v_i}vi??的關鍵,下面的主要部分是在求K的表達式
利用動態規劃算法求出這個新集合vi^\widehat{v_i}vi??的收益最大的集合S^\widehat{S}S 假設opt最優的集合為OOO[注意這個O是對于背包問題的最優]
有∑i∈S^vi^≥∑i∈Ovi^\sum_{i\in\widehat{S}}\widehat{v_i}\ge\sum_{i\in O}\widehat{v_i} i∈S∑?vi??≥i∈O∑?vi??
右式的含義是,在之前經過動態規劃可以得到的最優解中的那些物品i,每個i的價值viv_ivi?都經過運算vi^=?viK?\widehat{v_i}=\lfloor\frac{v_i}{K}\rfloorvi??=?Kvi???然后把這些加起來。
兩邊乘上K
K?∑i∈S^vi^≥K?∑i∈Ovi^K*\sum_{i\in\widehat{S}}\widehat{v_i}\ge K*\sum_{i\in O}\widehat{v_i} K?i∈S∑?vi??≥K?i∈O∑?vi??
因為?viK?≥viK?1\lfloor\frac{v_i}{K}\rfloor\ge\frac{v_i}{K}-1 ?Kvi???≥Kvi???1
兩邊乘上K,有K??viK?≥vi?KK*\lfloor\frac{v_i}{K}\rfloor\ge v_i-K K??Kvi???≥vi??K
有
sol=K?∑i∈S^vi^=∑i∈S^K?vi^≥∑i∈O(vi?K)≥opt?nKsol=K*\sum_{i\in\widehat{S}}\widehat{v_i}=\sum_{i\in\widehat{S}}K*\widehat{v_i}\ge\sum_{i\in O}(v_i-K)\ge opt-nK sol=K?i∈S∑?vi??=i∈S∑?K?vi??≥i∈O∑?(vi??K)≥opt?nK
最后一個不等式成立的原因,是把∑\sum∑符號打開,∑i∈Ovi=opt,∑i∈OK<=nK\sum_{i\in O}{v_i}=opt,\sum_{i\in O}K<=nK∑i∈O?vi?=opt,∑i∈O?K<=nK
如果我們想(下為所需證)(sol我猜是solution的縮寫,此處意為多項式時間近似算法)
solopt≥1??\frac{sol}{opt}\ge1-\epsilon optsol?≥1??
然后
opt?nKopt≥1??\frac{opt-nK}{opt}\ge1-\epsilon optopt?nK?≥1??
左邊有個optopt\frac{opt}{opt}optopt?,可以化成1和右邊抵消,再去掉負號后可以得到下面的式子
然后就有
n?Kopt≤?\frac{n*K}{opt}\le\epsilon optn?K?≤?
我們只需要找到opt的最小值即可。
那么opt顯然是大于能放進這個背包中的物體中最大的那一個價值的。
記為P
那么就可以得到K
K=??pnK=\frac{\epsilon*p}{n} K=n??p?
下面再來分析一下這個多項式時間算法的時間復雜度
∑i∈Svi^=∑i∈S?viK?<?∑i∈Svik?\sum_{i\in S}\widehat{v_i}=\sum_{i\in S}\lfloor\frac{v_i}{K}\rfloor<\lfloor\sum_{i\in S}\frac{v_i}{k}\rfloor i∈S∑?vi??=i∈S∑??Kvi???<?i∈S∑?kvi???
?∑i∈Svik?=?∑i∈Svi?n??p?\lfloor\sum_{i\in S}\frac{v_i}{k}\rfloor=\lfloor\sum_{i\in S}\frac{v_i*n}{\epsilon*p}\rfloor ?i∈S∑?kvi???=?i∈S∑???pvi??n??
并且有
∑i∈SviP<n\sum_{i \in S }\frac{v_i}{P}<n i∈S∑?Pvi??<n
然后就有
v^<n?n?\widehat{v}<n*\frac{n}{\epsilon} v<n??n?
因為偽多項式算法為O(nV),對于V做了處理之后用v^\widehat{v}v來代替V,再根據上式,可以得到多項式時間算法為O(n3?)\frac{n^3}{\epsilon})?n3?)
強NP難問題和FPTAS
強np難問題(Strong NP-hard)
如果NP中的每個問題都可以以一種像是之前背包問題中簡化實例中的數字始終以一元形式寫入的方式,由多項式簡化為Π,那么我們說問題Π是強NP-難的。
A problem Π is stronglyNPNPNP-hard if every problem in NPNPNP can be polynomially reduced to Π in such a way that numbers in the reduced instance are always written in unary.
大多數已知的NP難問題都是強NP難的,強NP難問題在P≠NP的前提下沒有偽多項式時間算法,背包問題不是強NP難的(因為有偽多項式時間算法)
可以用FPTAS近似的算法一定有偽多項式時間算法
設p為多項式,Π為NP難的最小化問題,如:目標函數fΠ是整數值,并且對于任一實例I,由OPT(I)<p(| IuI_uIu? |)(含|IuI_uIu?|的多項式)。 如果Π承認FPTAS,則它也承認偽多項式時間算法。
假設有一個Π問題的FPTAS,其實例I上的運行時間和誤差參數ε是q(| I |,1/?),其中q是多項式。在實例I上,將錯誤參數設置為?=1p∣Iu∣\epsilon=\frac{1}{p|I_u|}?=p∣Iu?∣1?,然后運行FPTAS。 現在,產生的解將的目標函數值小于或等于:
(1+ε)OPT(I)<OPT(I)+εp(∣Iu∣)=OPT(I)+1.(1 + ε)OPT(I) < OPT(I) + εp(|I_u|) = OPT(I)+1. (1+ε)OPT(I)<OPT(I)+εp(∣Iu?∣)=OPT(I)+1.
其中,OPT(I)<p(∣Iu∣)OPT(I)<p(|I_u|)OPT(I)<p(∣Iu?∣)這個式子應該是題目給出來前提條件,可以理解為,P是多項式,IuI_uIu?是點實例I所有數字一元形式,比如背包問題中的價值viv_ivi?,p(|IuI_uIu?|)就是一元形式的多項式,[大概類比一下背包問題中的最優解和近似最優解,最優解肯定是小于近似最優解的]
實際上,使用此錯誤參數,FPTAS將被迫產生最優解。 運行時間將為q(| I |,p(| IuI_uIu? |)),即多項式在| IuI_uIu? |上。 因此,我們獲得了針對Π的偽多項式時間算法。以下推論適用于大多數已知的NP難題。推論8.6令Π是滿足定理8.5的限制。 如果Π是強NP難的,那么在假設P≠NP的前提下不承認FPTAS算法。
如果Π接受FPTAS,那么根據8.5,它就承認偽多項式時間定理,但他不是強NP-難的,在假設P≠NP,導致矛盾。
總結:強NP難問題沒有偽多項式時間算法,根據之前所說偽多項式時間算法大多是采用動態規劃而得來的,因此強NP難問題不能采用動態規劃得到偽多項式算法。有了偽多項式時間算法,才可以使用FPTAS來進行近似,得到一個近似算法。
總結
以上是生活随笔為你收集整理的背包问题的多项式时间近似解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: phpweb后台拿shell简单方法
- 下一篇: 驾照考试记录--东方时尚版本 考试后总结