當前位置:編程學習大全網 - 編程語言 - C程序的動態規劃是啥意思

C程序的動態規劃是啥意思

關鍵詞動態規劃 階段

摘要

動態規劃是信息學競賽中的常見算法,本文的主要內容就是分析它的特點。

文章的第壹部分首先探究了動態規劃的本質,因為動態規劃的特點是由它的本質所決定的。第二部分從動態規劃的設計和實現這兩個角度分析了動態規劃的多樣性、模式性、技巧性這三個特點。第三部分將動態規劃和遞推、搜索、網絡流這三個相關算法作了比較,從中探尋動態規劃的壹些更深層次的特點。

文章在分析動態規劃的特點的同時,還根據這些特點分析了我們在解題中應該怎樣利用這些特點,怎樣運用動態規劃。這對我們的解題實踐有壹定的指導意義。

正文

動態規劃是編程解題的壹種重要的手段,在如今的信息學競賽中被應用得越來越普遍。最近幾年的信息學競賽,不分大小,幾乎每次都要考察到這方面的內容。因此,如何更深入地了解動態規劃,從而更為有效地運用這個解題的有力武器,是壹個值得深入研究的問題。

要掌握動態規劃的應用技巧,就要了解它的各方面的特點。首要的,是要深入洞悉動態規劃的本質。

§1動態規劃的本質

動態規劃是在本世紀50年代初,為了解決壹類多階段決策問題而誕生的。那麽,什麽樣的問題被稱作多階段決策問題呢?

§1.1多階段決策問題

說到多階段決策問題,人們很容易舉出下面這個例子。

[例1] 多段圖中的最短路徑問題:在下圖中找出從A1到D1的最短路徑。

仔細觀察這個圖不難發現,它有壹個特點。我們將圖中的點分為四類(圖中的A、B、C、D),那麽圖中所有的邊都處於相鄰的兩類點之間,並且都從前壹類點指向後壹類點。這樣,圖中的邊就被分成了三類(AàB、BàC、CàD)。我們需要從每壹類中選出壹條邊來,組成從A1到D1的壹條路徑,並且這條路徑是所有這樣的路徑中的最短者。

從上面的這個例子中,我們可以大概地了解到什麽是多階段決策問題。更精確的定義如下:

多階段決策過程,是指這樣的壹類特殊的活動過程,問題可以按時間順序分解成若幹相互聯系的階段,在每壹個階段都要做出決策,全部過程的決策是壹個決策序列[1]。要使整個活動的總體效果達到最優的問題,稱為多階段決策問題。

從上述的定義中,我們可以明顯地看出,這類問題有兩個要素。壹個是階段,壹個是決策。

§1.2階段與狀態

階段:將所給問題的過程,按時間或空間特征分解成若幹相互聯系的階段,以便按次序去求每階段的解。常用字母k表示階段變量。[1]

階段是問題的屬性。多階段決策問題中通常存在著若幹個階段,如上面的例子,就有A、B、C、D這四個階段。在壹般情況下,階段是和時間有關的;但是在很多問題(我的感覺,特別是信息學問題)中,階段和時間是無關的。從階段的定義中,可以看出階段的兩個特點,壹是“相互聯系”,二是“次序”。

階段之間是怎樣相互聯系的?就是通過狀態和狀態轉移。

狀態:各階段開始時的客觀條件叫做狀態。描述各階段狀態的變量稱為狀態變量,常用sk表示第k階段的狀態變量,狀態變量sk的取值集合稱為狀態集合,用Sk表示。[1]

狀態是階段的屬性。每個階段通常包含若幹個狀態,用以描述問題發展到這個階段時所處在的壹種客觀情況。在上面的例子中,行人從出發點A1走過兩個階段之後,可能出現的情況有三種,即處於C1、C2或C3點。那麽第三個階段就有三個狀態S3={C1,C2,C3}。

