ホームページ  >  記事  >  バックエンド開発  >  Bellman Ford アルゴリズムと Python での実装の詳細な説明

Bellman Ford アルゴリズムと Python での実装の詳細な説明

WBOY
WBOY転載
2024-01-22 19:39:131156ブラウズ

Bellman Ford アルゴリズム (Bellman Ford) は、重み付きグラフ内のターゲット ノードから他のノードまでの最短パスを見つけることができます。これはダイクストラ アルゴリズムに非常に似ており、ベルマン フォード アルゴリズムは負の重みを持つグラフを処理でき、実装の点では比較的単純です。

ベルマン フォード アルゴリズムの原理の詳細な説明

ベルマン フォード アルゴリズムは、開始頂点から他のすべての頂点までのパスの長さを過大評価することにより、過大評価されたパスよりも短い新しいパスを繰り返し見つけます。

各ノードのパス距離を記録したいので、それをサイズ n の配列に保存できます。n はノードの数も表します。

インスタンス図

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

#1. 開始ノードを選択し、それを他のすべての頂点に無限に割り当て、パス値を記録します。 。

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

2. 各エッジを訪問し、緩和操作を実行して、最短パスを継続的に更新します。

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

3. 最悪の場合、最短ノード パスの長さを N 回調整する必要があるため、これを N-1 回行う必要があります。 - 1回。

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

4. 右上隅のノードがパスの長さをどのように調整するかに注目してください。

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

5. すべてのノードにパス長が設定されたら、負のループがあるかどうかを確認します。

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

Python は Bellman Ford アルゴリズムを実装します

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)

以上がBellman Ford アルゴリズムと Python での実装の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は163.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。