当前位置:文档之家› 例:动态规划解最短路径问题:

例:动态规划解最短路径问题:

● 例:动态规划解最短路径问题:
步骤(1)、(2)已实现。

最优子结构:从起点到终点的最短路径包含了该路径
上各点到终点的最短路径。

递归公式:设v 为图中一个顶点,v 1, v 2,…, v m 为v 的
直接后继,cost(v)表示v 到终点的最短路径
长度,c[u, w]表示边<u,w>上的权,t 为终点,
则cost 满足如下递归公式:
⎪⎪⎩
⎪⎪⎨⎧≠∞=≠+=≤≤无后继且有后继且v t v , t
v , 0v t v , )}cost(v ] v {c[v,min cost(v)i i m i 1
步骤(3) 计算最优值(求最短路径长度):
设有向网G含n个顶点,用邻接矩阵c[1..n, 1..n]表示,起点为s,终点为t 。

有关信息的保存:
数组cost[1..n]: 存储子问题的解。

(cost[i]表示从顶点i到终点t的最短路径长
度。


数组succ[1..n]: 存储最短路径的有关信息。

(succ[i]表示顶点i到终点t的最短路径上顶
点i的直接后继。


原问题的最优值为cost[s]。

(1) 自底向上的迭代算法
关键:根据递归公式确定迭代顺序(即子问题的求解顺序)。

原则:计算cost[i]时,顶点i的所有后继的cost值应先计算。

计算顺序:按图G的逆拓扑排序顺序。

算法SHORTEST_ROUTE_LEN1
输入:有向网G的顶点数n, 邻接矩阵c[1..n, 1..n], 起点s和终点t , 1<=s, t<=n。

输出:G的从起点s到终点t的最短路径长度cost[s]和最短路径有关信息的数组succ[1..n]。

//对图G拓扑排序,结果存于数组a[1..n]
中。

toposort(c, n, a)
j=n
while a[j]< >t j=j-1 //找出j使得a[j]=t 。

for i=j+1 to n cost[a[j]]=∞//排除无关的顶
点。

cost[t]=0 //从终点开始迭代。

while a[j]< >s
j=j-1; k=a[j]; i0=0 ; min=∞
for i=1 to n
if c[k, i]+cost[i]<min then
i0=i; min=c[k, i]+cost[i]
end if
end for
cost[k]=min ; succ[k]=i0
end while
end SHORTEST_ROUTE_LEN1
(2) 自顶向下的递归算法
关键:对每个子问题标记是否计算过,同一子问题只在第一次递归调用时计算并存储结果。

标记:未求出cost[i]时,cost[i]=-1 。

算法SHORTEST_ROUTE_LEN2
输入:有向网G的顶点数n, 邻接矩阵c[1..n, 1..n], 起点s和终点t , 1<=s, t<=n。

输出:G的从起点s到终点t的最短路径长度minlen 和最短路径有关信息的数组succ[1..n]。

for i=1 to n cost[i]=-1
minlen=routelength(s)
end SHORTEST_ROUTE_LEN2
过程routelength( j )
// 求G中从顶点j到终点t的最短路径长度
cost[j]并返回,//同时求该路径上各顶点的直接
后继存于数组succ中。

if cost[j]=-1 then //cost[j]还未求出
if j=t then cost[j]=0
else
min=∞ ; i0=0
for i=1 to n
if c[j, i]< ∞ then //顶点i为顶点j的后继
x=routelength( i ) //求i到t的最短路
径长度
if c[j, i]+x<min then
min=c[j, i]+x; i0=i
end if
end if
end for
cost[j]=min; succ[j]=i0;
end if
end if
return cost[j]
end routelength
步骤(4) 构造最优解(设存在从起点s到终点的路径) 算法SHORTEST_ROUTE
输入:有向网G的从起点s到终点t的最短路径信息数组succ[1..n]
输出: 有向网G的从起点s到终点t的最短路径。

i=1; b[i]=s
while b[i]< >t
b[i+1]=succ[b[i]]
i=i+1
end while
输出b[1..i]
end SHORTEST_ROUTE
最坏情况下时间复杂性:
算法SHORTEST_ROUTE_LEN1(或2):Θ(n2) 算法SHORTEST_ROUTE:Θ(n)。

相关主题