JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで実装する最短経路アルゴリズム ― 重み付きエッジの追加方法

グラフ理論における最短経路問題とは、グラフ上の2つの頂点(ノード)をつなぐ経路の中から、構成するエッジ(辺)の重みの合計が最小となるものを見つける問題です。このアルゴリズムを実装するためには、既存のaddEdgeメソッドとaddDirectedEdgeメソッドを修正し、エッジに重みを設定できるように拡張する必要があります。

重み付きエッジを追加する実装例

それでは、実際にどのように重みを扱えるようにするのか、コードを見ていきましょう。

/**
 * 同じ重みを持つ双方向のエッジを追加します
 *
 *            weight
 * node1 <================> node2
 *            weight
 *
 */
addEdge(node1, node2, weight = 1) {
    this.edges[node1].push({ node: node2, weight: weight });
    this.edges[node2].push({ node: node1, weight: weight });
}

/**
 * 次のような一方向のエッジを追加します
 *
 *            weight
 * node1 ----------------> node2
 *
 */
addDirectedEdge(node1, node2, weight = 1) {
    this.edges[node1].push({ node: node2, weight: weight });
}

/**
 * グラフの内容を表示します
 */
display() {
    let graph = "";
    this.nodes.forEach(node => {
        graph += node + "->" + this.edges[node].map(n => n.node).join(", ") + "\n";
    });
    console.log(graph);
}

デフォルト重みのポイント

この実装のポイントは、第3引数のweightにデフォルト値として「1」を設定している点です。これにより、グラフにエッジを追加する際に重みを明示的に指定しなくても、自動的に重み「1」が割り当てられるため、従来の無重みグラフとしてもそのまま利用できます。

つまり、このひとつのデータ構造で無重みグラフと重み付きグラフの両方に対応できる柔軟な設計になっています。これで準備は完了です。次のステップでは、この重み付きグラフを活用して、ダイクストラ法やベルマン・フォード法といった代表的な最短経路アルゴリズムを実装していきます。

  1. 0-1 BFSとは?C++で学ぶ重み0/1グラフの最短経路探索アルゴリズム

    0-1 BFS(二値重みグラフの最短経路問題)とはいくつかの頂点と辺から構成されるグラフを考えます。このグラフの各辺には0または1の二値のみの重みが割り当てられています。始点となる頂点が与えられたとき、始点から他のすべての頂点への最短距離を求めるのが本記事の目的です。通常の幅優先探索(BFS)は、すべての辺の重みが同一である場合に有効な手法です。しかし、重みが0と1で混在している場合、単純なBFSでは正しい最短経路を求めることができません。そこで登場するのが0-1 BFSです。このアルゴリズムでは、両端キュー(deque)を使用して頂点を管理します。各ステップで最適な距離条件をチェックしながら

  2. フラッディングと固定ルーティングアルゴリズムの違いを徹底解説

    フラッディング(Flooding)と固定ルーティング(Fixed Routing)は、伝送回線で接続された複数の中間ルータを経由して、送信元から宛先へデータパケットを伝送するための手法です。フラッディングは、非適応型(Non-adaptive)ルーティング技術の一つで、非常にシンプルな方式に基づいています。データパケットがルータに到着すると、そのパケットが到着した回線を除くすべての出力回線へパケットを送信します。固定ルーティングアルゴリズムは、送信元から宛先へデータパケットを転送するための固定経路をあらかじめ決定しておく方式です。この経路は数学的に計算された最適経路、すなわち「最小コスト経路(