news 2026/7/8 7:37:08

(6-3)自动驾驶中的全局路径精简计算:Floyd算法的改进

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(6-3)自动驾驶中的全局路径精简计算:Floyd算法的改进

6.3 Floyd算法的改进

Floyd算法是一种用于解决图中任意两点间最短路径问题的经典算法。为了提高其效率和性能,可以采用多种优化改进方式。其中包括空间优化、提前终止、并行化计算、路径记忆、稀疏图优化等。这些优化改进方式可以单独或组合使用,以适应不同的应用场景和计算环境,从而加速算法的执行速度,降低内存消耗,并提高算法的可扩展性和适用性。

6.3.1 通过空间优化来减少内存消耗

在现实应用中,Floyd算法的一个常用改进方法是通过空间优化来减少内存消耗。在通常情况下,Floyd算法需要一个二维矩阵来存储每对节点之间的最短路径长度。但实际上,我们可以使用两个二维矩阵来交替存储中间结果,从而减少内存使用。下面是Floyd算法通过空间优化来减少内存消耗的方式进行改进的伪代码:

输入:图 G,表示为邻接矩阵 graph 输出:最短路径矩阵 dist function ImprovedFloydAlgorithm(graph): n = 图 G 中的节点数 初始化两个二维矩阵 dist1 和 dist2,都与图 G 的大小相同 for i from 0 to n-1: for j from 0 to n-1: dist1[i][j] = graph[i][j] // 初始化第一个矩阵为图的邻接矩阵 dist2[i][j] = graph[i][j] // 初始化第二个矩阵为图的邻接矩阵 for k from 0 to n-1: for i from 0 to n-1: for j from 0 to n-1: // 通过中间节点 k 更新最短路径矩阵 dist1[i][j] = min(dist1[i][j], dist1[i][k] + dist1[k][j]) dist2[i][j] = min(dist2[i][j], dist2[i][k] + dist2[k][j]) 返回 dist1 或 dist2(根据具体需求决定返回哪一个)

例如下面是一个使用Floyd算法并通过空间优化来减少内存消耗的实例。

实例6-2使用减少空间优化的方式来优化Floyd算法codes/6/gai.py

实例文件gai.py的具体实现代码如下所示。

上述代码与传统Floyd算法的实现代码相比,只使用了一个二维数组来存储最短路径信息,而不是两个。在更新最短路径信息时,我们直接使用 dist1 作为中间结果。这样就可以节省一半的内存空间,从而减少内存消耗。执行后会打印输出下面的结果,并绘制如图6-6所示的可视化图。

Shortest paths: [[0. 3. 5. 6.] [5. 0. 2. 3.] [3. 6. 0. 1.] [2. 5. 7. 0.]]

图6-6 可视化图

6.3.2 并行化优化

并行化优化是指利用多个处理单元同时执行计算任务,以提高算法执行速度和效率的一种优化方法。在并行化优化中,计算任务被分解成多个子任务,并且这些子任务可以同时在不同的处理单元上并行执行。这种并行执行可以是在多核CPU上、多个GPU上、分布式系统中的多台计算节点上,甚至是在多个线程中执行。通过并行化优化,可以充分利用计算资源,加速算法的执行,提高系统的整体性能。

在实际应用中,Floyd算法可以通过以下方式实现并行化优化。

  1. 任务并行化:将三重循环中的每个迭代作为一个任务并行化执行。可以使用多线程或者多进程技术,将不同的迭代分配给不同的处理单元来执行。这样可以充分利用多核处理器的并行计算能力。
  2. 数据并行化:将距离矩阵分成多个子矩阵,在不同的处理单元上并行计算。每个处理单元负责计算子矩阵的部分,并将结果合并起来得到最终的距离矩阵。这种方式可以降低通信开销,并提高并行计算效率。
  3. GPU加速:利用图形处理器(GPU)的并行计算能力加速Floyd算法。可以使用CUDA或者OpenCL等GPU编程框架,将算法中的计算任务映射到GPU上进行并行计算。GPU具有大量的并行处理单元和高带宽的内存访问能力,适合处理大规模的并行计算任务。
  4. 分布式计算:将Floyd算法的计算任务分布到多台计算节点上进行并行计算。可以使用分布式计算框架(如MPI、Apache Spark等),将距离矩阵分割成多个子矩阵,在不同的计算节点上并行计算,然后将结果汇总得到最终的距离矩阵。

在使用上述并行化优化方法时,可以根据具体的应用场景和计算资源的特点进行选择和组合。通过并行化优化,可以加速Floyd算法的执行速度,提高算法的效率和性能。

例如下面是一个使用数据并行化和任务并行化方法来优化Floyd算法的例子 ,在这个例子中将使用Python的多线程来并行化处理Floyd算法的计算任务。首先将图分成多个块,然后将每个块分配给不同的线程并行计算。每个线程负责处理一个块的计算任务,并将计算结果存储在result列表中。然后,主线程等待所有线程完成计算,并将各个线程的计算结果合并起来得到最终的结果。通过这种方式,我们可以并行化地处理Floyd算法的计算任务,提高算法的执行效率。

实例6-3使用多线程并行化处理Floyd算法codes/6/bing.py

实例文件bing.py的具体实现代码如下所示。

