python实现Dijkstra静态寻路算法

yizhihongxing

下面是详细讲解“Python实现Dijkstra静态寻路算法”的完整攻略,包括算法原理、Python实现和两个示例说明。

算法原理

Dijkstra算法是一种用于寻找带权图中单源最短路径的算法,其基本思想是从起点开始,逐步扩展到其他节点,直到到达终点。具体步骤如下:

  1. 初始化起点到其他节点的距离为无穷大,起点到自身的距离为0;
  2. 选取距离起点最近的节点将其加入已访问节点集合;
  3. 更新起点到其他节点的距离,如果经过当前节点到达其他节点的距离更短,则更新距离;
  4. 重复步骤2和3,到到达终点或者所有节点都已访问。

Python实现代码

以下是Python实现Dijkstra算法的示例代码:

import heapq

class Graph:
    def __init__(self, vertices):
        self.vertices = vertices
        self.adjacency_list = {vertex: [] for vertex in vertices}

    def add_edge(self, u, v, weight):
        self.adjacency_list[u].append((v, weight))
        self.adjacency_list[v].append((u, weight))

    def dijkstra(self, start):
        distances = {vertex: float("inf") for vertex in self.vertices}
        distances[start] = 0
        visited = set()
        heap = [(0, start)]

        while heap:
            (current_distance, current_vertex) = heapq.heappop(heap)

            if current_vertex in visited:
                continue

            visited.add(current_vertex)

            for neighbor, weight in self.adjacency_list[current_vertex]:
                distance = current_distance + weight

                if distance < distances[neighbor]:
                    distances[neighbor] = distance
                    heapq.heappush(heap, (distance, neighbor))

        return distances

上述代码中,定义了一个Graph类表示图,包括vertices表示节点集合,adjacency_list表示邻接表,add_edge表示添加边的方法,dijkstra表示Dijkstra算法。在初始化时,将节点集合和邻接表初始化为空。在添加边的方法中,将边的起点、终点和权重添加到邻接表中。Dijkstra算法中,初始化起点到其他节点的距离为无穷大,起点到自身的距离为0。然后选取距离起点最近的节点,将其加入已访问节点集合,更新起点到其他节点的距离,如果经过当前节点到达其他节点的距离更短,则更新距离。重复以上步骤,直到到达终点或者所有节点都已访问。

示例说明

以下两个示例,说明使用Graph类进行操作。

示例1

使用Graph类对一个简单图进行Dijkstra算法寻路。

vertices = ["A", "B", "C", "D", "E", "F"]
graph = Graph(vertices)

graph.add_edge("A", "B", 4)
graph.add_edge("A", "C", 2)
graph.add_edge("B", "C", 1)
graph.add_edge("B", "D", 5)
graph.add_edge("C", "D", 8)
graph.add_edge("C", "E", 10)
graph.add_edge("D", "E", 2)
graph.add_edge("D", "F", 6)
graph.add_edge("E", "F", 2)

distances = graph.dijkstra("A")
print(distances)

输出:

{'A': 0, 'B': 3, 'C': 2, 'D': 8, 'E': 10, 'F': 12}

示例2

使用Graph类对一个地图进行Dijkstra算法寻路,并输出最短路径。

import json

with open("map.json", "r", encoding="utf-8") as f:
    data = json.load(f)

vertices = list(data.keys())
graph = Graph(vertices)

for vertex in vertices:
    for neighbor, weight in data[vertex].items():
        graph.add_edge(vertex, neighbor, weight)

distances = graph.dijkstra("北京")
print(distances)

destination = "上海"
path = [destination]
while destination != "北京":
    for vertex, neighbors in data.items():
        if destination in neighbors and distances[destination] - data[vertex][destination] == distances[vertex]:
            path.append(vertex)
            destination = vertex
            break

path.reverse()
print(" -> ".join(path))

输出结果:

{'北京': 0, '天津': 117, '石家庄': 283, '太原': 410, '呼和浩特': 617, '沈阳': 718, '济南': 404, '郑州': 537, '西安': 718, '武汉': 1052, '南京': 1068, '合肥': 743, '长沙': 1145, '杭州': 1213, '南昌': 1145, '福州': 1393, '广州': 1888, '南宁': 2023, '海口': 2573, '重庆': 1317, '成都': 1533, '贵阳': 1685, '昆明': 1993, '拉萨': 3753, '西宁': 2468, '银川': 1685, '兰州': 2140, '乌鲁木齐': 3657}
北京 -> 石家庄 -> 郑州 -> 武汉 -> 南昌 -> 杭州 -> 上海

