当前位置:文档之家› 动态规划方法介绍

动态规划方法介绍

1.1 动态规划求解示例1.1.1 背包问题有一个徒步旅行者,已知他能承受的旅行背包的重量不超过a (kg )。

设有n 种物品可供他选择装入背包,这n 种物品分别编号为1,2,…,n 。

其中第i 种物品每件的重量为a i (kg ),其使用价值(指一件第i 种物品对旅行者来说所带来的好处的一种数量指标)为c i (i =1,2,…,n )。

问这位旅行者应如何选择携带这n 种物品的件数,使得总价值最大?分析:这是一个组合最优化问题,易将此问题归结为一个线性整数规划问题。

【建立线性规划模型】设旅行者选择携带第i 种物品的件数为i x ,不难看出,背包问题可以归结为如下的线性规划问题:11max s.t. 01,2,ni ii ni i i i z c x a x ax i n===≤≥=∑∑ 且为整数,,【建立动态规划模型】设把可装入背包的物品种类分为n 个阶段。

在第i 阶段先装入前i 种物品(i =1,2,…,n )。

在第i 阶段开始时,把旅行者背包中允许装入前i 种物品的总重量作为状态变量,设为y 。

装入每种物品的件数x i (i =1,2,…,n )为各阶段的决策变量。

变量说明:设()k f y 等于当背包中允许装入物品的总重量不超过y 和只允许装入前k 种物品采用最优策略时的最大使用价值。

(k =1,2,…,n )。

则11()max (1,2,,)k i i i kk i i i a x y f y c x k n ==≤==∑∑并且当k =n ,y =a 时,有11()max n i i i nn i i i a x a f a c x ==≤=∑∑显然()n f a 也就是上述线性规划模型的最优解。

把上式转化为递归方程:(属于前向算法){}1111010()max ()max () i k k y x a kk k k k k y x a f y c x f y c x f y a x ⎢⎥≤≤⎢⎥⎣⎦-⎢⎥≤≤⎢⎥⎣⎦=⎧⎪⎪⎨=+-⎪⎪⎩其中k x 为非负整数。

1.2 例子:运载问题【例子】有一辆最大货运量为10t 的卡车,用来装载三种货物。

每种货物的单位重量及相应的单位价值如表所示。

问应如何装载才能使总的价值最大?此装载问题就是背包问题。

此问题是一个典型的最优化问题,优化目标是卡车装载的总价值最大;装载当然越多越好,但又受到卡车本身的最大货运量的限制;所以此问题可以归结为如下的线性规划问题:设x i (i =1,2,3)分别表示装载第i 种货物的件数。

w i (i =1,2,3):第i 种货物的单位重量(单位:吨) c i (i =1,2,3):第i 种货物的单位价值y k (k =1,2,3)分别表示装载前i 种货物的货运量()k k f y 当背包中允许装入物品的总重量不超过y k 和只允许装入前k 种物品采用最优策略时的最大使用价值。

(k =1,2,3)。

