本文介紹了動態規劃的基本思想和基本步驟,經過實例研究了利用動態規劃設計算法的具體途徑,討論了動態規劃的一些實現技巧,並將動態規劃和其餘一些算法做了比較,最後還簡單介紹了動態規劃的數學理論基礎和當前最新的研究成果。html
引言——由一個問題引出的算法算法
考慮如下問題express
現有一張地圖,各結點表明城市,兩結點間連線表明道路,線上數字表示城市間的距離。如圖1所示,試找出從結點A到結點E的最短距離。網絡
圖 1數據結構
咱們能夠用深度優先搜索法來解決此問題,該問題的遞歸式爲app
其中是與v相鄰的節點的集合,w(v,u)表示從v到u的邊的長度。框架
具體算法以下:ide
function MinDistance(v):integer;函數
begin
if v=E then return 0
else
begin
min:=maxint;
for 全部沒有訪問過的節點i do
if v和i相鄰 then
begin
標記i訪問過了;
t:=v到i的距離+MinDistance(i);
標記i未訪問過;
if t<min then min=t;
end;
end;
end;
開始時標記全部的頂點未訪問過,MinDistance(A)就是從A到E的最短距離。
這個程序的效率如何呢?咱們能夠看到,每次除了已經訪問過的城市外,其餘城市都要訪問,因此時間複雜度爲O(n!),這是一個「指數級」的算法,那麼,還有沒有更好的算法呢?
首先,咱們來觀察一下這個算法。在求從B1到E的最短距離的時候,先求出從C2到E的最短距離;而在求從B2到E的最短距離的時候,又求了一遍從 C2到E的最短距離。也就是說,從C2到E的最短距離咱們求了兩遍。一樣能夠發現,在求從C一、C2到E的最短距離的過程當中,從D1到E的最短距離也被求 了兩遍。而在整個程序中,從D1到E的最短距離被求了四遍。若是在求解的過程當中,同時將求得的最短距離"記錄在案",隨時調用,就能夠避免這種狀況。於 是,能夠改進該算法,將每次求出的從v到E的最短距離記錄下來,在算法中遞歸地求MinDistance(v)時先檢查之前是否已經求過了 MinDistance(v),若是求過了則不用從新求一遍,只要查找之前的記錄就能夠了。這樣,因爲全部的點有n個,所以不一樣的狀態數目有n個,該算法 的數量級爲O(n)。
更進一步,能夠將這種遞歸改成遞推,這樣能夠減小遞歸調用的開銷。
請看圖1,能夠發現,A只和Bi相鄰,Bi只和Ci相鄰,...,依此類推。這樣,咱們能夠將原問題的解決過程劃分爲4個階段,設S1={A},S2={B1,B2},S3={C1,C2,C3,C4},S4={D1,D2,D3},Fk(u)表示從Sk中的點u到E的最短距離,則
而且有邊界條件
顯然能夠遞推地求出F1(A),也就是從A到E的最短距離。這種算法的複雜度爲O(n),由於全部的狀態總數(節點總數)爲n,對每一個狀態都只要遍歷一次,並且程序很簡潔。
具體算法以下:
procedure DynamicProgramming;
begin
F5[E]:=0;
for i:=4 downto 1 do
for each u ∈Sk do
begin
Fk[u]:=無窮大;
for each v∈Sk+1∩δ(u) do
if Fk[u]>w(u,v)+Fk+1[v] then Fk[u]:=w(u,v)+Fk+1[v];
end;
輸出F1[A];
end;
這種高效算法,就是動態規劃算法。
動態規劃的基本概念
動態規劃的發展及研究內容
動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決策過程(multistep decision process)的優化問題時,提出了著名的最優化原理(principle of optimality),把多階段過程轉化爲一系列單階段問題,逐個求解,創立了解決這類過程優化問題的新方法——動態規劃。1957年出版了他的名著Dynamic Programming,這是該領域的第一本著做。
動態規劃問世以來,在經濟管理、生產調度、工程技術和最優控制等方面獲得了普遍的應用。例如最短路線、庫存管理、資源分配、設備更新、排序、裝載等問題,用動態規劃方法比用其它方法求解更爲方便。
雖然動態規劃主要用於求解以時間劃分階段的動態過程的優化問題,可是一些與時間無關的靜態規劃(如線性規劃、非線性規劃),只要人爲地引進時間因素,把它視爲多階段決策過程,也能夠用動態規劃方法方便地求解。
多階段決策問題
多階段決策過程,是指這樣的一類特殊的活動過程,問題能夠按時間順序分解成若干相互聯繫的階段,在每個階段都要作出決策,所有過程的決策是一個決策序列。要使整個活動的整體效果達到最優的問題,稱爲多階段決策問題。
例1是一個多階段決策問題的例子,下面是另外一個多階段決策問題的例子:
工廠生產某種產品,每單位(千件)的成本爲1(千元),每次開工的固定成本爲3(千元),工廠每季度的最大生產能力爲6(千件)。經調查,市場 對該產品的需求量第1、2、3、四季度分別爲 2,3,2,4(千件)。若是工廠在第1、二季度將整年的需求都生產出來,天然能夠下降成本(少付固定成本費),可是對於第3、四季度才能上市的產品需付 存儲費,每季每千件的存儲費爲0.5(千元)。還規定年初和年底這種產品均無庫存。試製訂一個生產計劃,即安排每一個季度的產量,使一年的總費用(生產成本 和存儲費)最少。
決策過程的分類
根據過程的時間變量是離散的仍是連續的,分爲離散時間決策過程(discrete-time decision process),即多階段決策過程和連續時間決策過程(continuous-time decision process);根據過程的演變是肯定的仍是隨機的,分爲肯定性決策過程(deterministic decision process)和隨機性決策過程(stochastic decision process),其中應用最廣的是肯定性多階段決策過程。
動態規劃模型的基本要素
一個多階段決策過程最優化問題的動態規劃模型一般包含如下要素:
1.階段
階段(step)是對整個過程的天然劃分。一般根據時間順序或空間特徵來劃分階段,以便按階段的次序解優化問題。階段變量通常用k=1,2,..,n表示。在例1中由A出發爲k=1,由Bi(i=1,2)出發爲k=2,依此下去從Di(i=1,2,3)出發爲k=4,共n=4個階段。在例2中按照第1、2、3、四季度分爲k=1,2,3,4,共4個階段。
2.狀態
狀態(state)表示每一個階段開始時過程所處的天然情況。它應該可以描述過程的特徵而且具備無後向性,即當某階段的狀態給定時,這個階段之後過程的演變與該階段之前各階段的狀態無關,即每一個狀態都是過去歷史的一個完整總結。一般還要求狀態是直接或間接能夠觀測的。
描述狀態的變量稱狀態變量(state variable)。變量容許取值的範圍稱容許狀態集合(set of admissible states)。用xk表示第k階段的狀態變量,它能夠是一個數或一個向量。用Xk表示第k階段的容許狀態集合。在例1中x2可取B1,B2,X2={B1,B2}。
n個階段的決策過程有n+1個狀態變量,xn+1表示xn演變的結果,在例1中x5取E。
根據過程演變的具體狀況,狀態變量能夠是離散的或連續的。爲了計算的方便有時將連續變量離散化;爲了分析的方便有時又將離散變量視爲連續的。
狀態變量簡稱爲狀態。
3.決策
當一個階段的狀態肯定後,能夠做出各類選擇從而演變到下一階段的某個狀態,這種選擇手段稱爲決策(decision),在最優控制問題中也稱爲控制(control)。
描述決策的變量稱決策變量(decision variable)。變量容許取值的範圍稱容許決策集合(set of admissible decisions)。用uk(xk)表示第k階段處於狀態xk時的決策變量,它是xk的函數,用Uk(xk)表示了xk的容許決策集合。在例1中u2(B1)可取C1,C2,C3。
決策變量簡稱決策。
4.策略
決策組成的序列稱爲策略(policy)。由初始狀態x1開始的全過程的策略記做p1n(x1),即p1n(x1)={u1(x1),u2(x2),...,un(xn)}。由第k階段的狀態xk開始到終止狀態的後部子過程的策略記做pkn(xk),即pkn(xk)={uk(xk),uk+1(xk+1),...,un(xn)}。相似地,由第k到第j階段的子過程的策略記做pkj(xk)={uk(xk),uk+1(xk+1),...,uj(xj)}。對於每個階段k的某一給定的狀態xk,可供選擇的策略pkj(xk)有必定的範圍,稱爲容許策略集合(set of admissible policies),用P1n(x1),Pkn(xk),Pkj(xk)表示。
5.狀態轉移方程
在肯定性過程當中,一旦某階段的狀態和決策爲已知,下階段的狀態便徹底肯定。用狀態轉移方程(equation of state)表示這種演變規律,寫做
在例1中狀態轉移方程爲:xk+1=uk(xk)
6.指標函數和最優值函數
指標函數(objective function)是衡量過程優劣的數量指標,它是關於策略的數量函數,從階段k到階段n的指標函數用Vkn(xk,pkn(xk))表示,k=1,2,...,n。
可以用動態規劃解決的問題的指標函數應具備可分離性,即Vkn可表爲xk,uk,Vk+1 n 的函數,記爲:
其中函數是一個關於變量Vk+1 n單調遞增的函數。這一性質保證了最優化原理(principle of optimality)的成立,是動態規劃的適用前提。
過程在第j 階段的階段指標取決於狀態xj和決策uj,用vj(xj,uj)表示。階段k到階段n的指標由vj(j=k,k+1,..n)組成,常見的形式有:
階段指標之和,即
階段指標之積,即
階段指標之極大(或極小),即
這些形式下第k到第j階段子過程的指標函數爲Vkj(xk,uk,xk+1,...,xj+1)。能夠發現,上述(3)-(5)三個指標函數的形式都知足最優性原理。在例1中指標函數爲(3)的形式,其中vj(xj,uj)是邊<xj,uj(xj)>的權(邊的長度),uj(xj)表示從xj出發根據決策uj(xj)下一步所到達的節點。
根據狀態轉移方程,指標函數Vkn還能夠表示爲狀態xk和策略pkn的函數,即Vkn(xk,pkn)。在xk給定時指標函數Vkn對pkn的最優值稱爲最優值函數(optimal value function),記做fk(xk),即
其中opt可根據具體狀況取max或min。上式的意義是,對於某個階段k的某個狀態xk,從該階段k到最終目標階段n的最優指標函數值等於從xk出發取遍全部能策略pkn所獲得的最優指標值中最優的一個。
7.最優策略和最優軌線
使指標函數Vkn達到最優值的策略是從k開始的後部子過程的最優策略,記做pkn*={uk*,..un*},p1n*又是全過程的最優策略,簡稱最優策略(optimal policy)。從初始狀態x1(=x1*)出發,過程按照p1n*和狀態轉移方程演變所經歷的狀態序列{x1*,x2*,..,xn+1*}稱最優軌線(optimal trajectory)。
動態規劃的基本定理和基本方程
動態規劃發展的早期階段,從簡單邏輯出發給出了所謂最優性原理,而後在最優策略存在的前提下導出基本方程,再由這個方程求解最優策略。後來在動態規劃的應用過程當中發現,最優性原理不是對任何決策過程廣泛成立,它與基本方程不是無條件等價,兩者之間也不存在任何肯定的蘊含關係。基本方程在動態規劃中起着更爲本質的做用。
對於初始狀態x1∈X1,策略p1n*={u1*,..un*}是最優策略的充要條件是對於任意的k,1<k<=n,有
[推論]
若p1n*∈P1n(x1)是最優策略,則對於任意的k,1<k<n,它的子策略pkn*對於由x1和p1,k-1*肯定的以xk*爲起點的第k到n後部子過程而言,也是最優策略。
上述推論稱爲最優化原理,它給出了最優策略的必要條件,一般略述爲:不論過去的狀態和決策如何,對於前面的決策造成的當前的狀態而言,餘下的各個決策一定構成最優策略。
根據基本定理的推論能夠獲得動態規劃的基本方程:
其中是決策過程的終端條件,爲一個已知函數。當xn+1只取固定的狀態時稱固定終端;當xn+1可在終端集合Xn+1中變更時稱自由終端。最終要求的最優指標函數知足(10)式:
(9)式是一個遞歸公式,若是目標狀態肯定,固然能夠直接利用該公式遞歸求出最優值(這種遞歸方法將在後文介紹,稱做備忘錄法),可是通常在實際應用中咱們一般將該遞歸公式改成遞推公式求解,這樣通常效率會更高一些。
動態規劃的適用條件
任何思想方法都有必定的侷限性,超出了特定條件,它就失去了做用。一樣,動態規劃也並非萬能的。適用動態規劃的問題必須知足最優化原理和無後效性。
最優化原理可這樣闡述:一個最優化策略具備這樣的性質,不論過去狀態和決策如何,對前面的決策所造成的狀態而言,餘下的諸決策必須構成最優策略。簡而言之,一個最優化策略的子策略老是最優的。一個問題知足最優化原理又稱其具備最優子結構性質。
圖2
例如圖2中,若路線I和J是A到C的最優路徑,則根據最優化原理,路線J必是從B到C的最優路線。這可用反證法證實:假設有另外一路徑J'是B到C的最優路徑,則A到C的路線取I和J'比I和J更優,矛盾。從而證實J'必是B到C的最優路徑。
最優化原理是動態規劃的基礎,任何問題,若是失去了最優化原理的支持,就不可能用動態規劃方法計算。動態規劃的最優化理在其指標函數的可分離性和單調性中獲得體現。根據最優化原理導出的動態規劃基本方程是解決一切動態規劃問題的基本方法。
能夠看出,例1是知足最優化原理的。
將各階段按照必定的次序排列好以後,對於某個給定的階段狀態,它之前各階段的狀態沒法直接影響它將來的決策,而只能經過當前的這個狀態。換句話說,每一個狀態都是過去歷史的一個完整總結。這就是無後向性,又稱爲無後效性。
若是用前面的記號來描述無後向性,就是:對於肯定的xk,不管p1,k-1如何,最優子策略pkn*是惟一肯定的,這種性質稱爲無後向性。
[例3] Bitonic旅行路線問題
歐幾里德貨郎擔問題是對平面給定的n個點肯定一條連結各點的、閉合的最短遊歷路線問題。圖3(a)給出了七個點問題的解。Bitonic旅行路線問題是歐幾里德貨郎擔問題的簡化,這種旅行路線先從最左邊開始,嚴格地由左至右到最右邊的點,而後再嚴格地由右至左到出發點,求路程最短的路徑長度。圖3(b)給出了七個點問題的解。
圖3
這兩個問題看起來很類似。但實質上是不一樣的。爲了方便討論,我將每一個頂點標記了號碼。因爲必然通過最右邊的頂點7,因此一條路(P1-P2)能夠看 成兩條路(P1-7)與(P2-7)的結合。因此,這個問題的狀態能夠用兩條道路結合的形式表示。咱們能夠把這些狀態中,兩條路中起始頂點相同的狀態歸於 一個階段,設爲階段[P1,P2]。
那麼,對於Bitonic旅行路線問題來講,階段[P1,P2]若是能夠由階段[Q1,Q2]推出,則必須知足的條件就是:P1<Q1或 P2<Q2。例如,階段[3,4]中的道路能夠由階段[3,5]中的道路加一條邊4-5得出,而階段[3,5]的狀態卻沒法由階段[3,4]中的狀 態得出,由於Bitonic旅行路線要求必須嚴格地由左到右來旅行。因此若是咱們已經知道了階段[3,4]中的狀態,則階段[3,5]中的狀態必然已知。 所以咱們能夠說,Bitonic問題知足無後向性,能夠用動態規劃來解決。
有些問題乍一看好像有後向性,但若是按照某種合理的方式從新劃分階段,就能夠發現其本質上是無後向性的,因此關鍵是階段的合理劃分,這一點將在動態規劃的技巧中詳細闡述。
在例1中咱們看到,動態規劃將原來具備指數級複雜度的搜索算法改進成了具備多項式時間的算法。其中的關鍵在於解決冗餘,這是動態規劃算法的根本目的。動態規劃實質上是一種以空間換時間的技術,它在實現的過程當中,不得不存儲產生過程當中的各類狀態,因此它的空間複雜度要大於其它的算法。以Bitonic旅行路線問題爲例,這個問題也能夠用搜索算法來解決。動態規劃的時間複雜度爲O(n2),搜索算法的時間複雜度爲O(n!) ,但從空間複雜度來看,動態規劃算法爲O(n2),而搜索算法爲O(n),搜索算法反而優於動態規劃算法。選擇動態規劃算法是由於動態規劃算法在空間上能夠承受,而搜索算法在時間上卻沒法承受,因此咱們舍空間而取時間。
設原問題的規模爲n,容易看出,當子問題樹中的子問題總數是n的超多項式函數,而不一樣的子問題數只是n的多項式函數時,動態規劃法顯得特別有意義,此時動態規劃法具備線性時間複雜性。因此,可以用動態規劃解決的問題還有一個顯著特徵:子問題的重疊性。這個性質並非動態規劃適用的必要條件,可是若是該性質沒法知足,動態規劃算法同其餘算法相比就不具有優點。
動態規劃的基本思想
前文主要介紹了動態規劃的一些理論依據,咱們將前文所說的具備明顯的階段劃分和狀態轉移方程的動態規劃稱爲標準動態規劃, 這種標準動態規劃是在研究多階段決策問題時推導出來的,具備嚴格的數學形式,適合用於理論上的分析。在實際應用中,許多問題的階段劃分並不明顯,這時若是 刻意地劃分階段法反而麻煩。通常來講,只要該問題能夠劃分紅規模更小的子問題,而且原問題的最優解中包含了子問題的最優解(即知足最優子化原理),則能夠 考慮用動態規劃解決。
動態規劃的實質是分治思想和解決冗餘,所以,動態規劃是一種將問題實例分解爲更小的、類似的子問題,並存儲子問題的解而避免計算重複的子問題,以解決最優化問題的算法策略。
由此可知,動態規劃法與分治法和貪心法類 似,它們都是將問題實例概括爲更小的、類似的子問題,並經過求解子問題產生一個全局最優解。其中貪心法的當前選擇可能要依賴已經做出的全部選擇,但不依賴 於有待於作出的選擇和子問題。所以貪心法自頂向下,一步一步地做出貪心選擇;而分治法中的各個子問題是獨立的 (即不包含公共的子子問題),所以一旦遞歸地求出各子問題的解後,即可自下而上地將子問題的解合併成問題的解。但不足的是,若是當前選擇可能要依賴子問題 的解時,則難以經過局部的貪心策略達到全局最優解;若是各子問題是不獨立的,則分治法要作許多沒必要要的工做,重複地解公共的子問題。
解決上述問題的辦法是利用動態規劃。該方法主要應用於最優化問題,這類問題會有多種可能的解,每一個解都有一個值,而動態規劃找出其中最優(最大或最小)值的解。若存在若干個取最優值的解的話,它只取其中的一個。 在求解過程當中,該方法也是經過求解局部子問題的解達到全局最優解,但與分治法和貪心法不一樣的是,動態規劃容許這些子問題不獨立,(亦即各子問題可包含公共 的子子問題)也容許其經過自身子問題的解做出選擇,該方法對每個子問題只解一次,並將結果保存起來,避免每次碰到時都要重複計算。
所以,動態規劃法所針對的問題有一個顯著的特徵,即它所對應的子問題樹中的子問題呈現大量的重複。動態規劃法的關鍵就在於,對於重複出現的子問題,只在第一次遇到時加以求解,並把答案保存起來,讓之後再遇到時直接引用,沒必要從新求解。
動態規劃算法的基本步驟
設計一個標準的動態規劃算法,一般可按如下幾個步驟進行:
· 劃分階段:按照問題的時間或空間特徵,把問題分爲若干個階段。注意這若干個階段必定要是有序的或者是可排序的(即無後向性),不然問題就沒法用動態規劃求解。
· 選擇狀態:將問題發展到各個階段時所處於的各類客觀狀況用不一樣的狀態表示出來。固然,狀態的選擇要知足無後效性。
· 肯定決策並寫出狀態轉移方程:之因此把這兩步放在一塊兒,是由於決策和狀態轉移有着自然的聯繫,狀態轉移就是根據上一階段的狀態和決策來導出本階段的狀態。因此,若是咱們肯定了決策,狀態轉移方程也就寫出來了。但事實上,咱們經常是反過來作,根據相鄰兩段的各狀態之間的關係來肯定決策。
· 寫出規劃方程(包括邊界條件):動態規劃的基本方程是規劃方程的通用形式化表達式。通常說來,只要階段、狀態、決策和狀態轉移肯定了,這一步仍是比較簡單的。
動態規劃的主要難點在於理論上的設計,一旦設計完成,實現部分就會很是簡單。根據動態規劃的基本方程能夠直接遞歸計算最優值,可是通常將其改成遞推計算,實現的大致上的框架以下:
1. 對fn+1(xn+1)初始化; {邊界條件}
2. for k:=n downto 1 do
3. for 每個xk∈Xk do
4. for 每個uk∈Uk(xk) do
begin
5. fk(xk):=一個極值; {∞或-∞}
6. xk+1:=Tk(xk,uk); {狀態轉移方程}
7. t:=φ(fk+1(xk+1),vk(xk,uk)); {基本方程(9)式}
8. if t比fk(xk)更優 then fk(xk):=t; {計算fk(xk)的最優值}
end;
9. t:=一個極值; {∞或-∞}
10. for 每個x1∈X1 do
11. if f1(x1)比t更優 then t:=f1(x1); {按照10式求出最優指標}
12. 輸出t;
可是,實際應用當中常常不顯式地按照上面步驟設計動態規劃,而是按如下幾個步驟進行:
· 分析最優解的性質,並刻劃其結構特徵。
· 遞歸地定義最優值。
· 以自底向上的方式或自頂向下的記憶化方法(備忘錄法)計算出最優值。
· 根據計算最優值時獲得的信息,構造一個最優解。
步驟(1)--(3)是動態規劃算法的基本步驟。在只須要求出最優值的情形,步驟(4)能夠省略,若須要求出問題的一個最優解,則必須執行步驟 (4)。此時,在步驟(3)中計算最優值時,一般需記錄更多的信息,以便在步驟(4)中,根據所記錄的信息,快速地構造出一個最優解。
動態規劃的實例分析
下面咱們將經過實例來分析動態規劃的設計步驟和具體應用。例1已經在前文介紹過了。例1和例2是標準的動態規劃,有明顯的階段和狀態轉移方程; 例三、例四、例五、例6是沒有明顯階段劃分的動態規劃,也是通常常見的形式,其中對例四、例五、例6做了比較詳細的分析;例7是比較特殊的動態規劃,例8 是兩重動態規劃(即爲了解決問題要進行兩次動態規劃)的例子。
· 例7 多邊形計算
· 例8 字符識別
更多實例請參閱動態規劃問題集
動態規劃的技巧——階段的劃分和狀態的表示
在動態規劃的設計過程當中,階段的劃分和狀態的表示是很是重要的兩步,這兩步會直接影響該問題的計算複雜性,有時候階段劃分或狀態表示的不合理還會使得動態規劃法不適用。
在下圖中找出從左下角到右上角的最短路徑,每步只能向右方或上方走。
這是一道簡單而又典型的動態規劃題,許多介紹動態規劃的書與文章中都拿它來作例子。一般,書上的解答是這樣的:
按照圖中的虛線來劃分階段,即階段變量k表示走過的步數,而狀態變量xk表示當前處於這一階段上的哪一點。這時的模型實際上已經轉化成了一個特殊的多段圖。用決策變量uk=0表示向右走,uk=1表示向上走,則狀態轉移方程以下:
(這裏的row是地圖豎直方向的行數)
咱們看到,這個狀態轉移方程須要根據k的取值分兩種狀況討論,顯得很是麻煩。相應的,把它代入規劃方程而付諸實現時,算法也很繁。於是咱們在實現時,通常是不會這麼作的,而代之如下面方法:
(這裏Distance表示相鄰兩點間的邊長)
這樣作確實要比上面的方法簡單多了,可是它已經破壞了動態規劃的原本面目,而不存在明確的階段特徵了。若是說這種方法是以地圖中的行(A、B、C、D)來劃分階段的話,那麼它的"狀態轉移"就不全是在兩個階段之間進行的了。
也許這沒什麼大不了的,由於實踐比理論更有說服力。可是,若是咱們把題目擴展一下:在地圖中找出從左下角到右上角的兩條路徑,兩條路徑中的任何一條邊都不能重疊,而且要求兩條路徑的總長度最短。這時,再用這種"簡單"的方法就不太好辦了。
若是非得套用這種方法的話,則最優指標函數就須要有四維的下標,而且難以處理兩條路徑"不能重疊"的問題。
而咱們回到原先"標準"的動態規劃法,就會發現這個問題很好解決,只須要加一維狀態變量就成了。即用xk=(ak,bk)分別表示兩條路徑走到階段k時所處的位置,相應的,決策變量也增長一維,用uk=(xk,yk)分別表示兩條路徑的行走方向。狀態轉移時將兩條路徑分別考慮
在寫規劃方程時,只要對兩條路徑走到同一個點的狀況稍微處理一下,減小可選的決策個數:
從這個例子能夠看出,合理地劃分階段和選擇狀態能夠給解題帶來方便。
[例10] LITTLE SHOP OF FLOWERS (IOI’99)
PROBLEM
You want to arrange the window of your flower shop in a most pleasant way. You have Fbunches of flowers, each being of a different kind, and at least as many vases ordered in a row. The vases are glued onto the shelf and are numbered consecutively 1 through V, where V is the number of vases, from left to right so that the vase 1 is the leftmost, and the vase V is the rightmost vase. The bunches are moveable and are uniquely identified by integers between 1 and F. These id-numbers have a significance: They determine the required order of appearance of the flower bunches in the row of vases so that the bunch i must be in a vase to the left of the vase containing bunch j whenever i < j. Suppose, for example, you have a bunch of azaleas (id-number=1), a bunch of begonias (id-number=2) and a bunch of carnations (id-number=3). Now, all the bunches must be put into the vases keeping their id-numbers in order. The bunch of azaleas must be in a vase to the left of begonias, and the bunch of begonias must be in a vase to the left of carnations. If there are more vases than bunches of flowers then the excess will be left empty. A vase can hold only one bunch of flowers.
Each vase has a distinct characteristic (just like flowers do). Hence, putting a bunch of flowers in a vase results in a certain aesthetic value, expressed by an integer. The aesthetic values are presented in a table as shown below. Leaving a vase empty has an aesthetic value of 0.
|
V A S E S |
|||||
1 |
2 |
3 |
4 |
5 |
||
Bunches |
1 (azaleas) |
7 |
23 |
-5 |
-24 |
16 |
2 (begonias) |
5 |
21 |
-4 |
10 |
23 |
|
3 (carnations) |
-21 |
5 |
-4 |
-20 |
20 |
According to the table, azaleas, for example, would look great in vase 2, but they would look awful in vase 4.
To achieve the most pleasant effect you have to maximize the sum of aesthetic values for the arrangement while keeping the required ordering of the flowers. If more than one arrangement has the maximal sum value, any one of them will be acceptable. You have to produce exactly one arrangement.
ASSUMPTIONS
· 1 <= F <= 100 where F is the number of the bunches of flowers. The bunches are numbered 1 through F.
· F<= V <= 100 where V is the number of vases.
· -50 <= Aij<= 50 where Aijis the aesthetic value obtained by putting the flower bunch i into the vase j.
INPUT
The input is a text file named flower.inp.
· The first line contains two numbers: F, V.
· The following F lines: Each of these lines contains V integers, so that Aij is given as the jth number on the (i+1)st line of the input file.
OUTPUT
The output must be a text file named flower.out consisting of two lines:
· The first line will contain the sum of aesthetic values for your arrangement.
· The second line must present the arrangement as a list of F numbers, so that the k’th number on this line identifies the vase in which the bunch k is put.
EXAMPLE
flower.inp:
3 5 7 23 -5 -24 16 5 21 -4 10 23 -21 5 -4 -20 20 |
flower.out:
53 2 4 5 |
EVALUATION
· Your program will be allowed to run 2 seconds.
· No partial credit can be obtained for a test case.
本題雖然是IOI’99中較爲簡單的一題,但其中大有文章可做。說它簡單,是由於它有序,所以咱們一眼即可看出這題應該用動態規劃來解決。可是,如何動態規劃呢?如何劃分階段,又如何選擇狀態呢?
<方法1>
以花束的編號來劃分階段。在這裏,第k階段佈置第k束花,共有F束花,有F+1個階段,增長第F+1階段是爲了計算的方便;狀態變量xk表示第k束花所在的花瓶。而對於每個狀態xk,決策uk就是第k+1束花放置的花瓶號;最優指標函數fk(xk)表示從第k束花到第n束花所獲得的最大美學值;A(i,j)是花束i插在花瓶j中的美學值,V是花瓶總數,F是花的總數。
狀態轉移方程爲
規劃方程爲
邊界條件爲:
,
事實上這是一個虛擬的邊界。
最後要求的最大美學價值是
<方法2>
方法1的規劃方程中的容許決策空間:xk+1≤uk≤V-(F-k)+1 比較麻煩,所以有待改進。仍是以花束的編號來劃分階段,第k階段佈置第k束花;狀態變量xk表示第k束花所在的花瓶;注意,這裏咱們考慮倒過來佈置花瓶,即從第F束花開始佈置到第1束花。因而狀態變量uk表示第k-1束花所在的花瓶;最優指標fk(xk)表示從第一束花到第k束花所得到的美學價值;A(i,j)是花束i插在花瓶j中的美學值,V是花瓶總數,F是花的總數。則狀態轉移方程爲:
規劃方程爲:
增長的虛擬邊界條件爲:
最後要求的最大美學價值是:
能夠看出,這種方法實質上和方法1沒有區別,可是容許決策空間的表示變得簡單了。
<方法3>
以花瓶的數目來劃分階段,第k個階段決定花瓶k中是否放花;狀態變量xk表示前k個花瓶中放了多少花;而對於任意一個狀態xk,決策就是第xk束花是否放在第k個花瓶中,用變量uk=1或0來表示。最優指標函數fk(xk)表示前k個花瓶中插了xk束花,所能取得的最大美學值。注意,這裏仍然是倒過來考慮。
狀態轉移方程爲
規劃方程爲
邊界條件爲
三種不一樣的方法都成功地解決了問題,只不過由於階段的劃分不一樣,狀態的表示不一樣,決策的選擇有多有少,因此算法的時間複雜度也就不一樣。
這個例子具備很大的廣泛性。有不少的多階段決策問題都有着不止一種的階段劃分方法,於是每每就有不止一種的規劃方法。有時各類方法所產生的效果 是差很少的,但更多的時候,就像咱們的例子同樣,兩種方法會在某個方面有些區別。因此,在用動態規劃解題的時候,能夠多想想是否有其它的解法。對於不一樣 的解法,要注意比較,好的算法好在哪裏,差一點的算法差在哪裏。從各類不一樣算法的比較中,咱們能夠更深入地領會動態規劃的構思技巧。
動態規劃實現中的問題
應用動態規劃解決問題,在有了基本的思路以後,通常來講,算法實現是比較好考慮的。但有時也會遇到一些問題,而使算法難以實現。動態規劃思想設計的 算法從總體上來看基本都是按照得出的遞推關係式進行遞推,這種遞推相對於計算機來講,只要設計得當,效率每每是比較高的,這樣在時間上溢出的可能性不大, 而相反地,動態規劃須要很大的空間以存儲中間產生的結果,這樣可使包含同一個子問題的全部問題共用一個子問題解,從而體現動態規劃的優越性,但這是以犧 牲空間爲代價的,爲了有效地訪問已有結果,數據也不易壓縮存儲,於是空間矛盾是比較突出的。另外一方面,動態規劃的高時效性每每要經過大的測試數據體現出來 (以與搜索做比較),於是,對於大規模的問題如何在基本不影響運行速度的條件下,解決空間溢出的問題,是動態規劃解決問題時一個廣泛會遇到的問題。
對於這個問題,能夠考慮從如下一些方面去嘗試:
一個思考方向是儘量少佔用空間。如從結點的數據結構上考慮,僅僅存儲必不可少的內容,以及數據存儲範圍上精打細算(按位存儲、壓縮存儲等)。固然 這要因問題而異,進行分析。另外,在實現動態規劃時,一個咱們常常採用的方法是用一個與結點數同樣多的數組來存儲每一步的決策,這對於倒推求得一種實現最 優解的方法是十分方便的,並且處理速度也有一些提升。可是在內存空間緊張的狀況下,咱們就應該抓住問題的主要矛盾。省去這個存儲決策的數組,而改爲在從最 優解逐級倒推時,再計算一次,選擇某個可能達到這個值的上一階段的狀態,直到推出結果爲止。這樣作,在程序編寫上比上一種作法稍微多花一點時間,運行的時 效也可能會有一些(但每每很小)的降低,但卻換來了不少的空間。於是這種思想在處理某些問題時,是頗有意義的。
但有時,即便採用這樣的方法也會發現空間溢出的問題。這時就要分析,這些保留下來的數據是否有必要同時存在於內存之中。由於有不少問題,動態規劃遞 推在處理後面的內容時,前面比較遠處的內容其實是用不着的。對於這類問題,在已經確信不會再被使用的數據上覆蓋數據,從而使空間得以重複利用,若是能有 效地使用這一手段,對於至關大規模的問題,空間也不至於溢出(爲了求出最優方案,保留每一步的決策還是必要的,這一樣須要空間)。
通常地說,這種方法能夠經過兩種思路來實現:一種是遞推結果僅使用Data1和Data2這樣兩個數組,每次將Data1做爲上一階段,推得 Data2數組,而後,將Data2經過複製覆蓋到Data1之上,如此反覆,便可推得最終結果。這種作法有一個侷限性,就是對於遞推與前面若干階段相關 的問題,這種作法就比較麻煩;並且,每遞推一級,就須要複製不少的內容,與前面多個階段相關的問題影響更大。另一種實現方法是,對於一個可能與前N個階 段相關的問題,創建數組Data[0..N],其中各項爲最近N各階段的保存數據。這樣不採用這種內存節約方式時對於階段k的訪問只要對應成對數組 Data中下標爲k mod (N+1)的單元的訪問就能夠了。這種處理方法對於程序修改的代碼不多,速度幾乎不受影響,並且須要保留不一樣的階段數也都能很容易實現。
當採用以上方法仍沒法解決內存問題時,也能夠採用對內存的動態申請來使絕大多數狀況能有效出解。並且,使用動態內存還有一點好處,就是在重複使用內存而進行交換時,能夠只對指針進行交換,而不復制數據,這在實踐中也是十分有效的。
動態規劃與其餘算法的比較
動態規劃與其說是一種算法,不如說是一種算法設計的策略,他的基本思想體現於許多其它算法之中。下面咱們經過比較動態規劃和其餘的一些算法之間的相互聯繫,來深刻理解動態規劃的基本思想。
動態規劃的數學理論模型
在動態規劃算法發展的初期,Bellman從純粹的邏輯出發給出了最優性原理 --Principle of Optimality:
"An optimal policy has the property that whatever the initial state and initial decision are, then remaining decisions must constitute an optimal policy with regard to the state resulting from first decision."
他給出這個原理做爲動態規劃適用的條件,後來Morin在1982年證實了這只是一個充分條件而非必要條件。
動態規劃開始只是應用於多階段決策性問題,後來漸漸被髮展爲解決離散最優化問題的有效手段,進一步應用於一些連續性問題上。然而,動態規劃更像是一 種思想而非算法,它沒有固定的數學模型,沒有固定的實現方法,其正確性也缺少嚴格的理論證實。所以,一直以來動態規劃的數學理論模型是一個研究的熱點。
目前比較流行的主要有兩種理論模型:關係計算模型(relational calculus model)和估價網絡模型(valuation network model)。
關於這兩種流行理論,感興趣的朋友能夠參看如下論文:
其餘資料
關於動態規劃的應用,請參閱動態規劃問題集
關於遞歸法,請參閱遞歸技術
關於分治法,請參閱分治法
關於動態規劃的更多技巧和知識,請參閱如下資料:
· 如下是來自IOI國家集訓隊的論文:
o 動態規劃,方奇 (Zipped MS Word document)
o 把握本質,靈活運用——動態規劃的深刻探討,來煜坤 (Zipped MS Word document)
o 動態規劃的深刻討論,李剛 (Zipped MS Word document)
o 動態規劃的特色及其應用,張辰 (Zipped MS Word document)推薦
· AXIOMS FOR DYNAMIC PROGRAMMING, Prakash P. Shenoy ,1996 (Zipped .pdf document)推薦
· Dynamic Programming: a different perspective, Sharon Curtis , (Zipped .pdf document) 推薦
· How to Design Dynamic Programming Algorithms Sans Recursion, Kirk Pruhs (Zipped .ps document) 推薦
· Dynamic Programming via Static Incrementalization, Yanhong A. Liu, Scott D. Stoller (Zipped .ps document) 推薦
· Dynamic Programming in a Generalized Decision Mode, Ulrich Huckenbeck, December, 1993 (Zipped .ps document) 推薦
· Between Dynamic Programming and Greedy: Data Compression, Richard S. Bird , Oege de Moor, September 14 ,1995 (Zipped .pdf document)
· Using Local Trajectory Optimizers To Speed Up Global Optimization In Dynamic Programming, Christopher G. Atkeson , July 28,1995 (Zipped .ps document)
· A Fast Bit-Vector Algorithm for Approximate String Matching Based on Dynamic Programming, Gene Myers,March 27, 1998 (Zipped .ps document)
· Soft Dynamic Programming Algorithms: Convergence Proofs, Satinder P. Singh ,1993 (Zipped .ps document)
· Speeding up Dynamic Programming without Omitting any Optimal Solution and some Applications in Molecular Biology, Norbert Blum ,January 18, 2000 (Zipped .ps document)