python实现标号法确定最短路径

计量地理学布置了一道作业,通过标号法确定最短路径。老师说用arcgis来实现,但是我想锻炼一下,所以使用python来实现一下这个算法(具体算法可百度)。入门小白,希望路过的大佬多多指教。

在这里插入图片描述


#标号法求最短距离
#权重,字典形式
W = {}
#P列表和T列表
P = []
T = []
#一开始P中只有V1点
P.append([1])
P.append([0,1,0,0,0,0,0,0,0,1])
#T中包含有其余点,第一个只代表T值,由于一开始V1点在P中,因此取0,其他的取较大值,此处取1000
#通过0和1的对比来确定之间互通的两个点
#比如1点通向2,3,4点,那么这四个列表中的第二个值就是1,其余点为0
#列表中的最后一个值代表这个点的编号
T.append([1000,1,1,0,0,0,0,0,2])
T.append([1000,1,1,1,0,0,0,0,3])
T.append([1000,1,0,1,1,0,0,0,4])
T.append([1000,0,0,1,1,1,0,0,5])
T.append([1000,0,1,1,0,1,1,1,6])
T.append([1000,0,1,0,0,1,0,1,7])
T.append([1000,0,0,0,0,0,1,1,8])
#手动输入权值
W['12']=2
W['13']=5
W['14']=3
W['23']=2
W['26']=7
W['27']=4
W['34']=1
W['35']=3
W['36']=5
W['45']=5
W['56']=1
W['58']=7
W['68']=5
W['76']=2
W['78']=3

#传入两个列表参数
def go_through_dict(Plist,Tlist):
    templist = []
    #遍历T列表
    for key,value in enumerate(Tlist):
        #i代表P列表中新加进来元素的最后一个值,即最新确定P值的点的编号
        i = Plist[0][-1]
        #判断是否两点之间可以通向
        if Plist[-1][i] == value[i] :
            a = value[0]
            b = Plist[-1][0] + W['{}{}'.format(i,value[-1])]
            #更改T值
            value[0] = min(a,b)
    for i in range(len(Tlist)):
        templist.append(Tlist[i][0])
    #确定现存T列表中的最小值
    minvalue = min(templist)
    #通过最小值来更新P列表和T列表
    for key, value in enumerate(Tlist):
        if value[0] == minvalue:
            Plist.append(value)
            # temp = key+2
            Plist[0].append(value[-1])
            T.pop(key)
    print(P)

#通过k-1次迭代
for i in range(7):
    print('-------------------第{}次------------------'.format(i+1))
    go_through_dict(P,T)



运行结果

-------------------第1次------------------
[[1, 2], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2]]
-------------------第2次------------------
[[1, 2, 4], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4]]
-------------------第3次------------------
[[1, 2, 4, 3], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4], [4, 1, 1, 1, 0, 0, 0, 0, 3]]
-------------------第4次------------------
[[1, 2, 4, 3, 7], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4], [4, 1, 1, 1, 0, 0, 0, 0, 3], [6, 0, 1, 0, 0, 1, 0, 1, 7]]
-------------------第5次------------------
[[1, 2, 4, 3, 7, 5], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4], [4, 1, 1, 1, 0, 0, 0, 0, 3], [6, 0, 1, 0, 0, 1, 0, 1, 7], [7, 0, 0, 1, 1, 1, 0, 0, 5]]
-------------------第6次------------------
[[1, 2, 4, 3, 7, 5, 6], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4], [4, 1, 1, 1, 0, 0, 0, 0, 3], [6, 0, 1, 0, 0, 1, 0, 1, 7], [7, 0, 0, 1, 1, 1, 0, 0, 5], [8, 0, 1, 1, 0, 1, 1, 1, 6]]
-------------------第7次------------------
[[1, 2, 4, 3, 7, 5, 6, 8], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4], [4, 1, 1, 1, 0, 0, 0, 0, 3], [6, 0, 1, 0, 0, 1, 0, 1, 7], [7, 0, 0, 1, 1, 1, 0, 0, 5], [8, 0, 1, 1, 0, 1, 1, 1, 6], [9, 0, 0, 0, 0, 0, 1, 1, 8]]

这里面最后应该加一些代码,通过比较方向和大小确定最后的最短路径,有兴趣自尝试。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三维最短路径问题可以使用Dijkstra算来解决。该算是一种单源最短路径,用于计算从源点到所有其他节点的最短路径。 在三维空间中,我们可以将每个节点表示为一个三元组(x, y, z),其中(x, y)表示该节点在平面上的位置,z表示该节点的高度。节点之间的边权值可以定义为它们之间的欧几里得距离。 下面是一个简单的Python代码实现,用于解决三维最短路径问题: ```python from heapq import heappush, heappop # 生成随机地图 def generate_map(size): return [[[0 for _ in range(size)] for _ in range(size)] for _ in range(size)] # 计算节点之间的距离 def distance(node1, node2): return ((node1[0]-node2[0])**2 + (node1[1]-node2[1])**2 + (node1[2]-node2[2])**2) ** 0.5 # 执行Dijkstra算 def dijkstra(start, end, graph): heap = [(0, start)] # 堆中存储的元素是一个元组,第一个元素是该节点到起点的距离,第二个元素是该节点的坐标 visited = set() # 记录已访问的节点 distances = {start: 0} # 记录每个节点到起点的距离 while heap: (distance, current) = heappop(heap) if current == end: return distances[current] if current in visited: continue visited.add(current) for neighbor in get_neighbors(current, graph): d = distances[current] + distance(current, neighbor) if neighbor not in distances or d < distances[neighbor]: distances[neighbor] = d heappush(heap, (d, neighbor)) return float('inf') # 获取一个节点的邻居节点 def get_neighbors(node, graph): x, y, z = node size = len(graph) neighbors = [] for i in [-1, 0, 1]: for j in [-1, 0, 1]: for k in [-1, 0, 1]: if 0 <= x+i < size and 0 <= y+j < size and 0 <= z+k < size and (i!=0 or j!=0 or k!=0): neighbors.append((x+i, y+j, z+k)) return neighbors # 主程序 size = 10 # 地图大小 start = (0, 0, 0) # 起点坐标 end = (size-1, size-1, size-1) # 终点坐标 # 生成随机地图 graph = generate_map(size) # 计算最短路径 shortest_distance = dijkstra(start, end, graph) # 输出结果 print(f"从起点{start}到终点{end}的最短路径为{shortest_distance}") ``` 在上面的代码中,首先定义了`generate_map`函数,用于生成一个随机的三维地图。该函数返回一个三维数组,其中每个元素都是一个整数,表示该位置的高度。 接下来定义了`distance`函数,用于计算两个节点之间的距离。在`dijkstra`函数中,我们使用一个堆来存储待访问的节点,堆中存储的元素是一个元组,第一个元素是该节点到起点的距离,第二个元素是该节点的坐标。我们使用一个集合`visited`来记录已访问的节点,使用一个字典`distances`来记录每个节点到起点的距离。 在`get_neighbors`函数中,我们根据当前节点的坐标计算出它的邻居节点。最后,在主程序中,我们生成一个随机地图,调用`dijkstra`函数计算从起点到终点的最短路径,并输出结果。 需要注意的是,在三维空间中,节点之间的距离计算时需要使用欧几里得距离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值