首页 > 编程语言 >PyCharm专项训练5 最短路径算法

PyCharm专项训练5 最短路径算法

时间:2024-12-26 13:28:18浏览次数:7  
标签:node distances end 最短 start 算法 path PyCharm nodes

一、实验目的

        本文的实验目的是通过编程实践,掌握并应用Dijkstra(迪杰斯特拉)算法和Floyd(弗洛伊德)算法来解决图论中的最短路径问题。

二、实验内容

  1. 数据准备
    • 使用邻接表的形式定义两个图graph_dijkstragraph_floyd,图中包含节点以及节点之间的边和对应的权重。
  2. 算法实现
    • 实现Dijkstra算法,从指定的源节点(节点0)出发,计算并输出到图中其他所有节点的最短距离及路径。
    • 实现Floyd算法,计算并输出图中任意两点之间的最短距离及路径。
  3. 结果输出
    • 对于Dijkstra算法,输出从源节点(节点0)到指定目标节点(如节点4)的最短距离和路径。
    • 对于Floyd算法,输出图中任意两点(如节点0到节点4)之间的最短距离和路径,以验证算法的正确性和有效性。

三、实验演示

       1.Dijkstra算法&实验结果截图:

#Dijkstra:

import heapq

def dijkstra(graph, start):
    distances = {node: float('infinity') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]
    previous_nodes = {node: None for node in graph}

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node]:
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                previous_nodes[neighbor] = current_node
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances, previous_nodes

def get_path(previous_nodes, start, end):
    path = []
    while end is not None:
        path.append(end)
        end = previous_nodes[end]
    path.reverse()
    return path if path and path[0] == start else []

# 图的表示(邻接表)
graph_dijkstra = {
    0: [(1,4), (7, 8)],
    1: [(0, 4), (7, 11), (2, 8)],
    2: [(1, 8), (8, 2), (3, 7),(5,4)],
    3: [(2,7 ), (5, 14), (4, 9)],
    4: [(3, 9),(5,10)],
    5: [(2,4),(3,14),(4,10),(6,2)],
    6: [(5,2),(7,1),(8,6)],
    7: [(0,8),(1,4),(6,1),(8,7)],
    8: [(2,2),(6,6),(7,7)]
}

start_node = 0
end_node = 4
distances, previous_nodes = dijkstra(graph_dijkstra, start_node)

print(f"从节点 {start_node} 到节点 {end_node} 的最短距离: {distances[end_node]}")
path = get_path(previous_nodes, start_node, end_node)
print(f"从节点 {start_node} 到节点 {end_node} 的最短路径: {path}")

        2.Floyd算法&实验结果截图:

#Floyd
import heapq  
def floyd_warshall(graph):  
    num_nodes = len(graph)  
    distances = [[float('inf')] * num_nodes for _ in range(num_nodes)]  
    previous_nodes = [[-1] * num_nodes for _ in range(num_nodes)]  

    for u in graph:  
        for v, weight in graph[u]:  
            distances[u][v] = weight  
            previous_nodes[u][v] = u  
            distances[v][u] = weight  # 对于无向图  
            previous_nodes[v][u] = v  

    for i in range(num_nodes):  
        distances[i][i] = 0  

    for k in range(num_nodes):  
        for i in range(num_nodes):  
            for j in range(num_nodes):  
                if distances[i][j] > distances[i][k] + distances[k][j]:  
                    distances[i][j] = distances[i][k] + distances[k][j]  
                    previous_nodes[i][j] = previous_nodes[k][j]  

    return distances, previous_nodes  

def reconstruct_path(previous_nodes, start, end):  
    path = []  
    while end != -1:  
        path.append(end)  
        end = previous_nodes[start][end]  
    path.reverse()  
    return path if path and path[0] == start else []   

# 图的表示(邻接表)  
graph_floyd = {  
    0: [(1,4), (7, 8)],  
    1: [(0, 4), (7, 11), (2, 8)],  
    2: [(1, 8), (8, 2), (3, 7),(5,4)],  
    3: [(2,7 ), (5, 14), (4, 9)],  
    4: [(3, 9),(5,10)],
    5: [(2,4),(3,14),(4,10),(6,2)],
    6: [(5,2),(7,1),(8,6)],
    7: [(0,8),(1,4),(6,1),(8,7)],
    8: [(2,2),(6,6),(7,7)]
}  

distances_floyd, previous_nodes_floyd = floyd_warshall(graph_floyd)  
start_node = 0  
end_node = 4  

print(f"\n从节点 {start_node} 到节点 {end_node} 的最短距离: {distances_floyd[start_node][end_node]}")  
path = reconstruct_path(previous_nodes_floyd, start_node, end_node)  
print(f"从节点 {start_node} 到节点 {end_node} 的最短路径: {path}") 

标签:node,distances,end,最短,start,算法,path,PyCharm,nodes
From: https://blog.csdn.net/Jiangxia13/article/details/144718577

相关文章

  • 【数据集】【YOLO】【目标检测】灭火器识别数据集 3261 张,YOLO灭火器识别算法实战训练
     一、数据集介绍【数据集】灭火器识别数据集3261张,目标检测,包含YOLO/VOC格式标注。数据集中包含1种分类:names:['extinguisher'],表示"灭火器"。数据集图片来自国内外网站、网络爬虫、监控采集等;可用于监控和移动设备灭火器识别。检测场景为工业园区、办公大楼、居民楼......
  • 线性筛与埃氏筛算法详解
    目录线性筛与埃氏筛算法详解第一部分:线性筛与埃氏筛算法概述1.1什么是埃氏筛算法?1.2什么是线性筛算法?1.3埃氏筛与线性筛的比较1.4应用场景第二部分:埃氏筛算法原理与实现2.1埃氏筛算法原理2.2埃氏筛算法的步骤2.3埃氏筛的Python实现2.4代码解释第三部分:线性筛算......
  • 基于springboot+推荐算法的智能书店系统
    博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实实在在的写点程序。......
  • 基于EO平衡优化器算法的目标函数最优值求解matlab仿真
    1.程序功能描述基于EO平衡优化器算法的目标函数最优值求解matlab仿真。提供九个测试函数,分别对九个测试函数仿真输出最优解以及对应的优化收敛曲线。2.测试软件版本以及运行结果展示MATLAB2022A版本运行  3.核心程序whilej2<Niters%主循环进行迭代%时......
  • Frechet距离(Fdist)——计算两条曲线的最短距离
     以下是如何在R中使用tscR包来计算Frechet距离的基本步骤。安装和加载tscR包首先,您需要安装并加载tscR包。可以使用以下命令:R复制代码install.packages("tscR")library(tscR)准备时间序列数据tscR包中的FrechetDist函数需要输入两条时间序列。......
  • “高精度算法”思想 → 大数阶乘
    【“大数阶乘”算法思想】利用“高精度算法”思想计算“大数阶乘”,需要明确几个关键点:(1)数组a的大小(maxn)需要足够大,以存储阶乘结果的所有位数。(2)数组a应该在函数外部被初始化为全零,并且第一个元素应该设置为1,表示阶乘的初始值。(3)在计算过程中,数组a的每一位都会被更新......
  • 大二上 数据结构与算法 课堂模板算法 20241225
    数据结构与算法1-基本数据结构2-分治策略3-堆4-排序5-选择&树6-搜索树&散列表&并查集6.1-搜索树6.2-散列表6.3-并查集intfind(intx){if(pre[x]==x)returnx;returnpre[x]=find(pre[x]);}voidjoin(intx,inty){intfx=find(x)......
  • 常见字符串算法简记(持续更新中)
    包含KMP(border相关,KMP自动机),Manacher,Zalgorithm(exKMP),SuffixArray的简单记录。当然写的很烂,欢迎当玩笑看。0.前言1.记一忘三二本文所写的字符串算法都基于一个基本思想:充分利用已知信息的性质加速求出所求信息的过程。这是老生常谈的。因此在这些算法的复杂度分析中主要......
  • 最短路径优先原则
    扩展配置:负载均衡:当路由器访问同一个目标且具有多条开销相似的路径(传输速度相似)时,可以让设备将流量拆分后延多条路径同时发送,已达到叠加带宽的作用。         人话:在传输数据包时,将多个数据包分多条路径传输  环回接口:路由器配置的虚拟接口,一般用于虚拟......
  • 一个GLSL Shader的格式化算法(LALR解析器)
    一个GLSLShader的格式化算法(LALR解析器)在进行OpenGL程序开发时,我需要自行解析`string`类型的Shader代码,抽取出里面的某些变量名和subroutine名。由于找不到可用的GLSLShader解析器,就照着虎书(《现代编译原理-c语言描述》)自己写了个LALRGenerator,实际上包含了(词法分析器+语法......