最短路径算法——Dijkstra介绍

2023-05-16

个人心得体会:理解这种或这类算法,可以先从小规模的问题入手,并逐渐推广到问题变复杂的情况,这样理解起来也可以更方便和透彻。——和数学归纳法很相似。


图简介

以使用地图APP为例,假设你想前往某个目的地,此间有很多条线路可以选,如地铁、不同的公交换乘方案。而不同的方案所需换乘的次数不同。那么怎么才能选出换乘次数最少的方案呢?

有向图:节点和节点之间的连接是有方向的。

无向图:节点和节点之间相互联系。

上文提到的最优换乘方案选择,即可以用有向图进行抽象(总不能在同样的两个公交站之间来回换乘吧)。根据这个图,可以做的事:1. 观察是否有从“双子峰”前往“金门大桥”的路径,2. 最短路径是哪条。

此时图是为无权重的,即去每条路线的cost都相同。那么当考虑加权呢,即乘坐不同公交耗费时间不同,怎么来寻找前往目的地的最短时间?就需要适用于加权图的搜索算法出场,接下来介绍Dijkstra算法。


Dijkstra

主要解决的问题是给定起点S和目标点E,如何得出S到E的最短路径。算法主要思想是

带权的有向图

为什么不能处理负权边?

可能出现这样一种情况:因为dijktra算法每次都先寻找前往节点的最小值(正数),并将节点加入已访问集合之中,之后不再对其进行更新。

举个例子,目标:寻找A-C的最短路径。使用Dijkstra算法时,比较从A->B和A->C的开销,显然A->C的更小,于是选择到C的路径,并将C处理成处理过的节点。到这里发现了什么问题呢,A->B->C不是更短吗?就是负权边的情况。

Dijkstra算法实现步骤

  1. 寻找某点开始,相邻的最短路径;
  2. 选另一条路径,比较同样前往此节点的,更新开销最小的,并更新路径;
  3. 重复此步骤,直到最后一个节点;
  4. 计算最终路径。

示例

使用的数据结构:

  1. graph:键值对,保存路径的长短信息
  2. costs:数组,保存到达当前节点的最短路径
  3. parent:键值对,保存最短路径
# coding: utf-8
# 以《图解算法》7.5中的图为例

def graph_gen():
    graph = {}
    graph['start'] = {}
    graph['start']['a'] = 6
    graph['start']['b'] = 2
    graph['b'] = {}
    graph['b']['a'] = 3
    graph['b']['end'] = 5
    graph['a'] = {}
    graph['a']['end'] = 1
    graph['end'] = {}
    return graph

def cost_gen():
    inifity = float('inf')
    costs = {}
    costs['a'] = 6
    costs['b'] = 2
    costs['end'] = inifity
    return costs

def parent_gen():
    parent = {}
    parent['a'] = 'start'
    parent['b'] = 'start'
    parent['end'] = None
    return parent

def find_lowest_cost_node(costs, processed):
    lowest_cost = float('inf')
    lowest_node = None
    for key in costs.keys():
        if key not in processed and lowest_cost > costs[key]:
                lowest_cost = costs[key]
                lowest_node = key
    return lowest_node

def Dijkstra(graph, costs, relation):
    processed = []
    node = find_lowest_cost_node(costs, processed)
    while node is not None:
        cost = costs[node]
        neighbors = graph[node]
        for n in neighbors.keys():
            new_cost = cost + neighbors[n]
            if costs[n] > new_cost:
                costs[n] = new_cost
                relation[n] = node
        processed.append(node)
        node = find_lowest_cost_node(costs, processed)
    return relation

def output(realtion):
    begin = relation['end']
    str_ = 'end--'

    while begin is not None:
        for key, value in relation.items():
            if key == begin:
                str_ += begin + '__'
                begin = value
                break
        else:
            begin = None
    print str_ + 'start'

relation = Dijkstra(graph_gen(), cost_gen(), parent_gen())
# print relation
output(relation)
NodeParent    --->NodeParent
astartab
bbstart
endenda

 

结果输出:因Dijkstra算法是从末尾指向头的key value类型,倒着就是最短路径

