最短経路の検索 - ダイクストラのアルゴリズム

目次

1. ダイクストラアルゴリズムの概要

 2. 以下では、C# と PHP を使用してダイクストラのアルゴリズムのサンプル コードを実装します。

2.1 C#を使用してダイクストラ法(ダイクストラ法)のサンプルコードを実装する

2.2 PHPを使用してダイクストラ法(ダイクストラ法)のサンプルコードを実装する


1. ダイクストラアルゴリズムの概要

ダイクストラのアルゴリズムは、重み付き有向グラフにおける単一ソース最短経路問題を解くためのアルゴリズムです。ノードから開始して、そのノードから他のすべてのノードまでの最短パスを計算します。

ダイクストラのアルゴリズムの基本的な考え方は、開始点から開始し、新しいノードを徐々に拡張し、拡張されたノードからこれらのノードを介して開始点までの距離を更新しようとすることです。展開するたびに、現在展開の開始点に最も近い未展開のノードを選択し、そのノードから開始点までの距離を使用して、展開されたノードから開始点までの距離を更新します。このプロセスは、すべてのノードが展開されるまで繰り返されます。

このアルゴリズムを実装するには、各ノードから始点までの距離を記録する配列、各ノードが拡張されたかどうかを記録する配列、各エッジの重みを記録する 2 次元配列を使用する必要があります。グラフで。アルゴリズムの時間計算量は O(V^2) です。ここで、V はノードの数を表します。

ダイクストラのアルゴリズムは優先キューによって最適化でき、時間計算量を O(E log V) に削減できます (E はエッジの数を表します)。始点からの距離が最も小さいノードが優先キューに格納され、拡張のたびに優先キュー内の距離が最も小さいノードが選択されて拡張されます。このアルゴリズムは、優先キュー実装を備えたダイクストラのアルゴリズムとして知られています。

つまり、ダイクストラのアルゴリズムは、単一ソース最短経路問題を解決するために効率的で一般的に使用されるアルゴリズムであり、ネットワーク ルーティング、地図ナビゲーション、その他の分野で広く使用されています。

 2. 以下では、C# と PHP を使用してダイクストラのアルゴリズムのサンプル コードを実装します。

2.1 C#を使用してダイクストラ法(ダイクストラ法)のサンプルコードを実装する

以下は、C# を使用してダイクストラのアルゴリズムを実装するサンプル コードです。この例では、2 次元配列を使用してgraph有向重み付きグラフを表し、 はgraph[i][j]ノード i からノード j までのエッジの重みを表し、1 次元配列を使用してdist各ノードから開始ノードまでの最短パス長を記録します。 point; ブール配列を使用して、visited各ノードが訪問されたかどうかを記録します。

システムを使用する;

class DijkstraAlgorithmDemo
{     static void Main(string[] args)     {         int[][] グラフ = new int[][]         {             new int[] {0, 10, 3, int.MaxValue},             new int[] {int. MaxValue, 0, 1, 2},             new int[] {int.MaxValue, 4, 0, 8},             new int[] {int.MaxValue, int.MaxValue, int.MaxValue, 0}         };








        int startNode = 0;
        int[] dist = new int[graph.Length];
        bool[] 訪問 = new bool[graph.Length];

        for (int i = 0; i <graph.Length; i++)
        {             dist[i] = int.MaxValue;             訪問[i] = false;         }


        dist[開始ノード] = 0;

        for (int count = 0; count <graph.Length - 1; count++)
        {             int u = MinDistance(dist, Visited);

            訪問[u] = true;

            for (int v = 0; v <graph.Length; v++)
            {                 if (!visited[v] &&graph[u][v] != int.MaxValue && dist[u] != int.MaxValue && dist[u] ] + グラフ[u][v] < dist[v])                 {                     dist[v] = dist[u] + グラフ[u][v];                 }         }             }





        Console.WriteLine("ノードから開始点までの最短パス:");

