当前位置:   article > 正文

迪杰斯特拉算法 代码_迪杰斯特拉算法代码

迪杰斯特拉算法代码

参考链接:

【路径规划】全局路径规划算法——Dijkstra算法(含python实现 | c++实现)-CSDN博客 

 算法图解:

代码

  1. def dijkstra(matrix, source):
  2. """迪杰斯特拉算法实现
  3. Args:
  4. matrix (_type_): 用邻接矩阵表示带权图
  5. source (_type_): 起点
  6. Returns:
  7. _type_: 最短路径的节点集合,最短路径的节点的最短距离,每个节点到起点的最短路径
  8. """
  9. INF = float('inf')
  10. n = len(matrix)
  11. m = len(matrix[0])
  12. assert n == m, "Error, please examine matrix dim"
  13. assert source < n, "Error, start point should be in the range!"
  14. S = [source] # 已找到最短路径的节点集合 S:可以缩写为"SP",代表"Shortest Path"(最短路径)。
  15. U = [v for v in range(n) if v not in S] # 记录还未确定最短路径的节点集合 U:可以缩写为"UNP",代表"Unprocessed Nodes"(未处理的节点)。
  16. distance = [INF] * n # source到已找到最短路径的节点的最短距离
  17. distance[source] = 0 # 起点到自己的距离
  18. path_optimal = [[]]*n # source到其他节点的最短路径
  19. path_optimal[source] = [source]
  20. while len(S) < n: # 当已找到最短路径的节点小于n时
  21. min_value = INF
  22. col = -1
  23. row = -1
  24. for s in S: # 以已找到最短路径的节点所在行为搜索对象
  25. for u in U: # 从U中搜索尚未记录的节点
  26. if matrix[s][u] + distance[s] < min_value: # 找出最小值
  27. # 在某行找到最小值要加上source到该行的最短路径
  28. min_value = matrix[s][u] + distance[s]
  29. row = s # 记录所在行列
  30. col = u
  31. if col == -1 or row == -1: # 若没找出最小值且节点还未找完,说明图中存在不连通的节点
  32. break
  33. S.append(col) # 在S中添加已找到的节点
  34. U.remove(col) # 从U中移除已找到的节点
  35. distance[col] = min_value # source到该节点的最短距离即为min_value
  36. path_optimal[col] = path_optimal[row][:] # 复制source到已找到节点的上一节点的路径
  37. path_optimal[col].append(col) # 再其后添加已找到节点即为source到该节点的最短路径
  38. return S, distance, path_optimal
  39. def main():
  40. INF = float('inf')
  41. # 使用邻接矩阵存储图
  42. # A B C D E F G
  43. matrix = [[0, 12, INF, INF, INF, 16, 14],
  44. [12, 0, 10, INF, INF, 7, INF],
  45. [INF, 10, 0, 3, 5, 6, INF],
  46. [INF, INF, 3, 0, 4, INF, INF],
  47. [INF, INF, 5, 4, 0, 2, 8],
  48. [16, 7, 6, INF, 2, 0, 9],
  49. [14, INF, INF, INF, 8, 9, 0]]
  50. S, distance, path_optimal = dijkstra(matrix, 3)
  51. print('S:')
  52. print(S)
  53. print('distance:')
  54. print(distance)
  55. print('path_optimal:')
  56. for p in path_optimal:
  57. print(p)
  58. if __name__ == '__main__':
  59. main()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/891228
推荐阅读
相关标签
  

闽ICP备14008679号