最短路径算法(Python数学建模)

news2024/11/25 4:04:05

0. 前言

最短路径算法是一种用于计算图中两个节点之间最短路径的算法。在图论中,最短路径通常指的是图中连接两个节点的路径中具有最小权重(或成本)的路径。
在这里插入图片描述

以下是两种常见的最短路径算法:

  1. Dijkstra算法:Dijkstra算法是一种用于在带权有向图中找到从源节点到所有其他节点的最短路径的算法。它通过不断选择当前距离最短的节点,并更新与该节点相邻节点的距离,逐步构建最短路径树。Dijkstra算法适用于没有负权边的图,时间复杂度为O(V^2),其中V是图中节点的数量。

  2. Bellman-Ford算法:Bellman-Ford算法是一种用于在带权有向图中找到从源节点到所有其他节点的最短路径的算法。与Dijkstra算法不同,Bellman-Ford算法可以处理具有负权边的图。它通过进行V-1次松弛操作,其中V是图中节点的数量,来逐步减小每个节点的最短路径估计值,从而找到最短路径。Bellman-Ford算法的时间复杂度为O(V*E),其中E是图中边的数量。

这些算法可以用于解决各种实际问题,如网络路由、地图导航等。根据具体的需求和图的规模,选择合适的算法来计算最短路径。

1. 概念

请添加图片描述

当谈到最短路径算法时,有几个重要的概念需要了解:

  1. 图(Graph):图是由节点(或顶点)和边组成的数据结构。节点表示实体或对象,边表示节点之间的连接关系。图可以是有向的(边具有方向)或无向的(边没有方向)。

  2. 权重(Weight):在带权图中,每条边都会有一个权重或成本值,表示通过该边所需的代价或距离。权重可以表示为正数(表示距离或代价)或负数(表示利益或收益)。

  3. 路径(Path):路径是图中连接两个节点的一系列边的序列。路径可以是简单路径,即不经过重复节点的路径,或者可以包含重复节点的环路。

  4. 最短路径(Shortest Path):最短路径是指连接图中两个节点的路径中具有最小权重(或成本)的路径。最短路径可能有多条,取决于图中边的权重和路径的定义。

  5. 距离(Distance):在最短路径算法中,距离是指从一个节点到另一个节点的路径的权重或成本。

最短路径算法的目标是找到连接两个节点之间的最短路径,其中路径的长度是通过边的权重来衡量的。这些算法使用不同的策略和技术来搜索和计算最短路径,以满足特定的需求和约束条件。

2. 应用

当谈到最短路径算法时,Dijkstra算法是一个经典的选择。以下是一个使用Python实现Dijkstra算法的示例:

import heapq

def dijkstra(graph, start):
    # 创建一个字典,用于存储每个节点的最短路径距离
    distances = {node: float('inf') for node in graph}
    # 将起始节点的最短路径距离设为0
    distances[start] = 0
    
    # 使用优先队列来存储待处理的节点
    priority_queue = [(0, start)]
    
    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].items():
            distance = current_distance + weight
            
            # 如果经过当前节点到达邻居节点的距离更短,则更新最短路径距离
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                # 将邻居节点及其距离加入优先队列
                heapq.heappush(priority_queue, (distance, neighbor))
    
    return distances

# 示例图的邻接表表示
graph = {
    'A': {'B': 3, 'C': 2},
    'B': {'A': 3, 'C': 1, 'D': 5},
    'C': {'A': 2, 'B': 1, 'D': 3},
    'D': {'B': 5, 'C': 3}
}

start_node = 'A'
shortest_distances = dijkstra(graph, start_node)

print(f"从节点 {start_node} 出发到达其他节点的最短路径距离:")
for node, distance in shortest_distances.items():
    print(f"{node}: {distance}")

这个示例中,使用邻接表来表示图。graph变量是一个字典,其中每个键表示一个节点,对应的值是一个字典,表示该节点的邻居节点以及对应的权重。

dijkstra函数实现了Dijkstra算法。它使用了优先队列来选择当前距离最短的节点,并通过遍历邻居节点来更新最短路径距离。

最后,使用示例图中的节点’A’作为起始节点,调用dijkstra函数计算从起始节点到其他节点的最短路径距离,并打印结果。

3. 示例代码

示例:使用字典的方式构建有向图,并搜索图中的路径。
图很容易通过列表和词典来构造。比如说,这有一张简单的图:
 A -> B
 A -> C
 A -> D
 B -> E
 C -> D
 C -> F
 D -> B
 D -> E
 E ->  
 F -> D
 F -> G
 G -> E
这个图有6个节点(A-G)8个弧。它可以通过下面的Python数据结构来表示:
graph = {'A': ['B', 'C','D'],
              'B': [ 'E'],
              'C': ['D','F'],
              'D': ['B','E','G'],
              'E': [],
              'F': ['D','G']
             'G': ['E']}