每個階段的狀態都是由以前階段的狀態以某種方式“變化”而來,這種“變化”稱為狀態轉移(暫不定義)。上例中C3點可以從B1點過來,也可以從B2點過來,從階段2的B1或B2狀態走到階段3的C3狀態就是狀態轉移。狀態轉移是導出狀態的途徑,也是聯系各階段的途徑。

說到這裏,可以提出應用動態規劃的壹個重要條件。那就是將各階段按照壹定的次序排列好之後,對於某個給定的階段狀態,它以前各階段的狀態無法直接影響它未來的發展,而只能通過當前的這個狀態。換句話說,每個狀態都是“過去歷史的壹個完整總結[1]”。這就是無後效性。對這個性質,下文還將會有解釋。

§1.3決策和策略

上面的階段與狀態只是多階段決策問題的壹個方面的要素,下面是另壹個方面的要素——決策。

決策:當各段的狀態取定以後,就可以做出不同的決定,從而確定下壹階段的狀態,這種決定稱為決策。表示決策的變量,稱為決策變量,常用uk(sk)表示第k階段當狀態為sk時的決策變量。在實際問題中,決策變量的取值往往限制在壹定範圍內,我們稱此範圍為允許決策集合。常用Dk(sk)表示第k階段從狀態sk出發的允許決策集合。顯然有uk(sk) ?Dk(sk)。[1]

決策是問題的解的屬性。決策的目的就是“確定下壹階段的狀態”,還是回到上例,從階段2的B1狀態出發有三條路,也就是三個決策,分別導向階段3的C1、C2、C3三個狀態,即D2(B1)={C1,C2,C3}。

有了決策,我們可以定義狀態轉移:動態規劃中本階段的狀態往往是上壹階段和上壹階段的決策結果,由第k段的狀態sk和本階段的決策uk確定第k+1段的狀態sk+1的過程叫狀態轉移。狀態轉移規律的形式化表示sk+1=Tk(sk,uk)稱為狀態轉移方程。

這樣看來,似乎決策和狀態轉移有著某種聯系。我的理解,狀態轉移是決策的目的,決策是狀態轉移的途徑。

各段決策確定後,整個問題的決策序列就構成壹個策略,用p1,n={u1(s1),u2(s2),…, un(sn)}表示。對每個實際問題,可供選擇的策略有壹定範圍,稱為允許策略集合,記作P1,n,使整個問題達到最有效果的策略就是最優策略。[1]

說到這裏,又可以提出運用動態規劃的壹個前提。即這個過程的最優策略應具有這樣的性質:無論初始狀態及初始決策如何,對於先前決策所形成的狀態而言,其以後的所有決策應構成最優策略[1]。這就是最優化原理。簡言之,就是“最優策略的子策略也是最優策略”。

§1.4最優化原理與無後效性

這裏,我把最優化原理定位在“運用動態規劃的前提”。這是因為,是否符合最優化原理是壹個問題的本質特征。對於不滿足最優化原理的壹個多階段決策問題,整體上的最優策略p1,n同任何壹個階段k上的決策uk或任何壹組階段k1…k2上的子策略pk1,k2都不存在任何關系。如果要對這樣的問題動態規劃的話,我們從壹開始所作的劃分階段等努力都將是徒勞的。

而我把無後效性定位在“應用動態規劃的條件”,是因為動態規劃是按次序去求每階段的解,如果壹個問題有後效性,那麽這樣的次序便是不合理的。但是,我們可以通過重新劃分階段,重新選定狀態,或者增加狀態變量的個數等手段,來是問題滿足無後效性這個條件。說到底,還是要確定壹個“序”。

在信息學的多階段決策問題中,絕大部分都是能夠滿足最優化原理的,但它們往往會在後效性這壹點上來設置障礙。所以在解題過程中,我們會特別關心“序”。對於有序的問題,就會考慮到動態規劃;對於無序的問題,也會想方設法來使其有序。

§1.5最優指標函數和規劃方程

最優指標函數:用於衡量所選定策略優劣的數量指標稱為指標函數,最優指標函數記為fk(sk),它表示從第k段狀態sk采用最優策略p*k,n到過程終止時的最佳效益值[1]。

