python实现Dijkstra静态寻路算法

下面是详细讲解“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实现针对含中文字符串的截取功能的完整攻略。具体实现的方法为使用Python的内置模块re实现中文字符串的截取。 步骤一:引入re模块 首先需要引入Python的内置模块re,该模块提供对正则表达式的支持,可以用于中文字符串的截取。 import re 步骤二:使用正则表达式截取 使用re模块的正则表达式函数re.findall(),就…

    python 2023年5月20日
    00
  • Python+Tkinter简单实现注册登录功能

    我们就来详细讲解一下“Python+Tkinter 简单实现注册登录功能”的完整攻略。 概要 在这个攻略中,我们会通过 Python 和 Tkinter 库来实现一个简单的注册登录功能。其中,我们将会用到以下几个模块: Tkinter:用于 GUI 编程 sqlite3:用于实现用户数据的存储和查询 hashlib:用于对密码进行哈希加密 在我们的应用中,用…

    python 2023年6月13日
    00
  • python中json格式处理和字典的关系

    Python中的JSON库可以完成JSON格式数据的解析和生成。JSON格式数据是一种轻量级的数据交换格式,常用于前后端的数据交互。而字典是Python中的一种数据结构,可以存储键值对(key-value)的集合。本文将详细讲解Python中JSON格式处理和字典之间的关系和转换方法。 JSON基础知识 首先,我们需要了解下JSON的基础知识。JSON是Ja…

    python 2023年5月13日
    00
  • python 遍历字符串(含汉字)实例详解

    下面是关于“Python遍历字符串(含汉字)实例”的完整攻略。 需求描述 在Python程序中,遍历字符串是常见的操作,但是当字符串中含有汉字时,可能会出现乱码和编码错误等问题。本篇文章将介绍如何遍历包含汉字的字符串,并解决可能出现的编码问题。 解决方案 方案一:使用Unicode编码 Unicode是一种用于字母、数字、符号和文字的标准编码系统,它可以包含…

    python 2023年5月31日
    00
  • 在Python中使用NumPy对Legendre数列进行微分

    在Python中使用NumPy对Legendre数列进行微分的完整攻略如下: 1. 安装NumPy库 首先需要使用pip安装NumPy库。打开命令行,输入以下命令即可安装: pip install numpy 2. 引入NumPy库 在Python代码中引入NumPy库,使用以下代码: import numpy as np 3. 构造Legendre数列 使…

    python-answer 2023年3月25日
    00
  • Python中类的初始化特殊方法

    下面是关于Python中类的初始化特殊方法的详细讲解。 什么是类的初始化特殊方法? 在Python中,类(Class)是描述对象(Object)的一种方式,而对象则是类的实例化。当一个类被实例化成对象时,会涉及到一些与对象相关的操作,例如给对象指定属性默认值、进行对象的序列化和反序列化等。类的初始化特殊方法就是在对象被实例化的时候调用的一些特殊方法,用于完成…

    python 2023年5月19日
    00
  • Python NumPy教程之数据类型对象详解

    Python NumPy教程之数据类型对象详解 什么是数据类型对象? 在Python NumPy中,数据类型对象(dtype)是指描述了用于存储数组的固定块内存大小,以及如何解释这些内存块中的数据的元数据容器。数据类型可以是标量、数组或自定义复合类型。对于每种数据类型,都有一个称为dtype对象的唯一实例。 NumPy中的数据类型 NumPy支持许多数据类型…

    python 2023年6月5日
    00
  • Python函数和文件操作详情

    Python函数和文件操作详情 Python函数 函数的定义 Python中的函数定义格式为:def function_name(parameters):。 其中 function_name 是你自定义的函数名,parameters 是函数需要输入的参数。 示例代码: def greet(name): print("Hello, " + …

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