代码
# 找到一条从start到end的路径
def findPath(graph,start,end,path=[]):   
    path = path + [start]
    if start == end:
        return path 
    for node in graph[start]:
        if node not in path:
            newpath = findPath(graph,node,end,path)
            if newpath:
                return newpath
    return None
 
# 找到所有从start到end的路径
def findAllPath(graph,start,end,path=[]):
    path = path +[start]
    if start == end:
        return [path]
 
    paths = [] #存储所有路径    
    for node in graph[start]:
        if node not in path:
            newpaths = findAllPath(graph,node,end,path) 
            for newpath in newpaths:
                paths.append(newpath)
    return paths
 
# 查找最短路径
def findShortestPath(graph,start,end,path=[]):
    path = path +[start]
    if start == end:
        return path
    
    shortestPath = []
    for node in graph[start]:
        if node not in path:
            newpath = findShortestPath(graph,node,end,path)
            if newpath:
                if not shortestPath or len(newpath)<len(shortestPath):
                    shortestPath = newpath
    return shortestPath
 
    '''
主程序
'''
graph = {'A': ['B', 'C','D'],
         'B': [ 'E'],
         'C': ['D','F'],
         'D': ['B','E','G'],
         'E': [],
         'F': ['D','G'],
         'G': ['E']}
 
onepath = findPath(graph,'A','G')
print('一条路径:',onepath)
 
allpath = findAllPath(graph,'A','G')
print('\n所有路径:',allpath)
 
shortpath = findShortestPath(graph,'A','G')
print('\n最短路径:',shortpath)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python对csv文件一键多值保存为json本地文件再读取加速效率(3)

最近发现做办公自动化表格匹配的时候还是csv格式的文件最快、效率是最高的 今天接到一个需求就是大致内容之这样的 1、给我一张表格直邮一列A列&#xff0c;内容是运单号 2、需要用相同的单号去另外一张表格匹配数据 3、其实就是Excel中的常见的vlookup 但是想要匹配的表格有几…

D351周赛复盘:美丽下标对数目(互质/数学运算)+数组划分若干子数组

文章目录 6466.美丽下标对数目思路互质的含义 python写法cpp写法 6910. 将数组划分成若干好子数组的方式思路完整版ans (ans * (ls[i 1] - ls[i]))含义重要问题1&#xff1a;为什么ls[i 1] - ls[i]能代表所有这两个1划分出来的子数组&#xff1f;重要问题2&#xff1a;为什么…

java 版本企业招标投标管理系统源码,多个行业+及时准确+全程电子化

计算机与网络技术的不断发展&#xff0c;推动了社会各行业信息化的步伐。时至今日&#xff0c;电子政务、电子商务已经非常普及&#xff0c;云计算、大数据、工业4.0、“互联网”等发展理念也逐步深入人心&#xff0c;如何将传统行业与互联网科技有效结合起来&#xff0c;产生1…

谷歌浏览器无法翻译成中文,谷歌翻译,最新(沉浸式翻译和划词翻译,chrome无法翻译,谷歌浏览器无法翻译此网页)

简介&#xff1a;谷歌浏览器自带的翻译功能&#xff0c;对我们来说用处很大&#xff0c;但有的时候突然就会变成“无法翻译此网页”&#xff0c;之前给大家提供过两种无法翻译此网页的解决方案&#xff0c;这次再给大家分享下两款别的翻译方法&#xff1b; 一、上次介绍&#x…

如何用ChatGPT使开发效率提高50%以上?

简介 ChatGPT是一个大型语言模型&#xff0c;由OpenAI开发。它被训练用于进行对话式交互&#xff0c;能够理解和生成自然语言文本。ChatGPT可以用于多种任务和场景&#xff0c;包括但不限于&#xff1a;智能助手、创意生成、语言学习、编程辅助等。ChatGPT的优势在于它的广泛知…

搭建个人音乐库-navidrome

文章目录 前言navidrome 服务搭建准备音乐材料客户端 前言 搭建个人音乐库。好玩而已。 没有做过多的筛选。在navidrome 和 koel 之间&#xff0c;选择了navidrome来搭建音乐库。 主要分为这几个步骤&#xff1a; 在服务器上搭建navidrome服务(web端)。准备音乐材料。手机上…

免费去除视频水印的几个方法!记得收藏好!

怎么去除视频水印&#xff1f;相信大家应该不难发现&#xff0c;现在很多网上的视频保存下来都会有水印&#xff0c;原本是想拿这些视频当作素材来使用&#xff0c;结果就是让人很苦恼&#xff0c;但其实我们可以借助记灵在线工具将它们的水印去掉&#xff0c;下面我给大家分享…

谷歌带走了我最爱的全文翻译,连夜找来1个复活方法和6个替代神器!

想必前段时间大家都被谷歌翻译退出中国的相关文章刷屏过了 虽然表面上谷歌官方给出的原因是中国用户太少、使用率太低了&#xff0c;所以才选择退出中国市场。但根据网上的猜测&#xff0c;更大的可能应该是因为给谷歌翻译接入的 googleapis.com 在9月28日因某种神秘力量而国内…

