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 实现以相同规律打乱多组数据

    要实现以相同规律打乱多组数据,可以通过随机数种子来实现。具体步骤如下: 导入 random 库 首先需要导入 Python 的 random 库,该库包含各种随机数生成函数。 import random 设置随机数种子 在开始生成随机数之前,需要设置随机数种子。可以选择为所有数据设置一个相同随机数种子,这样可以保证打乱的顺序是相同的,例如: random.s…

    python 2023年6月3日
    00
  • python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算

    让我们来详细讲解一下Python3中的字符串操作及其与数字类型的运算。 1. 字符串类型 在Python中,字符串类型是一种不可变的的数据类型,用于表示文本数据。字符串可以使用单引号、双引号、三引号来定义,例如: str1 = ‘hello world’ str2 = "hello world" str3 = ”’hello world…

    python 2023年6月5日
    00
  • python 用递归实现通用爬虫解析器

    Python用递归实现通用爬虫解析器 在爬虫编写过程中,解析器的编写是一个必不可少的环节。不同的网站页面结构可能会不一样,因此编写通用爬虫解析器可以提高代码的复用性。本文将介绍如何使用Python中的递归算法实现通用爬虫解析器的功能。 具体步骤 分析网页结构,确定爬取的目标元素的标签和类名。 使用Python中的Requests库获取网页的源代码。 使用Py…

    python 2023年5月14日
    00
  • Python使用openpyxl复制整张sheet

    使用 openpyxl 复制整张 sheet 具体可以分为以下步骤: 步骤一:导入模块 首先,我们需要导入 openpyxl 模块,可以使用以下代码: import openpyxl 步骤二:打开工作簿 接下来,我们需要打开需要复制 sheet 的工作簿,可以使用以下代码: wb = openpyxl.load_workbook(‘example.xlsx’…

    python 2023年6月3日
    00
  • Python3.6.x中内置函数总结及讲解

    Python 3.6.x中内置函数总结及讲解 Python是一种功能强大的动态编程语言,被广泛用于Web应用程序,科学计算,数据分析和许多其他应用程序。Python内置了许多有用的函数,这些函数可以极大地简化开发过程。以下是Python 3.6.x中一些最重要的内置函数。 1. print() print() 函数用于在控制台或其他标准输出设备上打印输出。它…

    python 2023年5月13日
    00
  • python递归计算N!的方法

    以下是关于“Python递归计算N!的方法”的完整攻略: 简介 阶乘是一个常见的数学问题,它表示一个正整数的所有小于等于它的正整数的乘积。在本教程中,我们将介绍如何使用Python递归计算N!,并提供一些示例说明。 Python递归计算N!实现 以下是使用Python递归计算N!的示例: def factorial(n): if n == 0: return…

    python 2023年5月14日
    00
  • Python常用编码的区别介绍

    当我们写Python代码时,有多种编码方式可供选择,而不同的编码方式之间也存在一些区别。下面我会逐一讲解常用的三种编码方式,它们分别是ASCII、UTF-8和ISO-8859-1。 ASCII编码 ASCII编码是最早的一种字符编码方式,它使用7个比特位来表示一个字符,总共可以表示128种不同的字符,包括26个英文字母、数字、符号等。 ASCII编码逐渐被淘…

    python 2023年5月20日
    00
  • Gimp,python-fu:RuntimeError:pdb.gimp_image_merge_down 中的执行错误

    【问题标题】:Gimp, python-fu: RuntimeError: execution error in pdb.gimp_image_merge_downGimp,python-fu:RuntimeError:pdb.gimp_image_merge_down 中的执行错误 【发布时间】:2023-04-05 05:50:01 【问题描述】: 我的…

    Python开发 2023年4月5日
    00
合作推广
合作推广
分享本页
返回顶部