算法设计与分析课程复习笔记7——动态规划
动态规划
- 和分治法一样,是一种算法设计技术。
- 子问题非独立。
- 分治法通过递归方式解决性质相同的子问题,
而动态规划每次解决一个子问题,并将结果存储在表格中。 - 用于优化类问题。
算法:
- 描述最优解的结构特征
- 定义最优解决方案的递归形式
- 以自底向上的方式计算最优解决方案的值
- 从计算信息构造出最优解决方案
装配线排程
S1,1,S1,2,……,S1,n;S2,1,S2,2,……,S2,nS_{1,1},S_{1,2},……,S_{1,n};S_{2,1},S_{2,2},……,S_{2,n}S1,1,S1,2,……,S1,n;S2,1,S2,2,……,S2,n为两条装配线的工序站台
a1,1,a1,2,……,a1,n;a2,1,a2,2,……,a2,na_{1,1},a_{1,2},……,a_{1,n};a_{2,1},a_{2,2},……,a_{2,n}a1,1,a1,2,……,a1,n;a2,1,a2,2,……,a2,n为两条装配线的各站台工作时间
每条装配线的第j个站台的功能相同,但是效率不一致,即花费时间不同。
另外有上线时间e1,e2e_1,e_2e1,e2和下线时间x1,x2x_1,x_2x1,x2
以及从一条装配线变换到另一条装配线需要的时间t1,1,t1,2,……,t1,n−1;t2,1,t2,2,……,t2,n−1t_{1,1},t_{1,2},……,t_{1,n-1};t_{2,1},t_{2,2},……,t_{2,n-1}t1,1,t1,2,……,t1,n−1;t2,1,t2,2,……,t2,n−1
问题:如何充分利用两条装配线,使得组装一辆汽车的时间最短?
解决方法:
1️⃣蛮力法
计算装配线排程所有可能的组合情况,比较并选择出最短时间的组合
2️⃣动态规划
【1】.构建最优解
考虑所有从起点到达S1,jS_{1,j}S1,j可能途径
只有两种可能:
①从S1,j−1S_{1,j-1}S1,j−1直接到S1,jS_{1,j}S1,j
②从S2,j−1S_{2,j-1}S2,j−1花费t2,j−1t_{2,j-1}t2,j−1时间转换到S1,jS_{1,j}S1,j
如果到达S1,jS_{1,j}S1,j的最快装配路线来自S1,j−1S_{1,j-1}S1,j−1那么必须是从装配线起点经过S1,j−1S_{1,j-1}S1,j−1的最快装配路线。S2,j−1S_{2,j-1}S2,j−1同理分析。
最优解的结构
寻求从起点到达S1,jS_{1,j}S1,j最快装配路线,可分解为寻求从起点经过S1,j−1S_{1,j-1}S1,j−1 or S2,j−1S_{2,j-1}S2,j−1 最快装配路线问题。
我们将这种具有分解递归特征的解的形式称为最优化结构特征。
利用这种优化构造特征,从子问题的最优化解获得整个问题的最优化的解。
【2】.递归解
利用子问题的最优解,通过递归的方式求解原问题的最优解
f∗f*f∗为完成所有装配过程的最短时间。
fi[j]f_i[j]fi[j]表示从起点经过Si,j工序的最短时间.
f∗=min(f1[n]+x1,f2[n]+x2)f* = min (f_1[n] + x_1, f_2[n] + x_2)f∗=min(f1[n]+x1,f2[n]+x