动态规划
简介
目的:求解最优解问题;
思想:组合子问题的解来求解原问题;
一. 可以解决哪些问题:
1. 问题的目标是求解一个问题的最优解;
2. 整体问题的最优解依赖于各个子问题的最优解;
3. 大问题分解成若干小问题,且这些小问题还可能继续分解为若干更小的问题;
4. 从上向下分析问题,从下向上解决问题。
二. 设计动态规划的方法:
- 刻画一个最优解结构特征:
即要求满足题目要求的解的特征;例如,总价值最高,重量最大等。 - 递归定义最优解:
求解自身问题的最优解前提是需要知道比自身问题规模小的所有问题的最优解。 - 计算最优解值:
由已知的规模更小的最优解计算出当前规模问题的最优解值; - 利用计算出的信息构造一个最优解:
在执行步骤3的过程中,存储维护一些额外信息就可以构造出得到一个最优解的过程方案。
举例
钢条切割问题
以下问题由于价格数组只设置到长度为10,所以限定钢条长度必须小于等于10
问题描述
- 某公司购买长钢条,并将其切割成短钢条出售,切割工序本身无成本,求最佳切割方案;
- 假定该公司出售一段长度为 i 英寸的钢条价格为 Pi(i=1,2,3,4…,n),求切割方案。钢条价格表部分实例如下:
长度i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
价格Pi | 1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 24 | 30 |
- 要求:给定一段长度为n英寸的钢条和一个价格表,求切割钢条方案,使销售收益Rn最大。
问题分析
- 一般想法:
穷尽所有方案,并计算出各个方案的收益,从而找出最大收益。此时,长度为n的钢条可以有 2 n − 1 2^{n-1} 2n−1种不同的方案(可以切割任意整数长度的钢条),原因是:
在距离钢条左端i处,都可以选择切割或者不切割,因此距离钢条左端每隔一个单位长度处都有两种选择,因此共有 2 n − 1 2^{n-1} 2n−1种不同方案。显然该方案时间复杂度太高,当n较大时,运行时间过长,并且长度每增加1,运行时间翻倍,所以不适合。(注:可以采用非递减切割方式来减少方案总数,但是仍然过于复杂) - 运用递归的思想:
- 为什么可以采用递归:
我们可以将问题简化为只切割一次,并且假设切割后的两端钢条为N1和n-N1长度,且该两端钢条也已切割为满足最大收益的长度,因此我们只需考虑将钢条切割为两端时共有多少种方案。找出两个子问题所求得的最大收益之和,从而减少计算,并转化为求解子问题最优解的过程,通过此种方式减小问题规模(从上向下分析)。通过该方法,从而产生一个问题:就是如何知道切割成长度为多少分两条钢条,收益最佳?所以我们需要计算所有子问题的最优解,而子问题的最优解如何获得?答案是继续将子问题继续分解为规模更小的子问题,直到问题的规模小到我们可以轻易解决,然后通过组合子问题的最优解回溯得到规模较大的子问题的最优解,一直回溯到得到最终问题的最优解为止(自底向上解决),此时用数学公式表示为:
r n = m a x ( p n , r 1 + r n − 1 , r 2 + r n − 2 , . . . , r n − 1 + r 1 ) r_{n}= max(p_{n},r_{1}+r_{n-1},r_{2}+r_{n-2},...,r_{n-1}+r_{1}) rn=max(pn,r
- 为什么可以采用递归: