数学建模教程四、动态规划——最短路线问题

标签:
动态规划r语言最短路径floyd-warshall |
分类: 数学建模 |
动态规划(dynamic
programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。
下面是几个著名的动态规划问题以及它们的R语言求解过程。
- 案例一、最短路线问题
图 1
是一个线路网,连线上的数字表示两点之间的距离(或费用)。试寻求一条由 A到G 距离最短(或费用最省)的路线。
最短距离的
Floyd-Warshall算法,就是一个动态规划的算法:
将顶点编号,假设依次为0,1,2…n-1,现在假设DP[i][j][k]表示从i出发,结束于j的满足经过结点的编号至多为k的最短路径,由此性质易知,在易知DP[i][j][k]时,若要求DP[i][j][k+1],有两种情况要考虑:
1、DP[i][j][k+1]所表征的路径经过结点k+1,此时DP[i][j][k+1] = DP[i][k+1][k] +
DP[k+1][j][k]
2、DP[i][j][k+1]所表征的路径不经过结点k+1,此时DP[i][j][k+1] =
DP[i][j][k],不用更新表项
属于哪种情况只需进行一次比较选择较小的即可,当第n-1轮循环结束,表项中的值DP[i][j]就代表了顶点i ,
j之间的最短距离,由算法的描述易知,时间复杂度必然是O(N3),但是空间复杂度可以通过复用DP数组减少到O(N2)。
下面是Floyd-Warshall算法的伪代码实现:
Floyd(){
}
}
在R中求解上面的问题:
require(igraph)
gData = data.frame(
);
g = graph.data.frame(gData, directed
= TRUE)
plot(
)
AGShortest <-
get.shortest.paths(g, 'A', 'G')$vpath[[1]]
V(g)[AGShortest]$color <-
'green'
E(g)$color <- 'grey'
E(g, path=AGShortest)$color <-
'red'
E(g, path=AGShortest)$width <-
3
plot(
)
R得到的图形结果:
前一篇:数学建模教程三、非线性规划