        for (int i = 0; i <graph.Length; i++)
        {             if (dist[i] == int.MaxValue)             {                 Console.WriteLine($"{i} -> 起点:不可达");             }             else             {                 Console.WriteLine($"{i} -> 起点: {dist[i]}");             }     }         }









    static int MinDistance(int[] dist, bool[] 訪問)
    {         int minDist = int.MaxValue;         int minIndex = -1;

        for (int v = 0; v < dist.Length; v++)
        {             if (!visited[v] && dist[v] <= minDist)             {                 minDist = dist[v];                 minIndex = v;             }         }





        minIndex を返します。
    }
}
 

graphこのサンプル コードでは、まず有向重み付きグラフを表す2 次元配列を定義します。次に、各ノードから開始点までの最短経路の長さと、そのノードが訪問されたかどうかを記録するために、1次元配列distとブール配列が定義されます。visited次にdist配列とvisited配列を初期化し、始点からの距離を0に設定します。

次に、ループを使用して各ノードを順番に展開し、原点からの距離を更新します。展開のたびに、展開の開始点に現在最も近い未展開のノードを選択し、ノードから開始点までの距離を使用して、展開されたノードから開始点までの距離を更新します。すべてのノードが展開されると、dist各ノードから始点までの最短経路の長さが配列に記録されます。

最後に、各ノードから原点までの最短パス長をコンソールに出力します。

2.2 PHPを使用してダイクストラ法(ダイクストラ法)のサンプルコードを実装する

以下は、PHP を使用したダイクストラのアルゴリズムのサンプル コード実装です。この例では、2 次元配列を使用して$graph有向重み付きグラフを表し、 は$graph[$i][$j]ノード i からノード j までのエッジの重みを表し、1 次元配列を使用して$dist各ノードから開始ノードまでの最短パス長を記録します。 point; ブール配列を使用して、$visited各ノードが訪問されたかどうかを記録します。

<?php

$graph = array(
    配列(0, 10, 3, INF),
    配列(INF, 0, 1, 2),
    配列(INF, 4, 0, 8),
    配列(INF, INF, INF, 0)
);

$startNode = 0;
$dist = 配列();
$visited = array();

for ($i = 0; $i < count($graph); $i++) {     $dist[$i] = INF;     $visited[$i] = false; }


$dist[$startNode] = 0;

for ($count = 0; $count < count($graph) - 1; $count++) {     $u = minDistance($dist, $visited);

    $visited[$u] = true;

    for ($v = 0; $v < count($graph); $v++) {         if (!$visited[$v] && $graph[$u][$v] != INF && $dist[$u] != INF && $dist[$u] + $graph[$u][$v] < $dist[$v]) {             $dist[$v] = $dist[$u] + $graph[$u] [$v];         } }     }




echo "ノードから開始点までの最短パス:\n";

for ($i = 0; $i < count($graph); $i++) {     if ($dist[$i] == INF) {         echo "$i -> 起点: 不可达\n";     } else {         echo "$i -> 起点: {$dist[$i]}\n";     } }





function minDistance($dist, $visited) {     $minDist = INF;     $minIndex = -1;

    for ($v = 0; $v < count($dist); $v++) {         if (!$visited[$v] && $dist[$v] <= $minDist) {             $minDist = $dist[$v ];             $minIndex = $v;         }     }




    $minIndex を返します。
}

?>
 

$graphこのサンプル コードでは、まず有向重み付きグラフを表す2 次元配列を定義します。次に、各ノードから開始点までの最短経路の長さと、そのノードが訪問されたかどうかを記録するために、1次元配列$distとブール配列が定義されます。$visited次に$dist配列と$visited配列を初期化し、始点からの距離を0に設定します。

次に、ループを使用して各ノードを順番に展開し、原点からの距離を更新します。展開のたびに、展開の開始点に現在最も近い未展開のノードを選択し、ノードから開始点までの距離を使用して、展開されたノードから開始点までの距離を更新します。すべてのノードが展開されると、$dist各ノードから始点までの最短経路の長さが配列に記録されます。

最後に、各ノードから原点までの最短パス長をコンソールに出力します。

おすすめ

転載: blog.csdn.net/beenles/article/details/121487982
おすすめ