贝尔曼福特算法概念详解 Python实现贝尔曼福特算法

发布:2022-10-27 10:48:26
阅读:16489
作者:网络整理
分享:复制链接

贝尔曼福特算法(Bellman Ford)可以找到从目标节点到加权图其他节点的最短路径。这一点和Dijkstra算法很相似,贝尔曼福特算法可以处理负权重的图,从实现来看也相对简单。

贝尔曼福特算法原理详解

贝尔曼福特算法通过高估从起始顶点到所有其他顶点的路径长度,迭代寻找比高估路径更短的新路径。

因为我们要记录每个节点的路径距离,可以将其存储在大小为n的数组中,n也代表了节点的数量。

实例图

1、选择起始节点,并无限指定给其他所有顶点,记录路径值。

2、访问每条边,并进行松弛操作,不断更新最短路径。

3、我们需要这样做N-1次,因为在最坏的情况下,最短节点路径长度可能需要重新调整N-1次。

4、注意右上角的节点是如何调整其路径长度的。

5、在所有节点都有路径长度之后,再检查是否存在负环路。

Python实现贝尔曼福特算法

class Graph:

def __init__(self, vertices):
self.V = vertices # Total number of vertices in the graph
self.graph = [] # Array of edges

def add_edge(self, s, d, w):
self.graph.append([s, d, w])

def print_solution(self, dist):
print("Vertex Distance from Source")
for i in range(self.V):
print("{0}\t\t{1}".format(i, dist[i]))

def bellman_ford(self, src):

dist = [float("Inf")] * self.V
dist[src] = 0

for _ in range(self.V - 1):
for s, d, w in self.graph:
if dist[s] != float("Inf") and dist[s] + w < dist[d]:
dist[d] = dist[s] + w

for s, d, w in self.graph:
if dist[s] != float("Inf") and dist[s] + w < dist[d]:
print("Graph contains negative weight cycle")
return

self.print_solution(dist)

g = Graph(5)
g.add_edge(0, 1, 5)
g.add_edge(0, 2, 4)
g.add_edge(1, 3, 3)
g.add_edge(2, 1, 6)
g.add_edge(3, 2, 2)

g.bellman_ford(0)
最新文章
网易灵动荣登2025中国技术力量年度榜单 ,装载机器人入选年度具身智能明星产品
2025-12-31 15:22:38
AI时代,为什么90%的协作都死在了“说不清楚”上?|有灵智能体有奖邀测
2025-12-30 11:05:29
行动中的认知:预测加工框架下的具身智能——未来展望:迈向自主行动的通用智能
2025-12-29 15:45:13
行动中的认知:预测加工框架下的具身智能——实现路径:主动推断与具身性的融合
2025-12-29 15:44:06
行动中的认知:预测加工框架下的具身智能——理论交融:从“具身心智”到“预测心智”
2025-12-29 15:42:49
热门文章
1亮相AICon 2024,网易伏羲“网易有灵AOP平台”助力打造《永劫无间》手游AI队友,首度开启邀测
2当“机器人革命”与“新质生产力”交汇,网易灵动如何重塑未来港口作业?
3创新突破!网易有灵玉声配音平台斩获2024中国设计智造大奖“佳作奖”
4真实故事分享|从全职宝妈到备考学生,他们用“碎片时间”灵活兼职、月入千元
5网易伏羲获得NeurIPS MineRL BASALT竞赛冠军
6全球首发!网易灵动推出“灵掘”具身智能模型,展示中国工程机械智能化硬核实力
7CNCC | 从游戏AI到AOP :虚实融合助推新质生产力
82025 年 CCF-网易雷火联合基金申报启动!
92024云栖大会启幕:AI硬科技集结 共创“无法计算的价值”
10网易伏羲发布网易有灵机器人测试版,人机协作助推产业智能升级
扫码进群
微信群
了解更多资讯