最優指標函數其實就是我們真正關心的問題的解。在上面的例子中,f2(B1)就表示從B1點到終點D1點的最短路徑長度。我們求解的最終目標就是f1(A1)。

最優指標函數的求法壹般是壹個從目標狀態出發的遞推公式,稱為規劃方程:

其中sk是第k段的某個狀態,uk是從sk出發的允許決策集合Dk(sk)中的壹個決策,Tk(sk,uk)是由sk和uk所導出的第k+1段的某個狀態sk+1,g(x,uk)是定義在數值x和決策uk上的壹個函數,而函數opt表示最優化,根據具體問題分別表為max或min。

,稱為邊界條件。

上例中的規劃方程就是:

邊界條件為

這裏是壹種從目標狀態往回推的逆序求法,適用於目標狀態確定的問題。在我們的信息學問題中,也有很多有著確定的初始狀態。當然,對於初始狀態確定的問題,我們也可以采用從初始狀態出發往前推的順序求法。事實上,這種方法對我們來說要更為直觀、更易設計壹些,從而更多地出現在我們的解題過程中。

我們本節所討論的這些理論雖然不是本文的主旨,但是卻對下面要說的動態規劃的特點起著基礎性的作用。

§2動態規劃的設計與實現

上面我們討論了動態規劃的壹些理論,本節我們將通過幾個例子中,動態規劃的設計與實現,來了解動態規劃的壹些特點。

§2.1動態規劃的多樣性

[例2] 花店櫥窗布置問題(IOI99)試題見附錄

本題雖然是本屆IOI中較為簡單的壹題,但其中大有文章可作。說它簡單,是因為它有序,因此我們壹眼便可看出這題應該用動態規劃來解決。但是,如何動態規劃呢?如何劃分階段,又如何選擇狀態呢?

<方法1>以花束的數目來劃分階段。在這裏,階段變量k表示的就是要布置的花束數目(前k束花),狀態變量sk表示第k束花所在的花瓶。而對於每壹個狀態sk,決策就是第k-1束花應該放在哪個花瓶,用uk表示。最優指標函數fk(sk)表示前k束花,其中第k束插在第sk個花瓶中,所能取得的最大美學值。

狀態轉移方程為

規劃方程為

(其中A(i,j)是花束i插在花瓶j中的美學值)

邊界條件 (V是花瓶總數,事實上這是壹個虛擬的邊界)

<方法2>以花瓶的數目來劃分階段。在這裏階段變量k表示的是要占用的花瓶數目(前k個花瓶),狀態變量sk表示前k個花瓶中放了多少花。而對於任意壹個狀態sk,決策就是第sk束花是否放在第k個花瓶中,用變量uk=1或0來表示。最優指標函數fk(sk)表示前k個花瓶中插了sk束花,所能取得的最大美學值。

狀態轉移方程為

規劃方程為

邊界條件為

兩種劃分階段的方法,引出了兩種狀態表示法,兩種規劃方式,但是卻都成功地解決了問題。只不過因為決策的選擇有多有少,所以算法的時間復雜度也就不同。[2]

這個例子具有很大的普遍性。有很多的多階段決策問題都有著不止壹種的階段劃分方法,因而往往就有不止壹種的規劃方法。有時各種方法所產生的效果是差不多的,但更多的時候,就像我們的例子壹樣,兩種方法會在某個方面有些區別。

所以,在用動態規劃解題的時候,可以多想壹想是否有其它的解法。對於不同的解法,要註意比較,好的算法好在哪裏,差壹點的算法差在哪裏。從各種不同算法的比較中,我們可以更深刻地領會動態規劃的構思技巧。

§2.2動態規劃的模式性

這個可能做過動態規劃的人都有體會,從我們上面對動態規劃的分析也可以看出來。動態規劃的設計都有著壹定的模式,壹般要經歷以下幾個步驟。

劃分階段:按照問題的時間或空間特征,把問題分為若幹個階段。註意這若幹個階段壹定要是有序的或者是可排序的,否則問題就無法求解。

