动态规划讲解大全(含例题及答案)
- 格式:doc
- 大小:45.00 KB
- 文档页数:19
例1:机器负荷分配问题某公司新购进1000台机床,每台机床都可在高、低两种不同的负荷下进行生产,设在高负荷下生产的产量函数为g(x )=10x (单位:百件),其中x 为投入生产的机床数量,年完好率为a =0.7;在低负荷下生产的产量函数为h(y)=6y (单位:百件),其中y 为投人生产的机床数量,年完好率为b=0.9。
计划连续使用5年,试问每年如何安排机床在高、低负荷下的生产计划,使在五年内生产的产品总产量达到最高。
例2:某企业通过市场调查,估计今后四个时期市场对某种产品的需要量如下表:时期(k) 12 3 4 需要量(d k )2(单位)324假定不论在任何时期,生产每批产品的固定成本费为3(千元),若不生产,则为零;生产单位产品成本费为1(千元);每个时期生产能力所允许的最大生产批量为不超过6个单位,则任何时期生产x 个单位产品的成本费用为:若 0<x ≤6 , 则生产总成本=3十1·x 若 x =0 , 则生产总成本=0又设每个时期末未销售出去的产品,在一个时期内单位产品的库存费用为0.5(千元),同时还假定第1时期开始之初和在第4个时期之末,均无产品库存。
现在我们的问题是;在满足上述给定的条件下,该厂如何安排各个时期的生产与库存,使所花的总成本费用最低?例3:设某企业在第一年初购买一台新设备,该设备在五年内的年运行收益、年运行费用及更换新设备的净费用如下表:(单位:万元)年份(k) 役龄(t) 运行收益()k g t 运行费用()k r t 更新费用()k c t 第一年 0 22 6 18 第二年0 123 216 819 22第三年0122321185710192328第四年01232422191657101520243038第五年01234252320171446914202024303848试为该企业制定一个五年中的设备更新策略,使得企业在五年内总收益达到最大?例4:设有一辆栽重为10吨的卡车,用以装载三种货物,每种货物的单位重量及单件价值如表所示,问各种货物应装多少件,才能既不超过总重量又使总价值最大?货物 1 2 3单位重量 3 4 5单件价值 4 5 6。
动态规划典型案例解析及计算过程梳理动态规划(Dynamic Programming)是一种通过将问题分解为子问题来解决复杂问题的算法策略。
它通常用于优化问题,通过将问题的解决方案划分为相互重叠的子问题来降低计算复杂度。
下面将通过几个典型案例,详细解析动态规划的应用及其计算过程。
1. 斐波那契数列斐波那契数列是一种经典的动态规划问题。
它的定义是:F(n) =F(n-1) + F(n-2),其中F(0) = 0,F(1) = 1。
我们需要计算第n个斐波那契数。
通过动态规划的思想,可以将该问题划分为子问题,即计算第n-1和第n-2个斐波那契数。
可以使用一个数组来保存已经计算过的斐波那契数,避免重复计算。
具体的计算过程如下:1. 初始化一个长度为n+1的数组fib,将fib[0]设置为0,fib[1]设置为1。
2. 从i=2开始遍历到n,对于每个i,计算fib[i] = fib[i-1] + fib[i-2]。
3. 返回fib[n]作为结果。
通过上述过程,我们可以快速地得到第n个斐波那契数。
这个案例展示了动态规划的重要特性,即将问题分解为子问题进行求解,并利用已经计算过的结果来避免重复计算。
2. 背包问题背包问题是另一个常见的动态规划问题。
问题的定义是:有一组物品,每个物品有自己的重量和价值,在限定的背包容量下,如何选择物品使得背包中的总价值最大化。
通过动态规划的思想,背包问题可以被划分为子问题。
我们可以定义一个二维数组dp,其中dp[i][j]表示在前i个物品中,背包容量为j时的最大价值。
具体的计算过程如下:1. 初始化一个大小为n+1行,m+1列的二维数组dp,其中n为物品数量,m为背包容量。
将所有元素初始化为0。
2. 从i=1开始遍历到n,对于每个i,从j=1开始遍历到m,对于每个j,进行如下判断:- 若当前物品的重量大于背包容量j,则dp[i][j] = dp[i-1][j],即不选择当前物品;- 若当前物品的重量小于等于背包容量j,则dp[i][j] = max(dp[i-1][j], dp[i-1][j-wi] + vi),即选择当前物品或不选择当前物品所能获得的最大价值。
第9章动态规划应用举例习题详解(习题)9. 1有一部货车每天沿着公路给四个零售店卸下6箱货物,如果各零售店出售该货物所得利润如表9-1所示,试求在各零售店卸下几箱货物,能使获得总利润最大?其值是多少?9.2设有某种肥料共6个单位重量,准备供给四块粮田用。
其每块田施肥数量与增产粮食数字关系如表9-2所示。
试求对每块田施多少单位重量的肥料,才使总的增产粮食最多。
粮田增肥1234000001202518282424539473605761654756578745857090806907395859.3某公司打算向它的三个营业区增设六个销售店,每个营业区至少增设一个。
从各区赚取的利润(单位为万元)与增设的销售店个数有关,其数据如表9-3所示。
销售店增加数A区利润B区利润C区利润9.4某工厂有100台机器,拟分四个周期使用,在每一周期有两种生产任务。
据经验,把机器q 台投入第一种生产任务,则在一个生产周期中将有;n/3台机器作废;余下的机器全部投入第二种生产任务,则有1/10台机器作废。
如果干第一种生产任务每台机器可收益10, 干第二种生产任务每台机器可收益7。
问怎样分配机器,使总收益最大?9. 5设有三种资源,每单位的成本分别为a、b. co给定的利润函数为n(xi, yi,z),(/ = 1,2,•••,«)现有资金为W,应购买各种资源多少单位分配给"个行业,才能使总利润最大。
试给出动态规划的公式,并写出它的一维递推关系式。
9. 6某厂生产一种产品,估计该产品在未来4个月的销售量分别为400、500、300、200件。
该项产品的生产准备费用每批为500元,每件的生产费用为1元,存储费用每件每月为1 元。
假定1月初的存货为100件,4月底的存货为零。
试求该厂在这4个月内的最优生产计划。
9.7某电视机厂为生产电视机而需生产喇叭,生产以万只为单位。
根据以往记录,一年的四个季度需要喇叭分别是3万、2万、3万、2万只。
动态规划算法详解及经典例题⼀、基本概念(1)⼀种使⽤多阶段决策过程最优的通⽤⽅法。
(2)动态规划过程是:每次决策依赖于当前状态,⼜随即引起状态的转移。
⼀个决策序列就是在变化的状态中产⽣出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
假设问题是由交叠的⼦问题所构成,我们就能够⽤动态规划技术来解决它。
⼀般来说,这种⼦问题出⾃对给定问题求解的递推关系中,这个递推关系包括了同样问题的更⼩⼦问题的解。
动态规划法建议,与其对交叠⼦问题⼀次重新的求解,不如把每⼀个较⼩⼦问题仅仅求解⼀次并把结果记录在表中(动态规划也是空间换时间的)。
这样就能够从表中得到原始问题的解。
(3)动态规划经常常使⽤于解决最优化问题,这些问题多表现为多阶段决策。
关于多阶段决策:在实际中,⼈们经常遇到这样⼀类决策问题,即因为过程的特殊性,能够将决策的全过程根据时间或空间划分若⼲个联系的阶段。
⽽在各阶段中。
⼈们都须要作出⽅案的选择。
我们称之为决策。
⽽且当⼀个阶段的决策之后,经常影响到下⼀个阶段的决策,从⽽影响整个过程的活动。
这样,各个阶段所确定的决策就构成⼀个决策序列,常称之为策略。
因为各个阶段可供选择的决策往往不⽌⼀个。
因⽽就可能有很多决策以供选择,这些可供选择的策略构成⼀个集合,我们称之为同意策略集合(简称策略集合)。
每⼀个策略都对应地确定⼀种活动的效果。
我们假定这个效果能够⽤数量来衡量。
因为不同的策略经常导致不同的效果,因此,怎样在同意策略集合中选择⼀个策略,使其在预定的标准下达到最好的效果。
经常是⼈们所关⼼的问题。
我们称这种策略为最优策略,这类问题就称为多阶段决策问题。
(4)多阶段决策问题举例:机器负荷分配问题某种机器能够在⾼低两种不同的负荷下进⾏⽣产。
在⾼负荷下⽣产时。
产品的年产量g和投⼊⽣产的机器数量x的关系为g=g(x),这时的年完善率为a,即假设年初完善机器数为x,到年终时完善的机器数为a*x(0<a<1);在低负荷下⽣产时,产品的年产量h和投⼊⽣产的机器数量y的关系为h=h(y)。
动态规划讲解大全动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。
20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。
1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。
动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。
例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。
虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。
动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。
不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。
动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。
因此读者在学习时,除了要对根本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。
我们也可以通过对假设干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。
根本模型多阶段决策过程的最优化问题。
在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成假设干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程到达最好的活动效果。
当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的开展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线,如下图:〔看词条图〕这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题就称为多阶段决策问题。
记忆化搜索给你一个数字三角形, 形式如下:12 34 5 67 8 9 10找出从第一层到最后一层的一条路,使得所经过的权值之和最小或者最大.无论对与新手还是老手,这都是再熟悉不过的题了,很容易地,我们写出状态转移方程:f(i, j)=a[i, j] + min{f(i+1, j),f(i+1, j + 1)}对于动态规划算法解决这个问题,我们根据状态转移方程和状态转移方向,比拟容易地写出动态规划的循环表示方法。
但是,当状态和转移非常复杂的时候,也许写出循环式的动态规划就不是那么简单了。
解决方法:我们尝试从正面的思路去分析问题,如上例,不难得出一个非常简单的递归过程 :f1:=f(i-1,j+1); f2:=f(i-1,j);if f1>f2 then f:=f1+a[i,j] else f:=f2+a[i,j];显而易见,这个算法就是最简单的搜索算法。
时间复杂度为2n,明显是会超时的。
分析一下搜索的过程,实际上,很多调用都是不必要的,也就是把产生过的最优状态,又产生了一次。
为了防止浪费,很显然,我们存放一个opt数组:Opt[i, j] - 每产生一个f(i, j),将f(i, j)的值放入opt中,以后再次调用到f(i, j)的时候,直接从opt[i, j]来取就可以了。
于是动态规划的状态转移方程被直观地表示出来了,这样节省了思维的难度,减少了编程的技巧,而运行时间只是相差常数的复杂度,防止了动态规划状态转移先后的问题,而且在相当多的情况下,递归算法能更好地防止浪费,在比赛中是非常实用的.状态决策决策:当前状态通过决策,回到了以前状态.可见决策其实就是状态之间的桥梁。
而以前状态也就决定了当前状态的情况。
数字三角形的决策就是选择相邻的两个以前状态的最优值。
状态:我们一般在动规的时候所用到的一些数组,也就是用来存储每个状态的最优值的。
我们就从动态规划的要诀,也就是核心局部“状态〞开始,来逐步了解动态规划。
有时候当前状态确定后,以前状态就已经确定,那么无需枚举.动态规划算法的应用一、动态规划的概念近年来,涉及动态规划的各种竞赛题越来越多,每一年的NOI几乎都至少有一道题目需要用动态规划的方法来解决;而竞赛对选手运用动态规划知识的要求也越来越高,已经不再停留于简单的递推和建模上了。
要了解动态规划的概念,首先要知道什么是多阶段决策问题。
1. 多阶段决策问题如果一类活动过程可以分为假设干个互相联系的阶段,在每一个阶段都需作出决策(采取措施),一个阶段的决策确定以后,常常影响到下一个阶段的决策,从而就完全确定了一个过程的活动路线,那么称它为多阶段决策问题。
各个阶段的决策构成一个决策序列,称为一个策略。
每一个阶段都有假设干个决策可供选择,因而就有许多策略供我们选取,对应于一个策略可以确定活动的效果,这个效果可以用数量来确定。
策略不同,效果也不同,多阶段决策问题,就是要在可以选择的那些策略中间,选取一个最优策略,使在预定的标准下到达最好的效果.2.动态规划问题中的术语阶段:把所给求解问题的过程恰当地分成假设干个相互联系的阶段,以便于求解,过程不同,阶段数就可能不同.描述阶段的变量称为阶段变量。
在多数情况下,阶段变量是离散的,用k表示。
此外,也有阶段变量是连续的情形。
如果过程可以在任何时刻作出决策,且在任意两个不同的时刻之间允许有无穷多个决策时,阶段变量就是连续的。
在前面的例子中,第一个阶段就是点A,而第二个阶段就是点A到点B,第三个阶段是点B到点C,而第四个阶段是点C到点D。
状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因素。
在上面的例子中状态就是某阶段的出发位置,它既是该阶段某路的起点,同时又是前一阶段某支路的终点。
在前面的例子中,第一个阶段有一个状态即A,而第二个阶段有两个状态B1和B2,第三个阶段是三个状态C1,C2和C3,而第四个阶段又是一个状态D。
过程的状态通常可以用一个或一组数来描述,称为状态变量。
一般,状态是离散的,但有时为了方便也将状态取成连续的。
当然,在现实生活中,由于变量形式的限制,所有的状态都是离散的,但从分析的观点,有时将状态作为连续的处理将会有很大的好处。
此外,状态可以有多个分量(多维情形),因而用向量来代表;而且在每个阶段的状态维数可以不同。
当过程按所有可能不同的方式开展时,过程各段的状态变量将在某一确定的范围内取值。
状态变量取值的集合称为状态集合。
无后效性:我们要求状态具有下面的性质:如果给定某一阶段的状态,那么在这一阶段以后过程的开展不受这阶段以前各段状态的影响,所有各阶段都确定时,整个过程也就确定了。
换句话说,过程的每一次实现可以用一个状态序列表示,在前面的例子中每阶段的状态是该线路的始点,确定了这些点的序列,整个线路也就完全确定。
从某一阶段以后的线路开始,当这段的始点给定时,不受以前线路〔所通过的点〕的影响。
状态的这个性质意味着过程的历史只能通过当前的状态去影响它的未来的开展,这个性质称为无后效性。
决策:一个阶段的状态给定以后,从该状态演变到下一阶段某个状态的一种选择〔行动〕称为决策。
在最优控制中,也称为控制。
在许多间题中,决策可以自然而然地表示为一个数或一组数。
不同的决策对应着不同的数值。
描述决策的变量称决策变量,因状态满足无后效性,故在每个阶段选择决策时只需考虑当前的状态而无须考虑过程的历史。
决策变量的范围称为允许决策集合。
策略:由每个阶段的决策组成的序列称为策略。
对于每一个实际的多阶段决策过程,可供选取的策略有一定的范围限制,这个范围称为允许策略集合。
允许策略集合中到达最优效果的策略称为最优策略。
给定k阶段状态变量x(k)的值后,如果这一阶段的决策变量一经确定,第k+1阶段的状态变量x(k+1)也就完全确定,即x(k+1)的值随x(k)和第k阶段的决策u(k)的值变化而变化,那么可以把这一关系看成(x(k),u(k))与x(k+1)确定的对应关系,用x(k+1)=Tk(x(k),u(k))表示。
这是从k阶段到k+1阶段的状态转移规律,称为状态转移方程。
最优性原理:作为整个过程的最优策略,它满足:相对前面决策所形成的状态而言,余下的子策略必然构成“最优子策略〞。
D也是B1到D的最短路径……──事实正是如此,因此我们认为这个例子满足最优性原理的要求。
C2C2是A到C2的最短路径,B1B1D,这些点的选择构成了这个例子的最优策略,根据最优性原理,这个策略的每个子策略应是最优:A C2B1最优性原理实际上是要求问题的最优策略的子策略也是最优。
让我们通过对前面的例子再分析来具体说明这一点:从A到D,我们知道,最短路径是A动态规划练习题USACO 2.2 Subset Sums题目如下:对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。
举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:and {1,2}这是唯一一种分发〔交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数〕如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:{1,6,7} and {2,3,4,5} {注 1+6+7=2+3+4+5}{2,5,7} and {1,3,4,6}{3,4,7} and {1,2,5,6}{1,2,4,7} and {3,5,6}给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,那么输出0。
程序不能预存结果直接输出。
PROGRAM NAME: subsetINPUT FORMAT输入文件只有一行,且只有一个整数NSAMPLE INPUT (file subset.in)7OUTPUT FORMAT输出划分方案总数,如果不存在那么输出0。
SAMPLE OUTPUT (file subset.out)4参考程序如下:#include <fstream>using namespace std;const unsigned int MAX_SUM = 1024;int n;unsigned long long int dyn[MAX_SUM];ifstream fin ("subset.in");ofstream fout ("subset.out");int main() {fin >> n;fin.close();int s = n*(n+1);if (s % 4) {fout << 0 << endl;fout.close ();return ;}s /= 4;int i, j;dyn [0] = 1;for (i = 1; i <= n; i++)for (j = s; j >= i; j--)dyn[j] += dyn[j-i];fout << (dyn[s]/2) << endl;fout.close();return 0;}USACO 2.3 Longest Prefix题目如下:在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。