动态规划
目录
一、带权的区间调度(一个递归过程)
1.问题
有n个需求,每个需求有一个开始时间 和一个结束时间 ,每个区间i还有一个值(或者权),我们的目标是接收一个两两相容得区间子集,使得所选区间得值之和 为最大。
2.设计与分析算法
此次的区间调度问题不再是所有值都为1的特殊情况,因此读多数贪心算法不能优化地求解这个问题。
二分选择:区间n属于一个最优解或者不属于一个最优解。
1)递归算法:
- 将需求按结束时间升序排列,即:.
- 对每一个区间,在集合 中选取与区间 不相交的且结束时间最大的区间,定为 .
- 对需求 求解最优解,令 为这个解的值, 表示最优解,可得
定理6.1
定理6.2 需求 属于集合上的最优解当且仅当
- 自顶而上,求出所有使权值之和变为最大的需求。
OPT(n)递归算法:
Compute-Opt(j)
If j=0 then
返回0
Else
返回
Endif
算法的正确性直接由在上的归纳得到:
定理6.3 对每个, 正确地计算了
存在的问题:最坏情况下将用指数时间运行(Fibonacci数)
2)递归的备忘录形式
备忘录:存储以算好的值
M-Compute-Opt(j)
If j=0 then
返回0
Else if 不空 then
返回
Else
定义
返回
Endif
定理6.4 M-Compute-Opt(n) 的运行时间是O(n)(假定输入区间按它们的最后时间存储)
3)获取最优解
利用上述算法,我们仅获得了一个最优解的值,而除了值,我们也想要一组最优的区间。 可以通过数组M“反向追踪”来找出最优解中的区间集合。
Find-Solution(j)
If j=0 then
什么也不输出
Else
if then
输出与Find-Solution(p(j))的结果
Else
输出 Find-Solution(j-1)的结果
Endif
Endif
定理6.5 给定这些子问题的最优值的数组M,Find-Solution 在O(n) 时间内返回一个最优解
二、动态规划原理:备忘录或者子问题迭代
动态规划的基本原理:
在子问题上迭代,而不是递归地计算解
先设计了一个指数时间的递归算法,然后把它转换成一个有效的递归算法
1.设计算法:
数组M[n]包含了整个实例的最优解的值,并且可以用Find-Solution通过M有效地向后追踪并且返回最优解本身。
因此我们可以不使用备忘录式的递归,通过迭代算法直接计算M中的项。
Iterative-Compute-Opt
M[0] = 0
For i=1,2,...,n
Endfor
2.分析算法
Iterative-Compute-Opt 运行时间为 ,它清楚地运行了n次迭代并且每次迭代用常数时间。
3.动态规划的基本要点
(i) 只存在多项式个子问题
(ii)可以容易地从子问题地解计算初始问题的解
(iii)在子问题从“最小”到“最大”存在一中自然的顺序,与一个容易计算的递推式相联系,这个递推式允许人们从某些更小的子问题的解来确定一个子问题的解。
三、分段的最小二乘:多重选择
1.分段的最小二乘问题
给定一组点 ,具有 ,我们用 表示点我们首先把P划分成若干端,每段是P的一个子集,表示连续的坐标的集合,即对每个下标 ,集合为.那么,对于在P的划分中的每段S,我们按
计算相对于S中点的误差最小的直线.
一个划分的罚分定义为下面的项之和:
(i)我们划分P的段数乘以一个给定的不变因子
(ii)对每段,通过那个段的最优直线的误差值
问题的目标是找一个最小罚分的划分。
2.设计算法
最后一个点 在最优化分中属于一段,并且那个段在某个比较早的点开始。
定理6.6 如果最优化分的最后一段是,那么最优解的值是: