標籤(空格分隔): 高級算法,動態規劃
consider the following optimization problem.
Instance: n positive integers x1<x2<⋯<xn .
Find two disjoint nonempty subsets A,B⊂{1,2,…,n} with ∑i∈Axi≥∑i∈Bxi ,such that the ratio ∑i∈Axi∑i∈Bxi is minimized.
Give a pseudo-polynomial time algorithm for the problem, and then give an FPTAS for the problem based on the pseudo-polynomial time algorithm.
解:
將原問題擴展爲在A已經有kA ,B已經有kB 值的情況下,選擇two disjoint nonempty subsets,使得
∑i∈Axi+kA≥∑i∈Bxi+kB ,such that the ratio ∑i∈Axi+kA∑i∈Bxi+kB is minimized.
可以看的出來變化後的問題比原問題複雜.而原問題就是kA,kB=0 的情況
在該問題上很容易寫出遞推式.
有n個整數x1<x2<⋯<xn ,所以在n上遞推.記OPT(i,kA,kB) 爲有前i 個整數,且A已經有kA ,B已經有kB 值的情況下的選擇的最優解
對問題解OPT(n,kA,kB) 做遞推關係推導,分情況討論。
1. xn 不在最優解OPT(n,kA,kB) 中
此時OPT(n,kA,kB) =OPT(n−1,kA,kB)
2. xn 在最優解OPT(n,kA,kB) 中,此時又有兩種情況
2.1 xn 在A 中
此時可以認爲A 中有xn 的情況下,求前n−1 個數的原問題的最優解,此時
OPT(n,kA,kB) =OPT(n−1,kA+xn,kB)
2.2 xn 在B 中
此時可以認爲A 中有xn 的情況下,求前n−1 個數的原問題的最優解,此時
OPT(n,kA,kB) =OPT(n−1,kA,kB+xn)
綜上可以認爲:
OPT(n,kA,kB) =min{OPT(n−1,kA,kB),OPT(n−1,kA+xn,kB),OPT(n−1,kA,kB+xn)}
這就是該問題的遞推式.
原問題的答案的形式爲OPT(n,0,0) ,根據動態規劃求得該式子即爲解
算法複雜度爲O(n∗∑nixi∗∑nixi)
下面給出FPTAS
令x′i=xik ,其中k=⌊ϵ∗xmaxn⌋ ,此時算法複雜度爲n∗n∗xmaxk∗n∗xmaxk=n5ϵ2
總結
- 本質上動態規劃就是把某個遞推公式從前向後展開。所以用動態規劃做,第一件事就是要寫出遞推公式。
- 而遞推的含義本質上就是先計算出規模更小的問題,然後用規模更小的問題解決規模更大的問題。
- 分情況討論的方法很容易產生遞推式.
- 遞推產生的問題可能比原問題複雜,原問題是新問題的子集
附 對揹包問題動態規劃的理解
記OPT(n,c) 爲有n個物體,揹包容量爲c時的最佳解決方案。
很容易產生遞推式,分情況討論:
1.最後一個物體在OPT(n,c) 中。即在我們找到的揹包問題最佳方案中,最後一個物體被選中,裝進了揹包裏
那麼此時,我們只需要解決 前n-1個物體在揹包已經裝了第n個物體時,應當怎麼選擇使得價值最大 這個問題。此時揹包容量只有c−c(n) ,而這個問題就是OPT(n−1,c−c(n)) 。c(n) 指最後一個物體的容量
2.最後一個物體不在OPT(n,c) 中。也就是最佳解決方案並沒有選擇最後一個物體.
此時,OPT(n,c)=OPT(n−1,c)
綜上,OPT(n,c)=min{OPT(n−1,c−c(n)),OPT(n−1,c)}
所以一個很簡單的分類討論,就可以寫出遞推式。
然後用動態規劃寫出遞歸函數的展開形式,就是揹包問題的動態規劃方法.
而我在試圖通過分類討論寫出上面問題的遞推式時,發現必須要解決帶kA,kB 的更復雜的問題。而原問題是新問題的一個子集。所以很容易通過分類討論將原問題擴展到更復雜的新問題。
這不經讓我想到數理邏輯中證明完全性定理時的情形。有時候要解決問題A,必須首先將問題A擴充爲問題B,問題A是問題B的一個子集。然後解決問題B.幾何裏的輔助線,羣裏的羣作用思想不也是同樣的思想嗎。