選擇狀態:將問題發展到各個階段時所處於的各種客觀情況用不同的狀態表示出來。當然,狀態的選擇要滿足無後效性。

確定決策並寫出狀態轉移方程:之所以把這兩步放在壹起,是因為決策和狀態轉移有著天然的聯系,狀態轉移就是根據上壹階段的狀態和決策來導出本階段的狀態。所以,如果我們確定了決策,狀態轉移方程也就寫出來了。但事實上,我們常常是反過來做,根據相鄰兩段的各狀態之間的關系來確定決策。

寫出規劃方程(包括邊界條件):在第壹部分中,我們已經給出了規劃方程的通用形式化表達式。壹般說來,只要階段、狀態、決策和狀態轉移確定了,這壹步還是比較簡單的。

動態規劃的主要難點在於理論上的設計,壹旦設計完成,實現部分就會非常簡單。大體上的框架如下:

對f1(s1)初始化(邊界條件)

for k?2 to n(這裏以順序求解為例)

對每壹個sk?Sk

fk(sk)?壹個極值(∞或-∞)

對每壹個uk(sk)?Dk(sk)

sk-1?Tk(sk,uk)

t?g(fk-1(sk-1),uk)

y t比fk(sk)更優 n

fk(sk)?t

輸出fn(sn)

這個N-S圖雖然不能代表全部,但足可以概括大多數。少數的壹些特殊的動態規劃,其實現的原理也是類似,可以類比出來。我們到現在對動態規劃的分析,主要是在理論上、設計上,原因也就在此。

掌握了動態規劃的模式性,我們在用動態規劃解題時就可以把主要的精力放在理論上的設計。壹旦設計成熟,問題也就基本上解決了。而且在設計算法時也可以按部就班地來。

但是“物極必反”,太過拘泥於模式就會限制我們的思維,扼殺優良算法思想的產生。我們在解題時,不妨發揮壹下創造性,去突破動態規劃的實現模式,這樣往往會收到意想不到的效果。[3]

§2.3動態規劃的技巧性

上面我們所說的動態規劃的模式性,主要指的是實現方面。而在設計方面,雖然它較為嚴格的步驟性,但是它的設計思想卻是沒有壹定的規律可循的。這就需要我們不斷地在實踐當中去掌握動態規劃的技巧,下面僅就壹個例子談壹點我自己的體會。

[例3] 街道問題:在下圖中找出從左下角到右上角的最短路徑,每步只能向右方或上方走。

這是壹道簡單而又典型的動態規劃題,許多介紹動態規劃的書與文章中都拿它來做例子。通常,書上的解答是這樣的:

按照圖中的虛線來劃分階段,即階段變量k表示走過的步數,而狀態變量sk表示當前處於這壹階段上的哪壹點(各點所對應的階段和狀態已經用ks在地圖上標明)。這時的模型實際上已經轉化成了壹個特殊的多段圖。用決策變量uk=0表示向右走,uk=1表示向上走,則狀態轉移方程如下:

(這裏的row是地圖豎直方向的行數)

我們看到,這個狀態轉移方程需要根據k的取值分兩種情況討論,顯得非常麻煩。相應的,把它代入規劃方程而付諸實現時,算法也很繁。因而我們在實現時,壹般是不會這麽做的,而代之以下面方法:

將地圖中的點規則地編號如上,得到的規劃方程如下:

(這裏Distance表示相鄰兩點間的邊長)

這樣做確實要比上面的方法簡單多了,但是它已經破壞了動態規劃的本來面目,而不存在明確的階段特征了。如果說這種方法是以地圖中的行(A、B、C、D)來劃分階段的話,那麽它的“狀態轉移”就不全是在兩個階段之間進行的了。

也許這沒什麽大不了的,因為實踐比理論更有說服力。但是,如果我們把題目擴展壹下:在地圖中找出從左下角到右上角的兩條路徑,兩條路徑中的任何壹條邊都不能重疊,並且要求兩條路徑的總長度最短。這時,再用這種“簡單”的方法就不太好辦了。

