用现代算法为大唐运荔枝,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算法到头来胜出, 原因有三:
- 它计算的是全局最优路径,但对负权边和动态网络适应性较弱。咱这也基本不是这种情况,所以就选它了。
- 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 再 运行 了 一遍 。
或 许 , 每 个 程序员 都 是 数 字 时代 的驿 站 使 者 , 我倾向于... 用 代码 传 递 着另 类 的 " 荔枝 " 。