import numpy as np import concurrent.futures import networkx as nx import matplotlib.pyplot as plt def floyd_algorithm_parallel(graph, start, end, result): n = len(graph) for k in range(start, end): for i in range(n): for j in range(n): graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]) result[start:end] = graph[start:end] def improved_floyd_algorithm_parallel(graph): n = len(graph) num_threads = 4 # 假设使用4个线程 result = [None] * n # 用于存储每个线程的计算结果 with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor: # 将任务分配给多个线程并行执行 futures = [] chunk_size = n // num_threads for i in range(num_threads): start = i * chunk_size end = (i + 1) * chunk_size if i < num_threads - 1 else n future = executor.submit(floyd_algorithm_parallel, np.copy(graph), start, end, result) futures.append(future) # 等待所有线程完成计算 concurrent.futures.wait(futures) # 合并各个线程的计算结果 for i in range(num_threads): start = i * chunk_size end = (i + 1) * chunk_size if i < num_threads - 1 else n graph[start:end] = result[start:end] return graph def visualize_graph(graph, shortest_paths): G = nx.Graph() for i in range(len(graph)): for j in range(len(graph)): if graph[i][j] != float('inf'): G.add_edge(i, j, weight=graph[i][j]) pos = nx.spring_layout(G) # positions for all nodes labels = nx.get_edge_attributes(G, 'weight') nx.draw(G, pos, with_labels=True, node_size=700, node_color="skyblue") nx.draw_networkx_edge_labels(G, pos, edge_labels=labels) for i in range(len(graph)): for j in range(len(graph)): if shortest_paths[i][j] != float('inf'): plt.text(pos[i][0] * 1.05, pos[i][1] * 1.05, f'{shortest_paths[i][j]:.2f}', fontsize=9) plt.show() if __name__ == "__main__": # Example graph graph = np.array([ [0, 3, np.inf, 7], [8, 0, 2, np.inf], [5, np.inf, 0, 1], [2, np.inf, np.inf, 0] ]) # 使用数据并行化和任务并行化优化的Floyd算法计算最短路径 shortest_paths = improved_floyd_algorithm_parallel(graph) print("Shortest paths:") print(shortest_paths) # 可视化图和最短路径 visualize_graph(graph, shortest_paths)

上述代码的实现流程如下所示:

(1)首先,定义函数floyd_algorithm_parallel,用于并行计算Floyd算法中的最短路径。这个函数接受一个图形表示的邻接矩阵作为输入,并使用多线程来并行化执行算法。每个线程负责处理邻接矩阵的一部分,通过分配给不同的线程并行执行,提高了算法的计算效率。

(2)然后,定义函数improved_floyd_algorithm_parallel,功能是调用函数floyd_algorithm_parallel合并各个线程的计算结果并返回最终的最短路径矩阵。在这个过程中,使用了Python的并发库 concurrent.futures 来管理线程池和任务的执行。

(3)接着,定义函数visualize_graph ,用于可视化计算得到的最短路径结果。这个函数利用了NetworkX和Matplotlib库来绘制图形,并在图中显示节点、边以及每条边上的权重(路径长度)。

(4)最后,在主函数中使用一个示例图形邻接矩阵作为输入,调用函数improved_floyd_algorithm_parallel来计算最短路径,并将计算结果传递给 visualize_graph 函数进行可视化展示。

执行后会打印输出下面的矩阵,并绘制可视化话图,如图6-7所示。这样可以直观地查看图中节点之间的最短路径信息,并验证并行化优化对算法性能的提升效果。

Shortest paths: [[ 0. 3. inf 7.] [ 8. 0. 2. inf] [ 5. inf 0. 1.] [ 2. inf inf 0.]]

图6-7 绘制的可视化图

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 12:14:02

新能源车充电桩状态识别:远程监控使用情况

新能源车充电桩状态识别&#xff1a;远程监控使用情况 随着新能源汽车保有量的快速增长&#xff0c;充电基础设施的智能化管理成为城市智慧交通系统的重要组成部分。在实际运营中&#xff0c;如何实时掌握充电桩的使用状态——是空闲、正在充电、故障还是被非电动车占用——直接…

作者头像 李华
网站建设 2026/7/1 13:04:43

SKYWALKING从零开始:小白也能懂的安装教程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向初学者的SKYWALKING入门教程项目。包含详细的安装步骤说明、基础配置示例、常见问题解决方案和简单的Demo应用。要求使用Markdown格式编写教程&#xff0c;并附带可运…

作者头像 李华
网站建设 2026/7/5 4:21:39

让学术写作更聪明:宏智树AI,你的全流程科研伙伴

在高校图书馆的凌晨灯火下&#xff0c;在毕业季的焦虑与期待中&#xff0c;无数学子面对电脑屏幕&#xff0c;反复删改论文标题、纠结文献综述逻辑、卡在数据分析环节——学术写作不仅是知识的输出&#xff0c;更是一场对耐心、方法与工具的综合考验。 有没有一种工具&#xf…

作者头像 李华
网站建设 2026/7/1 14:51:27

企业级Docker故障排查实战:从启动失败到恢复

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于真实企业案例的Docker故障排查模拟器。用户可以选择不同的故障场景&#xff08;如网络配置错误、存储驱动问题等&#xff09;&#xff0c;系统会生成对应的错误日志和…

作者头像 李华
网站建设 2026/6/26 4:10:45

MCP控制平面失联怎么办,资深架构师亲授7种高危故障应对方案

第一章&#xff1a;MCP控制平面失联的故障定界与影响评估当MCP&#xff08;Management Control Plane&#xff09;控制平面发生失联时&#xff0c;系统的可观测性与调度能力将受到严重影响。此类故障可能导致节点状态无法同步、策略下发中断以及集群整体自治能力下降。为快速定…

作者头像 李华
网站建设 2026/7/1 13:04:51

上传图片后模型不响应?万物识别输入处理问题排查手册

上传图片后模型不响应&#xff1f;万物识别输入处理问题排查手册 引言&#xff1a;当图像输入遇上“沉默”的模型 在使用阿里开源的万物识别-中文-通用领域模型进行图像推理时&#xff0c;你是否遇到过这样的场景&#xff1a;代码看似正常运行&#xff0c;图片也已成功上传&…

作者头像 李华