文章目录
1. 问题
输入:
起点集合{S1,S2,… ,Sn}
终点集合{T1,T2,… ,Tm}
中间结点集
边集E,每条边都有相应的长度
输出:
一条从起点到终点的最短路 (从任意一个起点到任意一个终点,只要是最短路就行)
1.1 实例
绿色的为起点
黄色的为终点
灰色的为中间结点
连接的线为边集,边上的数字为长度
红线的两条路径都是最短的
2. 算法设计
2.1 蛮力算法
- 考查每一条从某个起点到某个终点的路径,计算长度,从中找出最短路径
在上述实例中,如果网络的层数为k,那么路径条数将接近于2k(每经过一个节结点有两条路)
2.2 动态规划算法:多阶段决策过程
每步求解的问题是后面阶段求解问题的子问题,每步决策将依赖于以前步骤的决策结果 (挑出子问题中的好的结果)
- 阶段一,考查后面子问题C的选择
- 先看C1,走上面好
- C2,走下面好
- C3都一样
- C4,走上面好
(图上为字母为up,down)
- 阶段二,考查B的选择 (考查B的时候还要连带着对C的分析,所以下图比如B1上面写的距离是11)
- …
- 最终
2.3 总结
2.3.1 子问题界定
后边界不变,前边界前移
2.3.2 最短路径的依赖关系(算法关键)
2.3.3 优化原则:最优子结构性质
- 一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列
如上图子问题就是最优的
2.3.4 一个反例
即求总长度除以10得到的余数最小
- 蓝色按照动态规划,每个子问题都是mod10后最优的决策
- 红色为实际
不满足优化原则(子问题最优但全局不一定优)不能用动态规划