JVM原理简介

前言 JVM一直是java知识里面进阶阶段的重要部分&#xff0c;如果希望在java领域研究的更深入&#xff0c;则JVM则是如论如何也避开不了的话题&#xff0c;本系列试图通过简洁易读的方式&#xff0c;讲解JVM必要的知识点。 运行流程 我们都知道java一直宣传的口号是&#xff1a;…

应急响应篇之Linux入侵排查

0x00 前言 当企业发生黑客入侵、系统崩溃或其它影响业务正常运行的安全事件时&#xff0c;急需第一时间进行处理&#xff0c;使企业的网络信息系 统在最短时间内恢复正常工作&#xff0c;进一步查找入侵来源&#xff0c;还原入侵事故过程&#xff0c;同时给出解决方案与防范措…

【CV】从分类到回归:常见算法评价指标,如ROC,MAP等

目录 分类问题准确率&#xff08;Accuracy&#xff09;精确率&#xff08;Precision&#xff09;召回率或真正率&#xff08;Recall&#xff09;假正率&#xff08;False Positive Rate, FPR&#xff09;特异性&#xff08;Specificity&#xff09;ROC曲线P-R曲线&#xff08;精…

AI换脸背后的产业链详解,往后神仙姐姐背后有可能是......

近期在各大平台都可以看到换脸新闻&#xff0c;和大家分享一下最近让我心痛的一张图片 那除了大家用来恶搞之外&#xff0c;AI诈骗的新闻层出不穷。我们国内目前今天最大的是下面这起事件&#xff1a; 而国外&#xff0c;因为技术更加成熟一点&#xff0c;所以被诈骗的金额高达…

PostgreSQL修炼之道之数据库优化(十八)

12.1 数据库优化准则和方法 12.1.1 数据库优化准则 数据库优化的思路有很多种。比较常用的是下面两种优化思路。 第一种思路&#xff1a;有人说过&#xff0c;“The fastest way to do something is dont do it”&#xff0c;意思是说&#xff0c;“做得最快的方法就是不做”…

mysql 集群实验~~双主双从搭建

这里写目录标题 搭建mysql集群实现双主双从的同步一、部署环境1.1 分别安装mysql服务并设置域名解析 二、 配置双主MySQL服务器2.1由于是双主&#xff0c;所以master2是master1的从&#xff0c;同时master1又是master2的从所以都要开启二进制和中继日志2.2 重启服务2.3 测试双主…

医院云HIS:运维运营分系统功能简介

一、运维运营分系统简介 一级菜单包括&#xff1a;系统运维、综合监管、系统运营 系统运维包括二级菜单&#xff1a;环境管理、应用管理、菜单管理、接口管理、任务管理、配置管理 综合监管包括二级菜单&#xff1a;综合监管 系统运营包括二级菜单&#xff1a;机构管理、药…

【海明码】一题学会海明码!

一、详细步骤 1、海明码&#xff0c;也称汉明码 2、海明码数据码校验码 3、假设数据码为1100&#xff0c;有4位&#xff0c;即n4 4、由公式2^k>nk1&#xff0c;解得k3&#xff0c;即需3个校验码 5、校验按2^i&#xff08;即2的i次幂&#xff0c;如1、2、4、8、16、32..…

2入门matlab图像处理图像的基本操作(matlab程序)

学习目标&#xff1a;学习关于图像的基本操作 代码及运行结果 %% 通过抖动来增强图像的色彩对比度 clear all; close all; Iimread(cameraman.tif); %读取灰度图像 BWdither(I); %通过抖动转换为二值图像来增强图像的色彩对比度 subplot(121); imshow(I); subplot(122);…

电气火灾监控系统行业技术应用现状

摘要&#xff1a;我国现有的电气火灾监控系统的应用效果不佳&#xff0c;为了让电气火灾监控系统的发展能满足现代化人们的需要&#xff0c;对此进行分析与研究。网络化时代的到来&#xff0c;电气火灾监控系统将顺应时代潮流&#xff0c;逐步实现系统的网络化、智能化、可视化…

神经网络原理(1)

眼下最热门的技术&#xff0c;绝对是人工智能。 人工智能的底层模型是"神经网络"&#xff08;neural network&#xff09;。许多复杂的应用&#xff08;比如模式识别、自动控制&#xff09;和高级模型&#xff08;比如深度学习&#xff09;都基于它。学习人工智能&a…

sql笛卡尔积和自然连接

SQL中的笛卡尔积 即AxB。可以简单理解为两个集合的乘积。 SQL语法 SELECT * FROM tb1 CROSS JOIN tb2; -- 等价于 SELECT * FROM tb1, tb2; -- 等价于 SELECT * FROM tb1 INNER JOIN tb2; -- 这是内连接**CROSS JOIN不能加ON。** 从行和列两个维度来观察上例笛卡尔积的结果集…