end--a__b__start

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最短路径算法——Dijkstra介绍 的相关文章

  • TT 的旅行日记(Dijkstra)

    问题描述 xff1a 众所周知 xff0c TT 有一只魔法猫 今天他在 B 站上开启了一次旅行直播 xff0c 记录他与魔法猫在喵星旅游时的奇遇 TT 从家里出发 xff0c 准备乘坐猫猫快线前往喵星机场 猫猫快线分为经济线和商业线两种
  • 最短路径算法——Dijkstra介绍

    个人心得体会 xff1a 理解这种或这类算法 xff0c 可以先从小规模的问题入手 xff0c 并逐渐推广到问题变复杂的情况 xff0c 这样理解起来也可以更方便和透彻 和数学归纳法很相似 图简介 以使用地图APP为例 xff0c 假设你想
  • 游戏中的寻路算法--Dijkstra算法和AStar(A*)算法

    前言 如今游戏中最最常用的两种寻路算法为Dijkstra算法和A 算法 xff0c 虽然现代引擎中的Al寻路算法看似很复杂 其实大部分是Dijkstra算法或者A 算法的变种 导航网格 图数据 无论是2D游戏的导航网格或者3D游戏导航网格
  • 数据结构——迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉算法又叫狄克斯特拉算法 是从一个顶点到其余各顶点的最短路径算法 解决的是有权图中最短路径问题 迪杰斯特拉算法主要特点是从起始点开始 采用贪心算法的策略 每次遍历到始点距离最近且未访问过的顶点的邻接节点 直到扩展到终点为止 以下是数
  • 【MATLAB】最短路径Dijkstra算法

    目录 1 Dijkstra算法 1 1使用范围 1 2算法思路 1 3实例 2 代码 2 1dijstra函数 2 2调用函数 1 Dijkstra算法 1 1使用范围 bullet 寻求从一固定顶点到其余各点的最短路径
  • 最短路径之迪克斯特拉(Dijkstra)算法

    何谓最短路径 顾名思义就是在一个图中 一个顶点到另外一个顶点的最短距离拉 那么这里有一点要注意 就是在网图中 边的权值各不相同 最短路径指的是俩点之间的连线权值最小 在非网图 边的权值都默认为1 中最短路径指的是边数最少的 从一个顶点到其余
  • 【算法学习笔记】20:朴素Dijkstra与堆优化Dijkstra(无负权边单源点最短路)

    Dijkstra算法用于在所有边权都非负的图上 求单源点最短路 设 n n n是图上结点的数量 m m m是边的数量 则朴素Dijkstra算法的时间复杂度是 O
  • 最短路径——Dijkstra算法(C语言实现)

    最短路径 Dijkstra算法 基本概念 1 最短路径 非带权图 边数最少的路径 带权图 边上的权值之和最少的路径 基本思想 1 v 源点 S 已经生成最短路径的终点 w
  • 1345:香甜的黄油(Dijkstra)---信息学奥赛一本通

    题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法 糖 把糖放在一片牧场上 他知道N 1 N 500 只奶牛会过来舔它 这样就能做出能卖好价钱的超甜黄油 当然 他将付出额外的费用在奶牛上 农夫John很狡猾 像以前的巴甫洛夫 他知道
  • 天梯题集——紧急救援(Dijkstra+倒序打印分析)

    Dijkstra算法 用于求单源到其他点的最短路径 紧急救援 该题与 Dijkstra模板题 的不同之处在于该题需要记录更多信息 主要思路从局部最优到整体最优 类似dp的思想 include
  • Dijkstra 负权重算法

    好吧 首先我知道 Dijkstra 不适用于负权重 我们可以使用 Bellman ford 代替它 但在我遇到的一个问题中 它指出所有边的权重都从 0 到 1 不包括 0 和 1 而路径的成本实际上就是产品 所以我的想法就是只取日志 现在所
  • 使用 Dijkstra 算法寻找最短路径

    我需要找到图的两个顶点之间的最短路线 我有一个矩阵 其中包含所有权重 我该怎么做 目前 我有以下代码 private int Dijkstra int start int end bool done new bool 8 int paren
  • CUDA dijkstra 算法 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 是否有人针对给定的稀疏矩阵 cuSPARSE 图实现了 Dijkstra 算法的 CUD
  • 如果顶点属性是指针,如何使用 boost::graph dijkstra 算法?

    我使用 boost graph 来管理图表 我需要制作一个 maxmin 树 现在我尝试使用 boost dijkstra 算法 但我使用指向我的类的指针作为顶点属性 而不是使用typedef property
  • “双图”中变化次数有限的最短路径

    假设我们在一组顶点上有两个有向正权图 第一个图代表铁路 第二个图代表公交车道 顶点是公交车站或火车站或两者 我们需要找到从 A 到 B 的最短路径 但我们不能改变交通工具类型超过 N 次 我试图修改 Dijkstra 算法 但它只适用于一些
  • 图 - 具有顶点权重的最短路径

    这是一个消费税 在某些图问题中 顶点可以有权重而不是 或者除了边的权重之外 设 Cv 为顶点的成本 v 和 C x y 边 x y 的成本 这个问题大家关心 寻找图 G 中顶点 a 和 b 之间最便宜的路径 路径的成本是边和顶点的成本之和
  • 使用字典中的特定键构建列表(python)?

    我正在用 Python 实现 Dijkstra 搜索算法 在搜索结束时 我使用前驱图重建最短路径 从目标节点的前驱开始 例如 path path append destination previous predecessor map des
  • 如何获取两个节点之间的最小路径的权重?

    我有一个Python 中的networkx 图 带有加权边 我想获得两个节点之间的最小路径的权重 目前 我从 nx shortest path 实现中获取最短路径中的节点 然后迭代每对并对每对节点之间的权重求和 shortest path
  • 数组中超过 640 000 个元素 - 内存问题 [Dijkstra]

    我有一个脚本将 803 803 644809 每个图表内有 1 000 000 个值 使用 500 500 一切正常 但现在它崩溃了 它尝试分配超过 64MB 的内存 我没有 解决办法是什么 以某种方式 分裂 它还是 result mysq
  • Dijkstra 谈“软件工程”[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 埃兹格 迪杰斯特拉 Edsger D

随机推荐