news 2026/4/16 20:05:10

(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/4/16 18:18:50

AI 如何帮你高效掌握 Docker 命令?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式 Docker 命令学习助手&#xff0c;能够根据用户输入的自然语言描述&#xff08;如“如何创建一个带有 MySQL 的容器”&#xff09;自动生成正确的 Docker 命令&…

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

智能识图开发捷径:预配置深度学习环境详解

智能识图开发捷径&#xff1a;预配置深度学习环境详解 作为一名全栈开发者&#xff0c;最近我接到一个需要集成图像识别功能的项目。虽然我对业务逻辑很熟悉&#xff0c;但面对复杂的AI开发环境配置却有些无从下手。幸运的是&#xff0c;我发现了一个预配置好的深度学习环境镜像…

作者头像 李华
网站建设 2026/4/16 10:57:52

MCP环境下PowerShell脚本调试实战(资深工程师20年经验总结)

第一章&#xff1a;MCP环境下PowerShell脚本调试概述在MCP&#xff08;Microsoft Cloud Platform&#xff09;环境中&#xff0c;PowerShell 脚本广泛用于自动化资源部署、配置管理和系统监控。由于环境复杂性和脚本执行上下文的多样性&#xff0c;调试成为确保脚本稳定运行的关…

作者头像 李华
网站建设 2026/4/16 12:43:37

Azure Stack HCI集群稳定性测试,如何在24小时内完成全场景压力验证?

第一章&#xff1a;Azure Stack HCI集群稳定性测试概述Azure Stack HCI 是微软推出的混合云超融合基础设施解决方案&#xff0c;旨在将本地数据中心与 Azure 云服务无缝集成。为确保生产环境中系统的高可用性与持续运行能力&#xff0c;集群稳定性测试成为部署后不可或缺的关键…

作者头像 李华
网站建设 2026/4/16 10:58:34

Python多线程vs单线程:性能对比实测

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请编写一个性能对比测试程序&#xff0c;包含&#xff1a;1. IO密集型任务测试&#xff08;模拟网络请求&#xff09; 2. 计算密集型任务测试&#xff08;数学运算&#xff09; 3.…

作者头像 李华
网站建设 2026/4/16 14:00:41

【企业级安全升级必读】:MCP零信任测试的5大核心挑战与应对方案

第一章&#xff1a;MCP零信任安全测试的核心价值与战略意义 在现代企业数字化转型进程中&#xff0c;MCP&#xff08;Multi-Cloud Platform&#xff09;环境的复杂性急剧上升&#xff0c;传统边界防御模型已难以应对日益严峻的安全威胁。零信任安全架构以“永不信任&#xff0c…

作者头像 李华