如果非得套用這種方法的話,則最優指標函數就需要有四維的下標,並且難以處理兩條路徑“不能重疊”的問題。

而我們回到原先“標準”的動態規劃法,就會發現這個問題很好解決,只需要加壹維狀態變量就成了。即用sk=(ak,bk)分別表示兩條路徑走到階段k時所處的位置,相應的,決策變量也增加壹維,用uk=(xk,yk)分別表示兩條路徑的行走方向。狀態轉移時將兩條路徑分別考慮:

在寫規劃方程時,只要對兩條路徑走到同壹個點的情況稍微處理壹下,減少可選的決策個數:

從這個例子中可以總結出設計動態規劃算法的壹個技巧:狀態轉移壹般是在相鄰的兩個階段之間(有時也可以在不相鄰的兩個階段間),但是盡量不要在同壹個階段內進行。

動態規劃是壹種很靈活的解題方法,在動態規劃算法的設計中,類似的技巧還有很多。要掌握動態規劃的技巧,有兩條途徑:壹是要深刻理解動態規劃的本質,這也是我們為什麽壹開始就探討它的本質的原因;二是要多實踐,不但要多解題,還要學會從解題中探尋規律,總結技巧。

§3動態規劃與壹些算法的比較

動態規劃作為諸多解題方法中的壹種,必然和其他壹些算法有著諸多聯系。從這些聯系中,我們也可以看出動態規劃的壹些特點。

§3.1動態規劃與遞推

——動態規劃是最優化算法

由於動態規劃的“名氣”如此之大,以至於很多人甚至壹些資料書上都往往把壹種與動態規劃十分相似的算法,當作是動態規劃。這種算法就是遞推。實際上,這兩種算法還是很容易區分的。

按解題的目標來分,信息學試題主要分四類:判定性問題、構造性問題、計數問題和最優化問題。我們在競賽中碰到的大多是最優化問題,而動態規劃正是解決最優化問題的有力武器,因此動態規劃在競賽中的地位日益提高。而遞推法在處理判定性問題和計數問題方面也是壹把利器。下面分別就兩個例子,談壹下遞推法和動態規劃在這兩個方面的聯系。

[例4] mod 4 最優路徑問題:在下圖中找出從第1點到第4點的壹條路徑,要求路徑長度mod 4的余數最小。

這個圖是壹個多段圖,而且是壹個特殊的多段圖。雖然這個圖的形式比壹般的多段圖要簡單,但是這個最優路徑問題卻不能用動態規劃來做。因為壹條從第1點到第4點的最優路徑,在它走到第2點、第3點時,路徑長度mod 4的余數不壹定是最小,也就是說最優策略的子策略不壹定最優——這個問題不滿足最優化原理。

但是我們可以把它轉換成判定性問題,用遞推法來解決。判斷從第1點到第k點的長度mod 4為sk的路徑是否存在,用fk(sk)來表示,則遞推公式如下:

(邊界條件)

(這裏lenk,i表示從第k-1點到第k點之間的第i條邊的長度,方括號表示“或(or)”運算)

最後的結果就是可以使f4(s4)值為真的最小的s4值。

這個遞推法的遞推公式和動態規劃的規劃方程非常相似,我們在這裏借用了動態規劃的符號也就是為了更清楚地顯示這壹點。其實它們的思想也是非常相像的,可以說是遞推法借用了動態規劃的思想解決了動態規劃不能解決的問題。

有的多階段決策問題(像這壹題的階段特征就很明顯),由於不能滿足最優化原理等使用動態規劃的先決條件,而無法應用動態規劃。在這時可以將最優指標函數的值當作“狀態”放到下標中去,從而變最優化問題為判定性問題,再借用動態規劃的思想,用遞推法來解決問題。

§3.2動態規劃與搜索

——動態規劃是高效率、高消費算法

同樣是解決最優化問題,有的題目我們采用動態規劃,而有的題目我們則需要用搜索。這其中有沒有什麽規則呢?

