動態規劃 什麼是動態規劃?

2021-08-03 08:52:37 字數 3355 閱讀 6758

先來看看《資訊學奧賽一本通第5版》是怎麼說的:

動態規劃程式設計是對解最優化問題的一種途徑、一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的設計方法對不同的問題,有各具特色的解題方法,而不存在一種萬能的動態規劃演算法,可以解決各類最優化問題。因此讀者在學習時,除了要對基本概念和方法正確理解外,必須具體問題具體分析處理,以豐富的想象力去建立模型,用創造性的技巧去求解。我們也可以通過對若干有代表性的問題的動態規劃演算法進行分析、討論,逐漸學會並掌握這一設計方法。

舉個栗子:

《資訊學奧賽一本通第5版》的例9.1:,題目是,最短路徑問題。下圖給出了乙個地圖,地圖中的每個頂點代表乙個城市,兩個城市間的一條連線代表道路,連線上的數值代表道路的長度。現在想從城市a到達城市e,怎樣走路程最短?最短路程的長度是多少?

圖:

,這是《資訊學奧賽一本通第5版》的解析:

【演算法分析】

把a到e的全過程分成四個階段,用k表示階段變數,第1階段有乙個初始狀態a,有兩條可供選擇的支路a-b1、a-b2;第2階段有兩個初始狀態b1、b2,b1有三條可供選擇的支路,b2有兩條可供選擇的支路……。用dk(xi,x+1j)表示在第k階段由初始狀態xi到下階段的初始狀態x+1j的路徑距離,fk(xi)表示從第k階段的xi到終點e的最短距離,利用倒推的方法,求解a到e的最短距離。 具體計算過程如下:

s1: k = 4 有

f4(d1)= 3,

f4(d2)= 4,

f4(d3)= 3;

s2: k = 3 有

f3(c1)= min

= min = 8

f3(c2)= d3(c2,d1)+ f4(d1)= 5+3 = 8

f3(c3)= d3(c3,d3)+ f4(d3)= 8+3 = 11

f3(c4)= d3(c4,d3)+ f4(d3)= 3+3 = 6

s3: k = 2 有

f2(b1)= min = min = 9

f2(b2)= min

= min = 10

s4: k = 1 有

f1(a)= min

= min = 13

因此由a點到e點的全過程最短路徑為a→b2→c4→d3→e;最短路程長度為13。

從以上過程可以看出,每個階段中,都求出本階段的各個初始狀態到終點e的最短距離,當逆序倒推到過程起點a時,便得到了全過程的最短路徑和最短距離。

在上例的多階段決策問題中,各個階段採取的決策,一般來說是與階段有關的,決策依賴於當前狀態,又隨即引起狀態的轉移,乙個決策序列就是在變化的狀態中產生出來的,故有「動態」的含義,我們稱這種解決多階段決策最優化的過程為動態規劃程式設計方法。

我的理解是,這題是一道求最優的題目,最短路徑目前已知比較普通的有:bfs,dfs,貪心,dp。bfs明顯是不行,因為每個變化的代價不一樣,dfs雖然是萬能的密鑰匙,但時間複雜度太高,不行。貪心就更不用說了,沒有區域性最優導致全域性最優。所以,用dp,dp上面已經講得很詳細了。

然後是動態規劃的基本概念和基本模型構成 :

現在我們來介紹動態規劃的基本概念。

1. 階段和階段變數:

用動態規劃求解乙個問題時,需要將問題的全過程恰當地分成若干個相互聯絡的階段,以便按一定的次序去求解。描述階段的變數稱為階段變數,通常用k表示,階段的劃分一般是根據時間和空間的自然特徵來劃分,同時階段的劃分要便於把問題轉化成多階段決策過程,如例題1中,可將其劃分成4個階段,即k = 1,2,3,4。

2. 狀態和狀態變數:

某一階段的出發位置稱為狀態,通常乙個階段包含若干狀態。一般地,狀態可由變數來描述,用來描述狀態的變數稱為狀態變數。如例題1中,c3是乙個狀態變數。

3. 決策、決策變數和決策允許集合:

在對問題的處理中作出的每種選擇性的行動就是決策。即從該階段的每乙個狀態出發,通過一次選擇性的行動轉移至下一階段的相應狀態。乙個實際問題可能要有多次決策和多個決策點,在每乙個階段的每乙個狀態中都需要有一次決策,決策也可以用變數來描述,稱這種變數為決策變數。在實際問題中,決策變數的取值往往限制在某乙個範圍之內,此範圍稱為允許決策集合。如例題1中,f3(c3)就是乙個決策變數。

4.策略和最優策略:

所有階段依次排列構成問題的全過程。全過程中各階段決策變數所組成的有序總體稱為策略。在實際問題中,從決策允許集合中找出最優效果的策略成為最優策略。

5. 狀態轉移方程

前一階段的終點就是後一階段的起點,對前一階段的狀態作出某種決策,產生後一階段的狀態,這種關係描述了由k階段到k+1階段狀態的演變規律,稱為狀態轉移方程。

我的見解是:dp(動態規劃)其實是一種高階貪心——用遞推做的貪心,遞推與dp最大的區別就在於遞推只是單純的推,而dp是有選擇性的遞推

然後是最優化原理與無後效性 :

上面已經介紹了動態規劃模型的基本組成,現在需要解決的問題是:什麼樣的「多階段決策問題」才可以採用動態規劃的方法求解。

一般來說,能夠採用動態規劃方法求解的問題,必須滿足最優化原理和無後效性原則:

1、動態規劃的最優化原理。作為整個過程的最優策略具有:無論過去的狀態和決策如何,對前面的決策所形成的狀態而言,餘下的諸決策必須構成最優策略的性質。也可以通俗地理解為子問題的區域性最優將導致整個問題的全域性最優,即問題具有最優子結構的性質,也就是說乙個問題的最優解只取決於其子問題的最優解,而非最優解對問題的求解沒有影響。在例題1最短路徑問題中,a到e的最優路徑上的任一點到終點e的路徑,也必然是該點到終點e的一條最優路徑,即整體優化可以分解為若干個區域性優化。

2、動態規劃的無後效性原則。所謂無後效性原則,指的是這樣一種性質:某階段的狀態一旦確定,則此後過程的演變不再受此前各狀態及決策的影響。也就是說,「未來與過去無關」,當前的狀態是此前歷史的乙個完整的總結,此前的歷史只能通過當前的狀態去影響過程未來的演變。在例題1最短路徑問題中,問題被劃分成各個階段之後,階段k中的狀態只能由階段k+1中的狀態通過狀態轉移方程得來,與其它狀態沒有關係,特別與未發生的狀態沒有關係,例如從ci到e的最短路徑,只與ci的位置有關,它是由di中的狀態通過狀態轉移方程得來,與e狀態,特別是a到ci的路徑選擇無關,這就是無後效性。

由此可見,對於不能劃分階段的問題,不能運用動態規劃來解;對於能劃分階段,但不符合最優化原理的,也不能用動態規劃來解;既能劃分階段,又符合最優化原理的,但不具備無後效性原則,還是不能用動態規劃來解;誤用動態規劃程式設計方法求解會導致錯誤的結果。

什麼是動態規劃

動態規劃 dynamic programming 與分治法相似,都是通過組合子問題的解來求解原問題,動態規劃應用於子問題重疊的情況,即不同的子問題具有公共的子子問題。通常按照下面4個步驟來設計乙個動態規劃演算法 1.刻畫乙個最優解的結構特徵。2.遞迴地定義最優解的值 3.計算最優解的值,通常採用自底...

什麼是動態規劃?

一 基本思想 態規劃演算法的基本思想與分治法類似,都是將問題大問題拆分為小問題,通過小問題的求解來得到最後的解。與分治法不同的是,分治法是分而治之,分治法將大問題拆分為相同性質的子問題,最後合併子問題的解來構成最終解。而動態規劃是,將子問題拆解後,按順序求解子問題,前面階段的求解為後一階段提供有用資...

mysql動態規劃 動態規劃

動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...