Python实现迪杰斯特拉算法并生成最短路径的示例代码

下面是详细讲解“Python实现迪杰斯特拉算法并生成最短路径的示例代码”的完整攻略,包括算法原理、Python实现和两个示例说明。

算法原理

Dijkstra算法是一种用于查找图中最短路径的算法。其主要思想是从起点开始,逐步扩展到其他节点,直到到达终点。在扩展的过程中,记录每个节点的最短路径和前驱节点,最终得到起点到终点的最短路径。Dijkstra算法的实现过程如下:

  1. 初始化起点的最短路径为0,其他节点的最短路径为无穷大。
  2. 选择一个未标记的节点,计算该节点到起点的距离,并更新其邻居节点的最短路径和前驱节点。
  3. 标记该节点为已访问,重复步骤2,直到到达终点或所有节点都被标记为已访问。
  4. 根据每个节点的前驱节点,构建起点到终点的短路径。

Python实现

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

import heapq

def dijkstra(graph, start, end):
    distances = {vertex: float('inf') for vertex in graph}
    distances[start] = 0
    pq = [(0, start)]
    while pq:
        current_distance, current_vertex = heapq.heappop(pq)
        if current_vertex == end:
            path = []
            while current_vertex != start:
                path.append(current_vertex)
                current_vertex = previous_vertices[current_vertex]
            path.append(start)
            path.reverse()
            return path, current_distance
        if current_distance > distances[current_vertex]:
            continue
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                previous_vertices[neighbor] = current_vertex
                heapq.heappush(pq, (distance, neighbor))
    return None

上述代码中使用Python实现了Dijkstra算法。首先定义了一个函数dijkstra,该函数接受一个图、起点和终点作为参数,返回起点到终点的最短路径和距离。在函数中,使用堆化的方式实现了Dijkstra算法。

示例说明

以下两个示例,说明如何使用上述代码进行最短路径查找。

示例1

使用Dijkstra算法查找一个简单图的最短路径。

graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}

previous_vertices = {}
start = 'A'
end = 'D'
path, distance = dijkstra(graph, start, end)
print(f"最短路径为:{path},距离为:{distance}")

运行上述代码,输出结果为“最短路径为:['A', 'B', 'C', 'D'],距离为:4”。

上述代码中,使用Dijkstra算法查找一个简单图的最短路径。首先定义了一个图,起点和终点,并调用dijkstra函数计算最短路径和距离,最后输出结果。

示例2

使用Dijkstra算法查找一个复杂图的最短路径。

graph = {
    'A': {'B': 2, 'C': 3},
    'B': {'A': 2, 'C': 1, 'D': 4},
    'C': {'A': 3, 'B': 1, 'D':2, 'E': 3},
    'D': {'B': 4, 'C': 2, 'E': 1, 'F': 3},
    'E': {'C': 3, 'D': 1, 'F': 1},
    'F': {'D': 3, 'E': 1}
}

previous_vertices = {}
start = 'A'
end = 'F'
path, distance =jkstra(graph, start, end)
print(f"最短路径为:{path},距离为:{distance}")

运行上述代码,输出结果为“最短路径为:['A', 'B', 'D', 'F'],距离为:9”。

上述代码中,使用Dijkstra算法查找一个复杂图的最短路径。首先定义了一个图,起点和终点,并调用dijkstra函数计算最短路径和距离,最后输出结果。

结语

本文介绍了如何使用Python实现Dijkstra算法进行图的最短路径查找,包括算法原理、Python实现和两个示例说明。Dijkstra算法是一种用于查找图中最短路径的算法,其主要思想是从起点开始,逐步扩展到其他节点,直到到达终点。在实现中,需要注意选择适当的数据结构,并根据具体情况调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现迪杰斯特拉算法并生成最短路径的示例代码 - Python技术站

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

相关文章

  • 聊聊python 逻辑运算及奇怪的返回值(not,and,or)问题

    聊聊Python逻辑运算及奇怪的返回值问题 在Python中,逻辑运算符包括not、and和or。这些运算符用于组合和比较布尔。在使用这些运算符时,有会遇到一些奇怪的返回值问题。本文将详细讲解Python中逻辑运算奇怪的返回值问题,并提供两个示例如下: 逻辑运算符 not运算符 not运算符用于对布尔值进行取反操作。如果一个布尔值为,则not运算符将其转换为…

    python 2023年5月13日
    00
  • 基于python爬虫数据处理(详解)

    基于Python爬虫数据处理 本攻略介绍如何使用Python爬虫来获取数据,并使用Python进行数据处理和分析。 一、爬虫数据获取 Python中有很多爬虫库可供选择,本攻略使用的是requests和BeautifulSoup库。requests用于获取网页源代码,而BeautifulSoup则用于解析源代码,提取需要的数据。 以下是一个简单的示例代码,获…

    python 2023年5月14日
    00
  • 微信跳一跳怎么刷高分?用Python玩微信跳一跳Mac+iOS+Win详细教程

    我们来详细讲解一下“微信跳一跳怎么刷高分?用Python玩微信跳一跳Mac+iOS+Win详细教程”的完整攻略。 1. 安装相关软件和库 首先需要安装Python3和一些相关依赖库,包括opencv-python、numpy、matplotlib、adb-python等。这些软件和库可以通过pip进行安装。 pip install opencv-python…

    python 2023年5月23日
    00
  • Python利用sched模块实现定时任务

    Python的sched模块提供了一个定时器功能,可用于创建定期执行的任务。下面是使用sched模块实现的基本任务调度流程: 1.首先,导入sched模块 import sched 2.初始化scheduler对象 s = sched.scheduler(timefunc=time.time, delayfunc=time.sleep) 3.编写需要定时执行…

    python 2023年6月2日
    00
  • Python学习之列表和元组的使用详解

    Python学习之列表和元组的使用详解 在Python中,列表(list)和元组(tuple)是两种常用的数据结构,它们可以存储多个元素。本文将详细讲解列表和元组的使用方法,并给两个示例说明。 列表(list)的使用 定义列表 在Python中,可以使用方括号([])来定义一个列表。例如下面的代码定义了一个包含5个元素的列表: my_list = [1, 2…

    python 2023年5月13日
    00
  • 详解python3类型注释annotations实用案例

    详解Python3类型注释(Annotations)实用案例 什么是Python3类型注释 在Python 3 中,可以使用类型注释来提示变量的类型,这是一个可选的特性,不影响代码的执行。类型提示不会影响变量的行为,但是可以帮助代码的可读性和可维护性。 语法格式如下: variable: type = value 其中, variable 是变量名 type…

    python 2023年5月13日
    00
  • Python使用time模块实现指定时间触发器示例

    下面是“Python使用time模块实现指定时间触发器”完整攻略,包括示例。 模块介绍 time模块是Python标准库提供的用于时间相关操作的模块。通过time模块,可以获取当前时间、延时等待、时间格式转换等。 使用time模块实现指定时间触发器 我们可以用time模块实现一个简单的指定时间触发器,使得某些操作在指定的时间点开始执行。 获取当前时间 获取当…

    python 2023年5月14日
    00
  • python读写csv文件并增加行列的实例代码

    以下是 Python 读写 CSV 文件并增加行列的攻略。 1. 读取 CSV 文件 读取 CSV 文件需要用到 csv 模块。csv 模块提供了两种读取 CSV 文件的方式,即使用 csv.reader() 函数或 csv.DictReader() 函数。 1.1 使用 csv.reader() 函数 csv.reader() 函数将 CSV 文件中的每一…

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