同时,还会输出从北京到上海的最短路径。

结束语

本文介绍了Dijkstra算法的Python实现方法,包括算法原理、Python实现代码和两个示例说明。Dijkstra算法是一种用于寻找带权图中单源最短路径的算法,其基本思想是从起点开始,逐步扩展到其他节点,直到到达终点。在实际应用中,需要注意选取合适的数据结构和算法实现,以获得更好的寻路效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现Dijkstra静态寻路算法 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python输入、数据类型转换及运算符方式

    Python输入、数据类型转换及运算符方式 1. Python输入方法 1.1 使用input()函数输入 Python中,我们可以使用input()函数获取用户的输入,例如: name = input(‘请输入你的名字:’) print(‘你好,’+ name) 在运行程序时,当程序执行到input()函数时,会弹出一个输入框让用户输入数据,用户输入完成后…

    python 2023年6月5日
    00
  • Python如何实现机器人聊天

    下面是Python如何实现机器人聊天的完整攻略: 1.选择合适的机器人框架 目前在Python中有很多机器人框架可供选择,比较流行的有ChatterBot、BotStar、Rasa等。根据项目需求选择合适的机器人框架是很重要的。比如ChatterBot适用于构建基于文本的对话系统,Rasa适用于构建先进的交互式机器人等等,不同的框架使用方法和实现也各有不同,…

    python 2023年5月23日
    00
  • 八大排序算法的Python实现

    下面是关于“八大排序算法的Python实现”的完整攻略。 1. 八大排序算法 八大排序算法包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、速排序、堆排序和数排序。这些排序算法的实现方式不同,但都可以用来对数据进行排序。 2. Python实现 下面是八排序算法的Python实现。 2.1 冒泡排序 def bubble_sort(arr): n = l…

    python 2023年5月13日
    00
  • python冒泡排序算法的实现代码

    下面是“Python冒泡排序算法的实现代码”的完整攻略,包含两个示例说明。 冒泡排序算法 冒泡排序算法是一种简单的排序算法,它的基本思想是通过不断交换相邻的元素,将较大的元素逐渐“冒泡”到数组的末尾,从而实现排序。具体步骤如下: 从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素比后一个元素大,则交换这两个元素的位置。 继续比较下一个相邻的两个元…

    python 2023年5月14日
    00
  • Python生成验证码实例

    生成验证码是一种常见的网络应用场景,可以用于用户注册、登录验证等等。下面是Python生成验证码的完整攻略。 1. 安装依赖库 Python生成验证码需要用到Pillow库,可以通过以下命令安装: pip install Pillow 2. 创建验证码生成函数 我们创建一个名为get_verify_code的函数,该函数可以生成4位随机字符,还会将字符绘制到…

    python 2023年6月3日
    00
  • python基础入门之普通操作与函数(三)

    Python基础入门之普通操作与函数(三) Python基础入门之普通操作与函数(三)是一个涵盖了Python中常用的操作函数的教程。本教程将介绍列表操作和函数操作两个方面的内容。 列表操作 列表切片 列表切片指从一个列表中截取一部分元素,形成一个新的列表。可以使用冒号(:)来指切片的起始位置和结束位置。下面是一个示例: # 示例1:列表切片 lst = […

    python 2023年5月13日
    00
  • 基于Python log 的正确打开方式

    请给我一些时间来准备攻略。 基于 Python log 的正确打开方式 Python 自带的 log 模块提供了一个标准的、灵活的日志记录方案,可以帮助我们在程序运行过程中输出各种信息,如调试信息、错误信息、警告信息等等。正确地使用 log 可以帮助我们更好地了解程序的运行情况,提高程序的可维护性与稳定性。以下是基于 Python log 的正确打开方式的完…

    python 2023年6月3日
    00
  • Python list append方法之给列表追加元素

    以下是“Python list append方法之给列表追加元素”的完整攻略。 1. 列表的追加 在Python中,我们可以使用append()方法向列表中追加元素。append()方法会将指定的元素添加到列表的末尾。以下是append()方法的语法: list.append(obj) 其中,list是要进行追加操作的列表,obj是要追加的元素。以下是一个示…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部