我們知道,撇開時空效率的因素不談,在解決最優化問題的算法中,搜索可以說是“萬能”的。所以動態規劃可以解決的問題,搜索也壹定可以解決。

把壹個動態規劃算法改寫成搜索是非常方便的,狀態轉移方程、規劃方程以及邊界條件都可以直接“移植”,所不同的只是求解順序。動態規劃是自底向上的遞推求解,而搜索則是自頂向下的遞歸求解(這裏指深度搜索,寬度搜索類似)。

反過來,我們也可以把搜索算法改寫成動態規劃。狀態空間搜索實際上是對隱式圖中的點進行枚舉,這種枚舉是自頂向下的。如果把枚舉的順序反過來,變成自底向上,那麽就成了動態規劃。(當然這裏有個條件,即隱式圖中的點是可排序的,詳見下壹節。)

正因為動態規劃和搜索有著求解順序上的不同,這也造成了它們時間效率上的差別。在搜索中,往往會出現下面的情況:

對於上圖(a)這樣幾個狀態構成的壹個隱式圖,用搜索算法就會出現重復,如上圖(b)所示,狀態C2被搜索了兩次。在深度搜索中,這樣的重復會引起以C2為根整個的整個子搜索樹的重復搜索;在寬度搜索中,雖然這樣的重復可以立即被排除,但是其時間代價也是不小的。而動態規劃就沒有這個問題,如上圖(c)所示。

壹般說來,動態規劃算法在時間效率上的優勢是搜索無法比擬的。(當然對於某些題目,根本不會出現狀態的重復,這樣搜索和動態規劃的速度就沒有差別了。)而從理論上講,任何拓撲有序(現實中這個條件常常可以滿足)的隱式圖中的搜索算法都可以改寫成動態規劃。但事實上,在很多情況下我們仍然不得不采用搜索算法。那麽,動態規劃算法在實現上還有什麽障礙嗎?

考慮上圖(a)所示的隱式圖,其中存在兩個從初始狀態無法達到的狀態。在搜索算法中,這樣的兩個狀態就不被考慮了,如上圖(b)所示。但是動態規劃由於是自底向上求解,所以就無法估計到這壹點,因而遍歷了全部的狀態,如上圖(c)所示。

壹般說來,動態規劃總要遍歷所有的狀態,而搜索可以排除壹些無效狀態。更重要的事搜索還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。

如何協調好動態規劃的高效率與高消費之間的矛盾呢?有壹種折衷的辦法就是記憶化算法。記憶化算法在求解的時候還是按著自頂向下的順序,但是每求解壹個狀態,就將它的解保存下來,以後再次遇到這個狀態的時候,就不必重新求解了。這種方法綜合了搜索和動態規劃兩方面的優點,因而還是很有實用價值的。

§3.3動態規劃與網絡流

——動態規劃是易設計易實現算法

由於圖的關系復雜而無序,壹般難以呈現階段特征(除了特殊的圖如多段圖,或特殊的分段方法如Floyd),因此動態規劃在圖論中的應用不多。但有壹類圖,它的點卻是有序的,這就是有向無環圖。

在有向無環圖中,我們可以對點進行拓撲排序,使其體現出有序的特征,從而據此劃分階段。在有向無還圖中求最短路徑的算法[4],已經體現出了簡單的動態規劃思想。但動態規劃在圖論中還有更有價值的應用。下面先看壹個例子。

[例6] N個人的街道問題:在街道問題(參見例3)中,若有N個人要從左下角走向右上角,要求他們走過的邊的總長度最大。當然,這裏每個人也只能向右或向上走。下面是壹個樣例,左圖是從出發地到目的地的三條路徑,右圖是他們所走過的邊,這些邊的總長度為5 + 4 + 3 + 6 + 3 + 3 + 5 + 8 + 8 + 7 + 4 + 5 + 9 + 5 + 3 = 78(不壹定是最大)。

這個題目是對街道問題的又壹次擴展。仿照街道問題的解題方法,我們仍然可以用動態規劃來解決本題。不過這壹次是N個人同時走,狀態變量也就需要用N維來表示,。相應的,決策變量也要變成N維,uk=(uk,1,uk,2,…,uk,N)。狀態轉移方程不需要做什麽改動:

