动态规划-------最短路径问题


  -最短路径,即给定一张地图,求从一个地方到另一个地方的最短路径,如下所示,从起点(0,0)到终点(3,3),每一次只能往左或者往右走,求到达终点的最短路径总长是多少?

  0 1 2 3
0 1 3 5 9
1 2 1 3 4
2 5 2 6 7
3 6 8 4 3

  回溯法:决策树,用函数f(x,y,z)表示决策树,其中x表示往下,y表示往右,Z表示最短路径之和

  动态规划法:我们采用一个全新的表格来记录最佳值,每到一个地方实现方式为min(往左,往右)的最小值。

  初始化(第0行,第0列)

1(+1) 4(+3) 9(+5) 18(+9)
3(+2)      
8(+5)      
14(+6)      

  第一行

1(+1) 4(+3) 9(+5) 18(+9)
3(+2)  4=min(4+1,3+1) 7=min(9+3,4+3)  11=min(18+4,7+4)
8(+5)      
14(+6)      

  依此类推到最后一行:

1(+1) 4(+3) 9(+5) 18(+9)
3(+2)  4=min(4+1,3+1) 7=min(9+3,4+3)  11=min(18+4,7+4)
8(+5)  6  12  18
14(+6)  14  16  19

  从而可以推出状态转移方程:

      min_path(x,y)=min(pathValues[x][y]+min_path(x,y-1),pathValues[x][y]+min_path(x-1,y))

  算法实现:

 1 #最短路径问题
 2 import numpy as np
 3 
 4 
 5 def shorPathSolution(path):
 6     shortPath =[[-1 for col in range(len(path))] for row in range(len(path[0]))]
 7 
 8     shortPathValues =np.array(shortPath)#创建二维数组,用于记录最短路径的值
 9     #short
10 
11     for i in range(len(path)):
12 
13         for j in range(len(path[i])):
14             # 初始化第一行的值
15             if i==0:
16                 if j ==0:
17                     shortPathValues[i][j] = path[i][j]
18                 else:
19                     shortPathValues[i][j] = path[i][j] + shortPathValues[i][j-1]
20             # 初始化第一列的值
21             elif j == 0:
22                 shortPathValues[i][j] = shortPathValues[i-1][j] + path[i][j]
23             else:
24                 #计算每到一个位置的最短路径
25                 shortPathValues[i][j] = min(shortPathValues[i-1][j] + path[i][j],path[i][j] + shortPathValues[i][j-1])
26     for i in range(len(shortPathValues)):
27         for j in range(len(shortPathValues[j])):
28             print(shortPathValues[i][j], end="    ")
29         print()
30     print(shortPathValues[-1][-1])
31 path = [(1,3,5,9),(2,1,3,4),(5,2,6,7),(6,8,4,3)]
32 shorPathSolution(path)

输出结果:

1    4    9    18    
3    4    7    11    
8    6    12    18    
14    14    16    19    
19

相关