5)分治法的復(fù)雜性分析
一個(gè)分治法將規(guī)模為n的問(wèn)題分成k個(gè)規(guī)模為n/m的子問(wèn)題去解。設(shè)分解閥值n0=1,且adhoc解規(guī)模為1的問(wèn)題耗費(fèi)1個(gè)單位時(shí)間。再設(shè)將原問(wèn)題分解為k個(gè)子問(wèn)題以及用merge將k個(gè)子問(wèn)題的解合并為原問(wèn)題的解需用f(n)個(gè)單位時(shí)間。用T(n)表示該分治法解規(guī)模為|P|=n的問(wèn)題所需的計(jì)算時(shí)間,則有:
T(n)= k T(n/m)+f(n)
通過(guò)迭代法求得方程的解:
遞歸方程及其解只給出n等于m的方冪時(shí)T(n)的值,但是如果認(rèn)為T(mén)(n)足夠平滑,那么由n等于m的方冪時(shí)T(n)的值可以估計(jì)T(n)的增長(zhǎng)速度。通常假定T(n)是單調(diào)上升的,從而當(dāng) mi≤n《mi+1時(shí),T(mi)≤T(n)《T(mi+1)。
2、動(dòng)態(tài)規(guī)劃算法
1)基本概念
動(dòng)態(tài)規(guī)劃過(guò)程是:每次決策依賴于當(dāng)前狀態(tài),又隨即引起狀態(tài)的轉(zhuǎn)移。一個(gè)決策序列就是在變化的狀態(tài)中產(chǎn)生出來(lái)的,所以,這種多階段最優(yōu)化決策解決問(wèn)題的過(guò)程就稱為動(dòng)態(tài)規(guī)劃。
2)基本思想與策略
基本思想與分治法類似,也是將待求解的問(wèn)題分解為若干個(gè)子問(wèn)題(階段),按順序求解子階段,前一子問(wèn)題的解,為后一子問(wèn)題的求解提供了有用的信息。在求解任一子問(wèn)題時(shí),列出各種可能的局部解,通過(guò)決策保留那些有可能達(dá)到最優(yōu)的局部解,丟棄其他局部解。依次解決各子問(wèn)題,最后一個(gè)子問(wèn)題就是初始問(wèn)題的解。
由于動(dòng)態(tài)規(guī)劃解決的問(wèn)題多數(shù)有重疊子問(wèn)題這個(gè)特點(diǎn),為減少重復(fù)計(jì)算,對(duì)每一個(gè)子問(wèn)題只解一次,將其不同階段的不同狀態(tài)保存在一個(gè)二維數(shù)組中。
與分治法最大的差別是:適合于用動(dòng)態(tài)規(guī)劃法求解的問(wèn)題,經(jīng)分解后得到的子問(wèn)題往往不是互相獨(dú)立的(即下一個(gè)子階段的求解是建立在上一個(gè)子階段的解的基礎(chǔ)上,進(jìn)行進(jìn)一步的求解)。
3)適用的情況
能采用動(dòng)態(tài)規(guī)劃求解的問(wèn)題的一般要具有3個(gè)性質(zhì):
?。?) 最優(yōu)化原理:如果問(wèn)題的最優(yōu)解所包含的子問(wèn)題的解也是最優(yōu)的,就稱該問(wèn)題具有最優(yōu)子結(jié)構(gòu),即滿足最優(yōu)化原理。
?。?) 無(wú)后效性:即某階段狀態(tài)一旦確定,就不受這個(gè)狀態(tài)以后決策的影響。也就是說(shuō),某狀態(tài)以后的過(guò)程不會(huì)影響以前的狀態(tài),只與當(dāng)前狀態(tài)有關(guān)。
(3)有重疊子問(wèn)題:即子問(wèn)題之間是不獨(dú)立的,一個(gè)子問(wèn)題在下一階段決策中可能被多次使用到。(該性質(zhì)并不是動(dòng)態(tài)規(guī)劃適用的必要條件,但是如果沒(méi)有這條性質(zhì),動(dòng)態(tài)規(guī)劃算法同其他算法相比就不具備優(yōu)勢(shì))
4)求解的基本步驟
動(dòng)態(tài)規(guī)劃所處理的問(wèn)題是一個(gè)多階段決策問(wèn)題,一般由初始狀態(tài)開(kāi)始,通過(guò)對(duì)中間階段決策的選擇,達(dá)到結(jié)束狀態(tài)。這些決策形成了一個(gè)決策序列,同時(shí)確定了完成整個(gè)過(guò)程的一條活動(dòng)路線(通常是求最優(yōu)的活動(dòng)路線)。如圖所示。動(dòng)態(tài)規(guī)劃的設(shè)計(jì)都有著一定的模式,一般要經(jīng)歷以下幾個(gè)步驟。
初始狀態(tài)→│決策1│→│決策2│→…→│決策n│→結(jié)束狀態(tài)
圖1 動(dòng)態(tài)規(guī)劃決策過(guò)程示意圖
?。?)劃分階段:按照問(wèn)題的時(shí)間或空間特征,把問(wèn)題分為若干個(gè)階段。在劃分階段時(shí),注意劃分后的階段一定要是有序的或者是可排序的,否則問(wèn)題就無(wú)法求解。
(2)確定狀態(tài)和狀態(tài)變量:將問(wèn)題發(fā)展到各個(gè)階段時(shí)所處于的各種客觀情況用不同的狀態(tài)表示出來(lái)。當(dāng)然,狀態(tài)的選擇要滿足無(wú)后效性。
(3)確定決策并寫(xiě)出狀態(tài)轉(zhuǎn)移方程:因?yàn)闆Q策和狀態(tài)轉(zhuǎn)移有著天然的聯(lián)系,狀態(tài)轉(zhuǎn)移就是根據(jù)上一階段的狀態(tài)和決策來(lái)導(dǎo)出本階段的狀態(tài)。所以如果確定了決策,狀態(tài)轉(zhuǎn)移方程也就可寫(xiě)出。但事實(shí)上常常是反過(guò)來(lái)做,根據(jù)相鄰兩個(gè)階段的狀態(tài)之間的關(guān)系來(lái)確定決策方法和狀態(tài)轉(zhuǎn)移方程。
(4)尋找邊界條件:給出的狀態(tài)轉(zhuǎn)移方程是一個(gè)遞推式,需要一個(gè)遞推的終止條件或邊界條件。
一般,只要解決問(wèn)題的階段、狀態(tài)和狀態(tài)轉(zhuǎn)移決策確定了,就可以寫(xiě)出狀態(tài)轉(zhuǎn)移方程(包括邊界條件)。
實(shí)際應(yīng)用中可以按以下幾個(gè)簡(jiǎn)化的步驟進(jìn)行設(shè)計(jì):
(1)分析最優(yōu)解的性質(zhì),并刻畫(huà)其結(jié)構(gòu)特征。
?。?)遞歸的定義最優(yōu)解。
(3)以自底向上或自頂向下的記憶化方式(備忘錄法)計(jì)算出最優(yōu)值
?。?)根據(jù)計(jì)算最優(yōu)值時(shí)得到的信息,構(gòu)造問(wèn)題的最優(yōu)解
5)算法實(shí)現(xiàn)的說(shuō)明
動(dòng)態(tài)規(guī)劃的主要難點(diǎn)在于理論上的設(shè)計(jì),也就是上面4個(gè)步驟的確定,一旦設(shè)計(jì)完成,實(shí)現(xiàn)部分就會(huì)非常簡(jiǎn)單。
使用動(dòng)態(tài)規(guī)劃求解問(wèn)題,最重要的就是確定動(dòng)態(tài)規(guī)劃三要素:
?。?)問(wèn)題的階段 (2)每個(gè)階段的狀態(tài)
(3)從前一個(gè)階段轉(zhuǎn)化到后一個(gè)階段之間的遞推關(guān)系。
遞推關(guān)系必須是從次小的問(wèn)題開(kāi)始到較大的問(wèn)題之間的轉(zhuǎn)化,從這個(gè)角度來(lái)說(shuō),動(dòng)態(tài)規(guī)劃往往可以用遞歸程序來(lái)實(shí)現(xiàn),不過(guò)因?yàn)檫f推可以充分利用前面保存的子問(wèn)題的解來(lái)減少重復(fù)計(jì)算,所以對(duì)于大規(guī)模問(wèn)題來(lái)說(shuō),有遞歸不可比擬的優(yōu)勢(shì),這也是動(dòng)態(tài)規(guī)劃算法的核心之處。
確定了動(dòng)態(tài)規(guī)劃的這三要素,整個(gè)求解過(guò)程就可以用一個(gè)最優(yōu)決策表來(lái)描述,最優(yōu)決策表是一個(gè)二維表,其中行表示決策的階段,列表示問(wèn)題狀態(tài),表格需要填寫(xiě)的數(shù)據(jù)一般對(duì)應(yīng)此問(wèn)題的在某個(gè)階段某個(gè)狀態(tài)下的最優(yōu)值(如最短路徑,最長(zhǎng)公共子序列,最大價(jià)值等),填表的過(guò)程就是根據(jù)遞推關(guān)系,從1行1列開(kāi)始,以行或者列優(yōu)先的順序,依次填寫(xiě)表格,最后根據(jù)整個(gè)表格的數(shù)據(jù)通過(guò)簡(jiǎn)單的取舍或者運(yùn)算求得問(wèn)題的最優(yōu)解。
f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}
6)動(dòng)態(tài)規(guī)劃算法基本框架
代碼
1 for(j=1; j《=m; j=j+1) // 第一個(gè)階段
2 xn[j] = 初始值;
3
4 for(i=n-1; i》=1; i=i-1)// 其他n-1個(gè)階段
5 for(j=1; j》=f(i); j=j+1)//f(i)與i有關(guān)的表達(dá)式
6 xi[j]=j=max(或min){g(xi-1[j1:j2]), 。。。。。。, g(xi-1[jk:jk+1])};
8
9 t = g(x1[j1:j2]); // 由子問(wèn)題的最優(yōu)解求解整個(gè)問(wèn)題的最優(yōu)解的方案
10
11 print(x1[j1]);
12
13 for(i=2; i《=n-1; i=i+1)
15 {
17 t = t-xi-1[ji];
18
19 for(j=1; j》=f(i); j=j+1)
21 if(t=xi[ji])
23 break;
25 }
評(píng)論
查看更多