在寫規劃方程時,需要註意在第k階段,N條路徑所走過的邊的總長度的計算,在這裏我就用gk(sk,uk)來表示了:

邊界條件為

可見將原來的動態規劃算法移植到這個問題上來,在理論上還是完全可行的。但是,現在的這個動態規劃算法的時空復雜度已經是關於N的指數函數,只要N稍微大壹點,這個算法就不可能實現了。

下面我們換壹個思路,將N條路徑看成是網絡中壹個流量為N的流,這樣求解的目標就是使這個流的費用最大。但是本題又不同於壹般的費用流問題,在每壹條邊e上的流費用並不是流量和邊權的乘積 ,而是用下式計算:

為了使經典的費用流算法適用於本題,我們需要將模型稍微轉化壹下:

如圖,將每條邊拆成兩條。拆開後壹條邊上有權,但是容量限制為1;另壹條邊沒有容量限制,但是流過這條邊就不能計算費用了。這樣我們就把問題轉化成了壹個標準的最大費用固定流問題。

這個算法可以套用經典的最小費用最大流算法,在此就不細說了。(參見附錄中的源程序)

這個例題是我仿照IOI97的“障礙物探測器”壹題[6]編出來的。“障礙物探測器”比這壹題要復雜壹些,但是基本思想是相似的。類似的題目還有99年冬令營的“迷宮改造”[7]。從這些題目中都可以看到動態規劃和網絡流的聯系。

推廣到壹般情況,任何有向無環圖中的費用流問題在理論上說,都可以用動態規劃來解決。對於流量為N(如果流量不固定,這個N需要事先求出來)的費用流問題,用N維的變量sk=(sk,1,sk,2,…,sk,N)來描述狀態,其中sk,i?V(1?i?N)。相應的,決策也用N維的變量uk=(uk,1,uk,2,…,uk,N)來表示,其中uk,i?E(sk,i)(1?i?N),E(v)表示指向v的弧集。則狀態轉移方程可以這樣表示:

sk-1,i = uk,i的弧尾結點

規劃方程為

邊界條件為

但是,由於動態規劃算法是指數級算法,因而在實現中的局限性很大,僅可用於壹些N非常小的題目。然而在競賽解題中,比如上面說到的IOI97以及99冬令營測試時,我們使用動態規劃的傾向性很明顯(“障礙物探測器”中,我們用的是貪心策略,求N=1或N=2時的局部最優解[8])。這主要有兩個原因:

壹. 雖然網絡流有著經典的算法,但是在競賽中不可能出現經典的問題。如果要運用網絡流算法,則需要經過壹番模型轉化,有時這個轉化還是相當困難的。因此在算法的設計上,靈活巧妙的動態規劃算法反而要更為簡單壹些。

二. 網絡流算法實現起來很繁,這是被人們公認的。因而在競賽的緊張環境中,實現起來有壹定模式的動態規劃算法又多了壹層優勢。

正由於動態規劃算法在設計和實現上的簡便性,所以在N不太大時,也就是在動態規劃可行的情況下,我們還是應該盡量運用動態規劃。

§4結語

本文的內容比較雜,是我幾年來對動態規劃的參悟理解、心得體會。雖然主要的篇幅講的都是理論,但是根本的目的還是指導實踐。

動態規劃,據我認為,是當今信息學競賽中最靈活、也最能體現解題者水平的壹類解題方法。本文內容雖多,不能涵蓋動態規劃之萬壹。“紙上得來終覺淺,絕知此事要躬行。”要想真正領悟、理解動態規劃的思想,掌握動態規劃的解題技巧,還需要在實踐中不斷地挖掘、探索。實踐得多了,也就能體會到漸入佳境之妙了。

  • 上一篇:制作聊天對話的軟件免費
  • 下一篇:CISCO路由器密碼如何恢復 CISCO路由器密恢復匯總詳解
  • copyright 2024編程學習大全網