web-dev-qa-db-ja.com

ダイクストラのアルゴリズム、動的計画法です

私が見たダイクストラのアルゴリズムのすべての実装には再帰関数がありませんが、定義上、動的計画法は再帰関数とすでに計算されたものの「メモリ」を備えたアルゴリズムであることも読みました。

では、ループを使用したダイクストラのアルゴリズムは動的計画法として認定されていますか?
または、動的アルゴリズムとしての資格を得るには、ループを再帰関数に変更する必要があります。

13
user3725938

あなたは2つの質問に答えます:

動的アルゴリズムとは、手順をより単純なタスクに分割することを意味します。いくつかの動的アルゴリズムには再帰の概念が含まれていますが、これも制限されていません。

ダイクストラのアルゴリズムを考慮すると、古典的な解はforループによって与えられ、動的なアルゴリズムの解ではありません。

ただし、動的計画法の観点からは、ダイクストラのアルゴリズムは、リーチング法によって最短経路問題の動的計画法の関数方程式を解く逐次近似スキームです。

実際、アルゴリズムの背後にあるロジックのダイクストラの説明、すなわち:

Problem 2. Find the path of minimum total length between two given nodes P and Q.

注: ウィキペディア から取得

0
apomene

私が見たダイクストラのアルゴリズムのすべての実装には、再帰関数がありません

再帰は私たちにスタックを与えます。ただし、ここではスタックは必要ありません。優先キューが必要です。ダイクストラのアルゴリズムを実装する効率的な方法は、 ヒープ (c ++のstlpriority_queue)を使用します。

しかし、定義上、動的計画法は再帰関数とすでに計算されたものの「メモリ」を備えたアルゴリズムであることも読みました。

動的計画法は再帰的に書く必要はありませんが、ほとんどの人は再帰的に書くことを好みます。

例えば:

int dp[MAX]={-1,-1,...};
find fibonacci(int nthTerm){
   if(n <= 1) return n;
   if(dp[n]!=-1) return dp[n];
   return dp[n]=fibonacci(n-1)+fibonacci(n-2);
}

dPの再帰的実装です

そして

int dp[MAX]={0,1,-1,-1,-1,..};
int lastFound = 1;
int fibonacci(int nthTerm){
    for(int i=lastFound+1;i<=n;i++){
       dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[n];
}

スタックメモリを節約するためにそれを書き込む反復的な方法です。

すべてのアルゴリズムを覚えておいてください

1)すでに見つかった結果を再計算せず、

2)既存の結果を使用して必要な結果を見つける

dPと呼ぶことができます。

では、ループを使用したダイクストラのアルゴリズムは動的計画法として認定されていますか?

ダイクストラはDPです!

または、動的アルゴリズムとしての資格を得るには、ループを再帰関数に変更する必要があります。

番号

21
cegprakash

ダイクストラのアルゴリズムは、水を充填するアルゴリズムのようなものです。各ステップで極小値を選択するため、多くの人がそれを欲張りアルゴリズムと見なします。極小値ではなく任意のパスを選択してこの同じアルゴリズムを試してみると、それがまだ機能していることがわかります。極小値を選択するのは、前述したように、水を最適に充填するためです。これは、水充填アルゴリズムのようなものです。したがって、ダイクストラのアルゴリズムの背後にある主な概念は、前の結果を保存して次の結果を予測することであり、それが動的アプローチです。

詳細については、以下のリンクを参照してください

ダイクストラのアルゴリズムが機能するのはなぜですか?

2
arcticOak2

Moshe Sniedovichによる「ダイクストラのアルゴリズムの再検討:動的計画法の接続」というタイトルの論文があります。 http://matwbn.icm.edu.pl/ksiazki/cc/cc35/cc3536.pdf

この論文は、ダイクストラのアルゴリズムはベルマンの最適性の原理に強く影響を受けており、概念的にも技術的にも、卓越した動的計画法の逐次近似手順を構成していると主張しています。

2
Payam Ahmadvand

最初の投稿...

ダイクストラの方法と古典的な動的計画法を使用して最短経路を見つけるプロセスを見てみましょう。両方のアルゴリズム(つまり、フォワードDP)のソースノードから始めます。次のステップは両方のアルゴリズムで同じです。すべての子ノードを調べて、それらに到達するためのコストを評価します(これは、ソースノードからその子までの弧の長さの値です)。次に、アルゴリズムが分岐します。DPでは、グラフ内の残りのすべてのノードを調べて、指定された他のノードに到達するための最良の「ポリシー」を計算します(「現在の状態」に基づいて「ポリシー」を作成します)。疎に接続されたグラフでは、もちろん、ソースの子の子であるノードを調べるだけで済みますが、ダイクストラの場合よりも多くのノードを通過しています...

ダイクストラの場合、2番目以降のステップでは、「残りの」接続されたノードのすべてを調べるわけではありません。ソースまでの距離が最も短いノードの子に到達するためのコストを調べます。つまり、DPは、ほとんどの決定論的最短経路問題に対して、ダイクストラ法よりも実行時間が長くなります。

ダイクストラでは、送信元から宛先へのパスが見つかると、アルゴリズムが終了します。ただし、DPでは、アルゴリズムは正確に[〜#〜] n [〜#〜]ステップで実行されます。ここで、[〜#〜] n [〜#〜]は、グラフ内のノードの数です。特定の問題では、ダイクストラ法は[〜#〜] n [〜#〜]の二乗のオーダーで実行できますが、スパース接続に関するほとんどの実際的な問題では、通常は[〜#〜] n [〜#〜]ステップ未満で実行されます。

BertsekasのDynamicProgramming and Optimal Controlの本から基本を学びました http://www.athenasc.com/dpbook.html

0
Radu S. Visina