用现代算法为大唐运荔枝,Dijkstra算法能否重温经典魅力?

2026-05-29 21:095阅读0评论运维
  • 内容介绍
  • 文章标签
  • 相关推荐

大唐荔枝运输记:Dijkstra算法重燃经典魅力

我, 一个现代普通码农,一觉醒来居然穿越到了魂牵梦绕的大唐。众所周知荔枝特别容易坏, 所以为了让圣人满意,让“中书省”的各位大人们肯拨付银两,咱们还是得想出一条最短最快的运输路径。

何况链路变化小,这大唐太平盛世不可能所有道路一边“断联”,哈哈,我们一起...。

重温经典Dijkstra算法——看我用现代算法来为大唐运荔枝!

问题背景:从深圳到西安的荔枝运输

看好你哦! “圣上有旨, 你是圣人钦点的“荔枝使”,负责将荔枝从“岭南”运往“长安”,即可启程,钦此!” 只见远处走来一个公公,他告诉我:

来来来我现在来就给你运荔枝!

坦白说... 我,低头,看了一眼自己身上这花花红红的朝服。再看看周遭繁华的市井。我从深圳除非到广州, 再到长沙到武汉...

Dijkstra算法登场

Dijkstra算法是一种用于求解单源最短路径的经典算法,适用于带权有向图或无向图。 我心态崩了。 它的核心思想是的核心,尤其适用于链路状态协议。

Dijkstra算法到头来胜出, 原因有三:

  • 它计算的是全局最优路径,但对负权边和动态网络适应性较弱。咱这也基本不是这种情况,所以就选它了。
  • A*算法其实也可以用, 它更多用于游戏中的寻路,是一种启发式搜索,能更快找到目标节点路径,但不保证全局最优。也就是作为荔枝使的你还是不能免责, 很可能被圣人刀了啊

构建城市图数据结构

先说说需要将唐代的驿站网络抽象为图结构:

扎心了... city_graph2 = { '深圳': { '广州': {'time': 1.5, 'cost': 0.8}, # 高速公路,费用适中 '东莞': {'time': 1.0, 'cost': 0.5} # 短距离,费用低 }, '广州': { '深圳': {'time': 1.5, 'cost': 0.8}, '韶关': {'time': 2.5, 'cost': 1.2}, # 中等距离,费用适中 '长沙': {'time': 5.5, 'cost': 3.5} # 长距离,费用高 }, # ... 其他城市连接省略 ... }

新的城市图数据结构如下:

Dijkstra算法实现与优化

代码语言:python

胡诌。 import heapq def dijkstra: # 初始化距离字典,所有城市距离设为无穷大 distances = {city: float for city in graph} distances = 0

# 优先队列,存储
heap = 
heapq.heappush)
while heap:
    current_distance, current_city, path = heapq.heappop
    # 如果到达终点,返回后来啊
    if current_city == end:
        return current_distance, path
    # 如果当前距离大于已知距离,跳过
    if current_distance> distances:
        continue
    # 遍历邻居城市
    for neighbor, weight in graph.items:
        distance = current_distance + weight
        # 如果找到更短路径,更新距离并加入堆
        if distance 

附代码如下:

可视化最优路径

import matplotlib.pyplot a 摸个底。 s plt import networkx as nx

实不相瞒... def visualizepath: # 设置中文字体 plt.rcParams = # 用来正常显示中文标签 plt.rcParams = False # 用来正常显示负号

G = nx.DiGraph
# 添加所有节点和边
for city in graph:
    G.add_node
    for neighbor, weight in graph.items:
        G.add_edge
# 设置图形布局
pos = nx.spring_layout
# 绘制所有节点和边
nx.draw_networkx_nodes
nx.draw_networkx_labels
nx.draw_networkx_edges
# 高亮显示路径
path_edges = list)
nx.draw_networkx_edges(G, pos, edgelist=path_edges,
                       edge_color='red', width=3, arrows=True)
# 添加边权重标签
edge_labels = nx.get_edge_attributes
nx.draw_networkx_edge_labels
plt.title
plt.axis
plt.show

运行后来啊与分析

程序使用Dijkstra算法成功计算出了最短路径,总运输时间为20小时。这是从深圳到西安运输荔枝的最优路线。

起点终点总时间最优路径
深圳西安20.0深圳 → 广州 → 长沙 → 武汉 → 西安

进阶功能:断边模拟与动态规划

实现"断路模拟"功能时:选择是否模拟断边情况, 选择要断开连接的两个城市, 动手。 在断边后的图上计算最优路径。

一句话。 def removeedge: import copy modifiedgraph = copy.deepcopy

if city2 in modified_graph:
    del modified_graph
    print
if city1 in modified_graph:
    del modified_graph
    print
return modified_graph

"一骑红尘妃子笑,无人知是荔枝来。" —— 技术感悟

