版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15642411/article/details/85038386
要学习别人的算法和思考如何修改算法–牢记!
一、关于MCP算法
如上图,给定一个矩阵,和一个位置(m,n)怎么找到其到(0,0)的最短路径代价,可以看出 (0, 0) –> (0, 1) –> (1, 2) –> (2, 2)。这个时候路径的最短代价 8 (1 + 2 + 2 + 3)。那么编程如何实现?
借用下面公式:minCost(m, n) = min (minCost(m-1, n-1), minCost(m-1, n), minCost(m, n-1)) + cost[m][n]
那么代码用递归实现如下:
R = 3
C = 3
import sys
def minCost(cost, m, n):
if (n < 0 or m < 0):
return sys.maxsize
elif (m == 0 and n == 0):
return cost[m][n]
else:
return cost[m][n] + min( minCost(cost, m-1, n-1),
minCost(cost, m-1, n),
minCost(cost, m, n-1) )
def min(x, y, z):
if (x < y):
return x if (x < z) else z
else:
return y if (y < z) else z
cost= [ [1, 2, 3],
[4, 8, 2],
[1, 5, 3] ]
print(minCost(cost, 2, 2))
输出值为:8
二、如何输出路径和权重?
上面代码输出的最短路径代价,那么我想得到路径怎么办?其实很改动和简单,代码如下:
# 最小代价路径(加权)MCP算法
R = 3
C = 3
import sys
def minCost(cost,m, n):
if (n < 0 or m < 0):
return sys.maxsize
elif (m ==0 and n == 0):
return cost[m][n]
else: #这里使用了技巧,输出的不在是最小权值,而是由权值和路径(r,c)组成的一个字符串
return str(cost[m][n])+str(m)+str(n)+" "+min( str(minCost(cost, m-1, n-1)),
str(minCost(cost,m-1, n)),
str(minCost(cost, m, n-1)))
def parser(path,sx,sy):#解译路径和权组成的字符串
pathdict={}
pathList=path.strip().split()[::-1]
pathList=path.split()[::-1]
for i,e in enumerate(pathList):
if i==0:
pathdict[(sx,sy)]=e ####这里注意的是如果用权值作为字典的key,
#如果权值相同那么就会出现问题(python3 dict 根据key 去重)
continue
pathdict[(eval(e[1]),eval(e[2]))]=e[0]
return pathdict
def min(x, y, z):
if (x < y):
return x if (x < z) else z
else:
return y if (y < z) else z
#
cost= [ [1, 2, 3,4],
[4, 8, 2,5],
[1, 5, 3,2] ]
path=minCost(cost, 2, 1)
print(parser(path,0,0))
输出:{(0, 0): '1', (1, 0): '4', (2, 0): '1', (2, 1): '5'}