动态规划讲解+例子共54页
- 格式:ppt
- 大小:4.44 MB
- 文档页数:54
动态规划算法详解及经典例题⼀、基本概念(1)⼀种使⽤多阶段决策过程最优的通⽤⽅法。
(2)动态规划过程是:每次决策依赖于当前状态,⼜随即引起状态的转移。
⼀个决策序列就是在变化的状态中产⽣出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
假设问题是由交叠的⼦问题所构成,我们就能够⽤动态规划技术来解决它。
⼀般来说,这种⼦问题出⾃对给定问题求解的递推关系中,这个递推关系包括了同样问题的更⼩⼦问题的解。
动态规划法建议,与其对交叠⼦问题⼀次重新的求解,不如把每⼀个较⼩⼦问题仅仅求解⼀次并把结果记录在表中(动态规划也是空间换时间的)。
这样就能够从表中得到原始问题的解。
(3)动态规划经常常使⽤于解决最优化问题,这些问题多表现为多阶段决策。
关于多阶段决策:在实际中,⼈们经常遇到这样⼀类决策问题,即因为过程的特殊性,能够将决策的全过程根据时间或空间划分若⼲个联系的阶段。
⽽在各阶段中。
⼈们都须要作出⽅案的选择。
我们称之为决策。
⽽且当⼀个阶段的决策之后,经常影响到下⼀个阶段的决策,从⽽影响整个过程的活动。
这样,各个阶段所确定的决策就构成⼀个决策序列,常称之为策略。
因为各个阶段可供选择的决策往往不⽌⼀个。
因⽽就可能有很多决策以供选择,这些可供选择的策略构成⼀个集合,我们称之为同意策略集合(简称策略集合)。
每⼀个策略都对应地确定⼀种活动的效果。
我们假定这个效果能够⽤数量来衡量。
因为不同的策略经常导致不同的效果,因此,怎样在同意策略集合中选择⼀个策略,使其在预定的标准下达到最好的效果。
经常是⼈们所关⼼的问题。
我们称这种策略为最优策略,这类问题就称为多阶段决策问题。
(4)多阶段决策问题举例:机器负荷分配问题某种机器能够在⾼低两种不同的负荷下进⾏⽣产。
在⾼负荷下⽣产时。
产品的年产量g和投⼊⽣产的机器数量x的关系为g=g(x),这时的年完善率为a,即假设年初完善机器数为x,到年终时完善的机器数为a*x(0<a<1);在低负荷下⽣产时,产品的年产量h和投⼊⽣产的机器数量y 的关系为h=h(y)。
动态规划典型案例解析及计算过程梳理动态规划(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),即选择当前物品或不选择当前物品所能获得的最大价值。
动态规划算法详解及经典例题动态规划什么是动态规划?动态规划的⼤致思路是把⼀个复杂的问题转化成⼀个分阶段逐步递推的过程,从简单的初始状态⼀步⼀步递推,最终得到复杂问题的最优解。
基本思想与策略编辑:由于动态规划解决的问题多数有重叠⼦问题这个特点,为减少重复计算,对每⼀个⼦问题只解⼀次,将其不同阶段的不同状态保存在⼀个⼆维数组中。
1. 拆分问题:根据问题的可能性把问题划分成通过递推或者递归⼀步⼀步实现。
关键就是这个步骤,动态规划有⼀类问题就是从后往前推到,有时候我们很容易知道 : 如果只有⼀种情况时,最佳的选择应该怎么做.然后根据这个最佳选择往前⼀步推导,得到前⼀步的最佳选择 2. 定义问题状态和状态之间的关系:⽤⼀种量化的形式表现出来,类似于⾼中学的推导公式,因为这种式⼦很容易⽤程序写出来,也可以说对程序⽐较亲和(也就是最后所说的状态转移⽅程式) 3. 动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若⼲个⼦问题(阶段),按顺序求解⼦阶段,前⼀⼦问题的解,为后⼀⼦问题的求解提供了有⽤的信息。
在求解任⼀⼦问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。
依次解决各⼦问题,最后⼀个⼦问题就是初始问题的解。
我的理解是:⽐如我们找到最优解,我们应该讲最优解保存下来,为了往前推导时能够使⽤前⼀步的最优解,在这个过程中难免有⼀些相⽐于最优解差的解,此时我们应该放弃,只保存最优解,这样我们每⼀次都把最优解保存了下来,⼤⼤降低了时间复杂度。
动态规划解决问题的过程分为两步:1.寻找状态转移⽅程式2.利⽤状态转移⽅程式⾃底向上求解问题动态规划原理使⽤条件:可分为多个相关⼦问题,⼦问题的解被重复使⽤使⽤条件:可分为多个相关⼦问题,⼦问题的解被重复使⽤Optimal substructure(优化⼦结构):⼀个问题的优化解包含了⼦问题的优化解缩⼩⼦问题集合,只需那些优化问题中包含的⼦问题,降低实现复杂性我们可以⾃下⽽上的Subteties(重叠⼦问题):在问题的求解过程中,很多⼦问题的解将被多次使⽤。