PHP アルゴリズム設計のアイデア: グラフの最短経路問題に対する効率的な解決策を達成するにはどうすればよいでしょうか?
実際の開発では、地図ナビゲーション、ネットワーク ルーティング、物流、流通などの分野で、最短経路の問題を解決する必要があることがよくあります。この種の問題を解決するには、グラフの最短パス アルゴリズムが鍵となります。
グラフは、一連の頂点と一連のエッジで構成されます。頂点はノードを表し、エッジはノード間の関係を表します。最短パスの問題は、2 つのノードを接続する最短パスを見つけることです。
PHP では、最短経路問題を解くためにさまざまなアルゴリズムを使用できます。その中で最も有名なものは、ダイクストラのアルゴリズムとベルマン・フォードのアルゴリズムです。以下に、これら 2 つのアルゴリズムの実装アイデアとサンプル コードをそれぞれ紹介します。
ダイクストラのアルゴリズムの手順は次のとおりです。
1) 開始ノードから他のノードまでの最短距離を表す配列 distances を定義します。初期値は無限大です。
2) ノードが訪問されたかどうかを示す、visited 配列を定義します。初期値は false です。
3) 開始ノードの最短距離を 0 に設定します。
4) すべてのノードを訪問するまで、次の手順を繰り返します。
a) 未訪問のノードから開始ノードに最も近いノードを選択します。
b) ノードを訪問済みとしてマークします。
c) 隣接ノードからノードまでの最短距離を更新し、更新された最短距離が以前の距離より小さい場合は、距離配列の値を更新します。
5) 最後に、 distances 配列を取得します。 ここで、 distances[i] は、開始ノードからノード i までの最短距離を表します。
以下は、PHP を使用してダイクストラのアルゴリズムを実装するコード例です:
function dijkstra($graph, $startNode) { $distances = array(); $visited = array(); foreach ($graph as $node => $value) { $distances[$node] = INF; // 初始距离设为无穷大 $visited[$node] = false; // 初始状态为未访问 } $distances[$startNode] = 0; // 起始节点的距离设为0 while (true) { $closestNode = null; foreach ($graph[$startNode] as $neighbor => $distance) { if (!$visited[$neighbor]) { if ($closestNode === null || $distances[$neighbor] < $distances[$closestNode]) { $closestNode = $neighbor; } } } if ($closestNode === null) { break; } $visited[$closestNode] = true; foreach ($graph[$closestNode] as $key => $value) { $distanceToNeighbor = $distances[$closestNode] + $value; if ($distanceToNeighbor < $distances[$key]) { $distances[$key] = $distanceToNeighbor; } } } return $distances; }
Bellman-Ford アルゴリズムの手順は次のとおりです。
1) 開始ノードから他のノードまでの最短距離を表す配列 distances を定義します。初期値は無限大です。
2) 開始ノードの最短距離を 0 に設定します。
3) すべてのエッジが緩和されるまで、次の手順を繰り返します。
a) すべてのエッジが緩和されます。つまり、次のエッジによって距離が短縮されます。
b) 距離配列を更新し、より短いパスが見つかった場合は、最短距離を更新します。
4) 最後に、負の重みループがあるかどうかを確認します。存在する場合は、グラフ内に無制限の負の重みパスがあることを意味します。
次は、PHP を使用して Bellman-Ford アルゴリズムを実装するコード例です:
function bellmanFord($graph, $startNode) { $numOfVertices = count($graph); $distances = array_fill(0, $numOfVertices, INF); $distances[$startNode] = 0; for ($i = 0; $i < $numOfVertices - 1; $i++) { for ($j = 0; $j < $numOfVertices; $j++) { for ($k = 0; $k < $numOfVertices; $k++) { if ($graph[$j][$k] != INF && $distances[$j] + $graph[$j][$k] < $distances[$k]) { $distances[$k] = $distances[$j] + $graph[$j][$k]; } } } } for ($j = 0; $j < $numOfVertices; $j++) { for ($k = 0; $k < $numOfVertices; $k++) { if ($graph[$j][$k] != INF && $distances[$j] + $graph[$j][$k] < $distances[$k]) { die("图中存在负权回路"); } } } return $distances; }
要約:
グラフの最短経路問題は、実際のアプリケーションでは非常に一般的です。と Bellman-Ford 2 つのアルゴリズムを使用すると、この種の問題を効率的に解決できます。グラフの特性や要件に応じて、適切なアルゴリズムを選択すると、計算効率が向上し、プログラムのパフォーマンスが向上します。この記事での紹介が皆様のお役に立てれば幸いです。
以上がPHP アルゴリズム設計のアイデア: グラフの最短経路問題に対する効率的な解決策を達成するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。