高級算法題目,動態規劃解

標籤(空格分隔): 高級算法,動態規劃


consider the following optimization problem.

Instance: n positive integers x1<x2<<xn .

Find two disjoint nonempty subsets A,B{1,2,,n} with iAxiiBxi ,such that the ratio iAxiiBxi 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,使得
iAxi+kAiBxi+kB ,such that the ratio iAxi+kAiBxi+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(n1,kA,kB)
2. xn 在最優解OPT(n,kA,kB) 中,此時又有兩種情況
2.1 xnA
此時可以認爲A 中有xn 的情況下,求前n1 個數的原問題的最優解,此時
OPT(n,kA,kB) =OPT(n1,kA+xn,kB)
2.2 xnB
此時可以認爲A 中有xn 的情況下,求前n1 個數的原問題的最優解,此時
OPT(n,kA,kB) =OPT(n1,kA,kB+xn)
綜上可以認爲:
OPT(n,kA,kB) =min{OPT(n1,kA,kB),OPT(n1,kA+xn,kB),OPT(n1,kA,kB+xn)}
這就是該問題的遞推式.
原問題的答案的形式爲OPT(n,0,0) ,根據動態規劃求得該式子即爲解

算法複雜度爲O(nnixinixi)

下面給出FPTAS
xi=xik ,其中k=ϵxmaxn ,此時算法複雜度爲nnxmaxknxmaxk=n5ϵ2

總結

  1. 本質上動態規劃就是把某個遞推公式從前向後展開。所以用動態規劃做,第一件事就是要寫出遞推公式。
  2. 而遞推的含義本質上就是先計算出規模更小的問題,然後用規模更小的問題解決規模更大的問題。
  3. 分情況討論的方法很容易產生遞推式.
  4. 遞推產生的問題可能比原問題複雜,原問題是新問題的子集

附 對揹包問題動態規劃的理解

OPT(n,c) 爲有n個物體,揹包容量爲c時的最佳解決方案。
很容易產生遞推式,分情況討論:
1.最後一個物體在OPT(n,c) 中。即在我們找到的揹包問題最佳方案中,最後一個物體被選中,裝進了揹包裏
那麼此時,我們只需要解決 前n-1個物體在揹包已經裝了第n個物體時,應當怎麼選擇使得價值最大 這個問題。此時揹包容量只有cc(n) ,而這個問題就是OPT(n1,cc(n))c(n) 指最後一個物體的容量
2.最後一個物體不在OPT(n,c) 中。也就是最佳解決方案並沒有選擇最後一個物體.
此時,OPT(n,c)=OPT(n1,c)

綜上,OPT(n,c)=min{OPT(n1,cc(n)),OPT(n1,c)}
所以一個很簡單的分類討論,就可以寫出遞推式。
然後用動態規劃寫出遞歸函數的展開形式,就是揹包問題的動態規劃方法.

而我在試圖通過分類討論寫出上面問題的遞推式時,發現必須要解決帶kA,kB 的更復雜的問題。而原問題是新問題的一個子集。所以很容易通過分類討論將原問題擴展到更復雜的新問題。

這不經讓我想到數理邏輯中證明完全性定理時的情形。有時候要解決問題A,必須首先將問題A擴充爲問題B,問題A是問題B的一個子集。然後解決問題B.幾何裏的輔助線,羣裏的羣作用思想不也是同樣的思想嗎。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章