即123123max ()456s.t. 34510f x x x x x x x =++++≤0i x ≥且为整数,i =1,2,31.2.1 前向算法建立动态规划模型可归结为动态规划问题,此问题的递归方程为11111111110()max{()}k k k k k k k k k k k y x w f y c x f y w x ++++++++++⎢⎥≤≤⎢⎥⎣⎦=+-k =1,2初始条件:11111103()max 443y x y f y x ⎢⎥≤≤⎢⎥⎣⎦⎢⎥==⎢⎥⎣⎦状态转移方程:111(1,2)k k k k y y w x k +++=-=具体如下:1231103221204332305()max 443()max {5(4)} ()max {6(5)}y x y x y x y f y x f y x f y x f y x f y x ⎢⎥≤≤⎢⎥⎣⎦⎢⎥≤≤⎢⎥⎣⎦⎢⎥≤≤⎢⎥⎣⎦⎧⎢⎥⎪==⎢⎥⎪⎣⎦⎪⎪=+-⎨⎪⎪=+-⎪⎪⎩要求得总价值最大即求3(10)f1.2.1.1 求解动态规划模型的Matlab 程序function [value]=MyFirstDP2%动态规划模型求解程序示例%以【背包问题】为例(一维背包问题)% P212~215,《组合数学》(修订本)孙世新,电子科技大学出版社 global M %M 矩阵第i 列针对第i 种货物的信息 M=[3 4 5; %第一行:单位重量 4 5 6]; %第二行:单位价值 value = getmaxvalue(3,10);%下面是一个子函数(属于递归函数) function value=getmaxvalue(k,y) global Mvalue = -inf; if k==1value = M(2,1)*fix(y/M(1,1));%对第一阶段(只包含第一个决策变量) which = fix(y/M(1,1));disp(sprintf('第%d 阶段f%d(%8.2f)=%8.2f=%d(单)*%d(决策)',k,k,y,value,M(2,k),which))returnendfor num=0 : fix(y/M(1,k))curvalue=M(2,k)*num + getmaxvalue(k-1,y-M(1,k)*num);if curvalue > valuevalue = curvalue;which=num;%存储第 k阶段的决策变量最优值end %ifend %fordisp(sprintf('第%d阶段f%d(%8.2f)=%8.2f=%d(单)*%d(决策)+f(%d,%8.2f)',...k,k,y,value,M(2,k),which,k-1,y-M(1,k)*which))1.2.1.2Matlab程序运行结果在命令行输入:MyFirstDP232=2;x1可见对这个问题建立线性整数规划模型与动态规划模型求解结果一致。

思考:得到决策是根据以上程序的输出字符串确定的,能否自动给出?(这是属于递归程序中有关回溯的问题)1.2.2后向算法建立动态规划模型可归结为动态规划问题,此问题的递归方程为3213305223204112103()max 665()max {5(4)} ()max {4(3)}y x y x y x y f y x f y x f y x f y x f y x ⎢⎥≤≤⎢⎥⎣⎦⎢⎥≤≤⎢⎥⎣⎦⎢⎥≤≤⎢⎥⎣⎦⎧⎢⎥⎪==⎢⎥⎪⎣⎦⎪⎪=+-⎨⎪⎪=+-⎪⎪⎩要求得总价值最大即求1(10)f1.2.2.1 求解动态规划模型的Matlab 程序function [value]=MyFirstDP1%动态规划模型求解程序示例%以【背包问题】为例(一维背包问题)% P212~215,《组合数学》(修订本)孙世新,电子科技大学出版社 %这是一个采用【后向算法】的动态规划建模方法global M %M 矩阵第i 列针对第i 种货物的信息 M=[3 4 5; %第一行:单位重量 4 5 6]; %第二行:单位价值value = getmaxvalue(1,10);%后向算法模型,这个就获得最优结果function value=getmaxvalue(k,y) global Mvalue = -inf; ek=3;%结束阶段 if k==ekvalue = M(2,ek)*fix(y/M(1,ek));%对第一阶段(只包含第一个决策变量) which = fix(y/M(1,ek));disp(sprintf('第%d 阶段f%d(%8.2f)=%8.2f=%d(单)*%d(决策)',k,k,y,value,M(2,k),which)) return endfor num=0 : fix(y/M(1,k))curvalue=M(2,k)*num + getmaxvalue(k+1,y-M(1,k)*num); if curvalue > value value = curvalue;which=num;%存储第 k 阶段的决策变量最优值 end %if end %fordisp(sprintf('第%d 阶段f%d(%8.2f)=%8.2f=%d(单)*%d(决策)+f(%d,%8.2f)',...k,k,y,value,M(2,k),which,k+1,y-M(1,k)*which))1.2.2.2Matlab程序运行结果在命令行输入:MyFirstDP132=2;x1可见对这个问题建立线性整数规划模型与动态规划模型求解结果一致。

(^_^):前向算法与后向算法结果一致1.2.3求解方法结果对比分析思考:从上面对同一个问题分别建立线性规划模型、动态规划模型,虽然结果一致,但有什么不同之处呢?动态规划结果更加全面,得到全局最优解。

1.3应用中面临的问题●动态规划方法没有通用的求解算法●将实际问题抽象为一个动态规划模型比较困难。

相关主题