"代码写久了看什么都像对象;算法想深了看什么都像图。" —— 某程序员在调试时的顿悟。这不就是成年人的日常抉择吗?在时间和金钱间寻找平衡点。

"一骑红尘妃子笑,无人知是荔枝来。" 杜牧笔下这短短14个字,真是可以说道尽了唐代荔枝运输的艰辛。作为程序员, 百感交集。 每想到这句诗,我的CPU就又开始过热——如果用现代算法优化,究竟能否让杨贵妃吃上更新鲜的荔枝?

… 这次大唐之行让我深刻理解了Dijkstra算法,也明白了技术改变历史的可能性——虽然只是虚拟的。再说说如果堆被处理完毕仍未找到终点,则返回无穷大和空列表,表示没有可行路径,奥利给!。

部分城市间交通时间表
**路线** **时间** **路线** **时间**
长沙 → 武汉 3.0 广州 → 长沙 5.5
武汉 → 西安 10.0 深圳 → 广州 1.5
**注** :本 表仅 列出 部 分城 市间 时 间 ,具 体请 以 城 市 图 数 据 结 构 为准 。

小小一下

从深圳到西安的荔枝运输最优路径如下:

最优路径 : 深圳 → 广州 → 长沙 → 武汉 → 西安

总运输时间 : 20.0 小时

详细 路径 信息 :

  • 总加权 值 : 根据 时间 和费 用综 合计 算

  • 总 时间 : 各 路段 时间 之 和

  • 总费 用 : 各 路段费 用累 计

  • 路径 : 最优 路线各 站 点依 次列 出

略微写下程序跑图,你看看这图,这点,这边~!,实不相瞒...

不是 ,哥 们 , 我没想到 你 来 真 的 ! 我 ,一 个熊猫 一样 的男人 ,居 然 穿越 成 了 大 唐 “ 荔枝 使 ” ,性价比超高。!

抄近道。 考虑 到 这 一路 跋山涉 水 , 特 别 是 武汉 到 西安 那令 人 发 指 的10 .0 的权 重 ,其 实 本 武汉 “ 荔枝 使 ” 想 的 是 ,咱 就 自个 儿 吃 好喝 好 再 谢罪 得 了 ,咳咳 , 圣 人 就 不必 吃 了 !

这 其 实并 不复 杂 , 只 是简 单 在 修改 图 后 , 把 Dijkstra 再 运行 了 一遍 。

或 许 , 每 个 程序员 都 是 数 字 时代 的驿 站 使 者 , 我倾向于... 用 代码 传 递 着另 类 的 " 荔枝 " 。

大唐荔枝运输记:Dijkstra算法重燃经典魅力

我, 一个现代普通码农,一觉醒来居然穿越到了魂牵梦绕的大唐。众所周知荔枝特别容易坏, 所以为了让圣人满意,让“中书省”的各位大人们肯拨付银两,咱们还是得想出一条最短最快的运输路径。

何况链路变化小,这大唐太平盛世不可能所有道路一边“断联”,哈哈,我们一起...。

重温经典Dijkstra算法——看我用现代算法来为大唐运荔枝!

问题背景:从深圳到西安的荔枝运输

看好你哦! “圣上有旨, 你是圣人钦点的“荔枝使”,负责将荔枝从“岭南”运往“长安”,即可启程,钦此!” 只见远处走来一个公公,他告诉我:

来来来我现在来就给你运荔枝!

坦白说... 我,低头,看了一眼自己身上这花花红红的朝服。再看看周遭繁华的市井。我从深圳除非到广州, 再到长沙到武汉...

Dijkstra算法登场

Dijkstra算法是一种用于求解单源最短路径的经典算法,适用于带权有向图或无向图。 我心态崩了。 它的核心思想是的核心,尤其适用于链路状态协议。

Dijkstra算法到头来胜出, 原因有三:

  • 它计算的是全局最优路径,但对负权边和动态网络适应性较弱。咱这也基本不是这种情况,所以就选它了。
  • A*算法其实也可以用, 它更多用于游戏中的寻路,是一种启发式搜索,能更快找到目标节点路径,但不保证全局最优。也就是作为荔枝使的你还是不能免责, 很可能被圣人刀了啊

构建城市图数据结构

先说说需要将唐代的驿站网络抽象为图结构:

扎心了... city_graph2 = { '深圳': { '广州': {'time': 1.5, 'cost': 0.8}, # 高速公路,费用适中 '东莞': {'time': 1.0, 'cost': 0.5} # 短距离,费用低 }, '广州': { '深圳': {'time': 1.5, 'cost': 0.8}, '韶关': {'time': 2.5, 'cost': 1.2}, # 中等距离,费用适中 '长沙': {'time': 5.5, 'cost': 3.5} # 长距离,费用高 }, # ... 其他城市连接省略 ... }

新的城市图数据结构如下:

Dijkstra算法实现与优化

代码语言:python

胡诌。 import heapq def dijkstra: # 初始化距离字典,所有城市距离设为无穷大 distances = {city: float for city in graph} distances = 0

# 优先队列,存储
heap = 
heapq.heappush)
while heap:
    current_distance, current_city, path = heapq.heappop
    # 如果到达终点,返回后来啊
    if current_city == end:
        return current_distance, path
    # 如果当前距离大于已知距离,跳过
    if current_distance> distances:
        continue
    # 遍历邻居城市
    for neighbor, weight in graph.items:
        distance = current_distance + weight
        # 如果找到更短路径,更新距离并加入堆
        if distance 

附代码如下:

可视化最优路径

import matplotlib.pyplot a 摸个底。 s plt import networkx as nx

实不相瞒... def visualizepath: # 设置中文字体 plt.rcParams = # 用来正常显示中文标签 plt.rcParams = False # 用来正常显示负号

G = nx.DiGraph
# 添加所有节点和边
for city in graph:
    G.add_node
    for neighbor, weight in graph.items:
        G.add_edge
# 设置图形布局
pos = nx.spring_layout
# 绘制所有节点和边
nx.draw_networkx_nodes
nx.draw_networkx_labels
nx.draw_networkx_edges
# 高亮显示路径
path_edges = list)
nx.draw_networkx_edges(G, pos, edgelist=path_edges,
                       edge_color='red', width=3, arrows=True)
# 添加边权重标签
edge_labels = nx.get_edge_attributes
nx.draw_networkx_edge_labels
plt.title
plt.axis
plt.show

运行后来啊与分析

程序使用Dijkstra算法成功计算出了最短路径,总运输时间为20小时。这是从深圳到西安运输荔枝的最优路线。

起点终点总时间最优路径
深圳西安20.0深圳 → 广州 → 长沙 → 武汉 → 西安

进阶功能:断边模拟与动态规划

实现"断路模拟"功能时:选择是否模拟断边情况, 选择要断开连接的两个城市, 动手。 在断边后的图上计算最优路径。

一句话。 def removeedge: import copy modifiedgraph = copy.deepcopy

if city2 in modified_graph:
    del modified_graph
    print
if city1 in modified_graph:
    del modified_graph
    print
return modified_graph

"一骑红尘妃子笑,无人知是荔枝来。" —— 技术感悟

"代码写久了看什么都像对象;算法想深了看什么都像图。" —— 某程序员在调试时的顿悟。这不就是成年人的日常抉择吗?在时间和金钱间寻找平衡点。

"一骑红尘妃子笑,无人知是荔枝来。" 杜牧笔下这短短14个字,真是可以说道尽了唐代荔枝运输的艰辛。作为程序员, 百感交集。 每想到这句诗,我的CPU就又开始过热——如果用现代算法优化,究竟能否让杨贵妃吃上更新鲜的荔枝?

… 这次大唐之行让我深刻理解了Dijkstra算法,也明白了技术改变历史的可能性——虽然只是虚拟的。再说说如果堆被处理完毕仍未找到终点,则返回无穷大和空列表,表示没有可行路径,奥利给!。

部分城市间交通时间表
**路线** **时间** **路线** **时间**
长沙 → 武汉 3.0 广州 → 长沙 5.5
武汉 → 西安 10.0 深圳 → 广州 1.5
**注** :本 表仅 列出 部 分城 市间 时 间 ,具 体请 以 城 市 图 数 据 结 构 为准 。

小小一下

从深圳到西安的荔枝运输最优路径如下:

最优路径 : 深圳 → 广州 → 长沙 → 武汉 → 西安

总运输时间 : 20.0 小时

详细 路径 信息 :

  • 总加权 值 : 根据 时间 和费 用综 合计 算

  • 总 时间 : 各 路段 时间 之 和

  • 总费 用 : 各 路段费 用累 计

  • 路径 : 最优 路线各 站 点依 次列 出

略微写下程序跑图,你看看这图,这点,这边~!,实不相瞒...

不是 ,哥 们 , 我没想到 你 来 真 的 ! 我 ,一 个熊猫 一样 的男人 ,居 然 穿越 成 了 大 唐 “ 荔枝 使 ” ,性价比超高。!

抄近道。 考虑 到 这 一路 跋山涉 水 , 特 别 是 武汉 到 西安 那令 人 发 指 的10 .0 的权 重 ,其 实 本 武汉 “ 荔枝 使 ” 想 的 是 ,咱 就 自个 儿 吃 好喝 好 再 谢罪 得 了 ,咳咳 , 圣 人 就 不必 吃 了 !

这 其 实并 不复 杂 , 只 是简 单 在 修改 图 后 , 把 Dijkstra 再 运行 了 一遍 。

或 许 , 每 个 程序员 都 是 数 字 时代 的驿 站 使 者 , 我倾向于... 用 代码 传 递 着另 类 的 " 荔枝 " 。