動的計画理論
モデルの3つの特徴
- 多段階の決定、最適なソリューション
- 最適なサブ構造
- 最適な基礎構造手段が最適な解決策は、問題の次善のソリューションが含まれていること。逆に言うが、我々は問題のサブ最適解は、最適なソリューションの問題が派生しているということです。
- 我々は最適な下部構造を取る場合のように、我々は先に定義された動的プログラミング・モデルの問題に対応するには、我々は理解することができるステージ後ろ状態が前段の状態によって誘導することができます。
- 後のない効果なし
- 影響なしの後、二つの意味、意味の第一層、状態は後の段階に導出されたとき、我々は唯一の前段の値の状態を気にしている、この状態がステップによって推定されるステップであるかを気にしないでください。
- 第2の意味は、状態が確立されているいくつかの段階で、それは舞台後の影響の意思決定の対象ではないということです。ノー後、効果は非常に「緩い」要件です。動的なプログラミングモデルの問題は、前述の長いほど、実際には、それは基本的には後の効果を満たしていません。
- 繰り返しサブ問題
- この概念をよりよく理解されています。以前のものは、私は繰り返し述べてきました。集計した場合、それは、意思決定の異なる配列である、一文で同じ特定の段階に達すると、重複状態をもたらすことができます。
例と理論を理解します
- 我々は、行列Wは、N [N] [N]のn倍されているとします。これは、正の整数行列記憶あります。右下隅の左上端位置にあるポーン開始位置。私たちは、右下に左上からつなぎます。あなただけの右または下に1を移動することができます。左上から右下に、あなたが取ることができる多くの異なるパスがあります。数字を通して、私たちそれぞれのパスは、パスの長さと見なさ追加します。こと右下に左上からの最短経路の長さはどのくらいですか?
- モデル:
- (0、0)から(N-1〜N-1)に移動し、2 *(N-1)工程の合計を残し、2 *(N-1)番目のステージに対応します。
- 各ステージには、右に行くか、意思決定の2種類を下に行くことがあり、各ステージは、状態の集合に対応します。
- 我々は、jは列を表し、iは、行を表すmin_distの状態(i、j)を定義します。Min_dist発現は最短経路長の(i、j)が(0、0)の値を表します。したがって、この問題は、動的プログラミングのモデルに沿って、多段決定最適解です。
- 三つの特徴:
- それは、対応するノードの位置を示すために、左上から重複ノードを見つける塗装再帰的ツリーは、種々の経路は、この問題の存在を示す、存在する反復の問題を。
- 計算(i、j)の状態の位置に対応するだけの決定を心配する(I-1、j)は、 (iが、J-1) の状態は、前のステージの決定された後、状態の二つの位置に対応し、後の段階ではできません「に沿って変化する、無後の効果」。
- 開始する位置(0、0)(i、j)は、表記min_dist(i、j)は、min_distから最小経路 (i、j)はmin_distにより(I、J-1)とmin_dist(I- 1、j)は、に沿って、二つの状態を導出「に最適なサブ構造。」
2つの動的プログラミング問題解決のアイデアの概要
- 状態遷移表の方法は大別して、問題解決のアイデアのように要約することができ、重複する部分問題を見つける- -状態の定義- -絵画再帰ツリーアルゴリズムをバックトラック状態遷移表を描く-再帰的な関係に基づいて、フォームに記入-充填プロセスがコードに変換します。
- 状態遷移方程式法の一般的なアイデアは、のように要約することができ、最適なサブ構造を見つけるために-状態遷移方程式を書く-コードは、状態遷移方程式に変換されます。
- 状態遷移表方法
- 解決するにはまずバックトラッキングアルゴリズム検索暴力、利用可能なダイナミックでソリューションを計画するかどうかを確認するために法律を見つける、重複したサブ問題があるかどうかを判断するために再帰ツリーを描きます。
- 2つの解決策がある場合:
- 使用後戻り+メモ決意複製ノード
- 状態遷移表法:
- 状態テーブルを描画するには。状態テーブルは、一般的に2次元であるので、あなたは、2次元配列としてそれを想像することができます。
- ここで、それぞれ含む三個の状態変数、行、列、アレイ値。フロントからバックへの私たちが持って意思決定プロセスによると、漸化式によると、段階的に各状態は、状態テーブルを満たしました。最後に、我々は、動的なプログラミングコードであるコードに変換この再帰的プロセスでいっぱいになります。
- 用途:上記の最短経路問題を解きます
- まず徹底的なバックトラッキングアルゴリズム
-
プライベート int型 minDist = Integer.MAX_VALUEの; // グローバル変数やフィールド // 呼び出さ:minDistBacktracing(0、0、0、W、N-); 公共の 無効 minDistBT(int型 I、int型 J、int型 DIST、INT [] [ ] W、int型のn){ // 達するN-1、N-1この位置では、ここで奇妙なハを見て、あなたは例を見て IF(J == I == && N- N-){ IF(DIST <minDist)minDist = DIST; リターン; } IF(I <N - ){ // ダウン,. 1 + I =更新I、J = J minDistBT(1 + I、J、DIST +。W [I] [J ]、W、N-); } IF(J <N-){ // 、右に行くIがI、J + = J. 1 =更新 minDistBT(I、J + 1、DIST + ; W [I]、[J]、W、N-)を } }
- 、(私は、j)のノードを繰り返し、我々は唯一の再帰的な解決策を継続し、最小のノードDISTを選択する必要があり、重複する部分問題を発見する方法として、再帰的なツリーを描画し、他のノードを破棄することができます
-
2次元の状態テーブルを描きます
-
public int minDistDP(int[][] matrix, int n) { int[][] states = new int[n][n]; int sum = 0; for (int j = 0; j < n; ++j) { // 初始化states的第一行数据 sum += matrix[0][j]; states[0][j] = sum; } sum = 0; for (int i = 0; i < n; ++i) { // 初始化states的第一列数据 sum += matrix[i][0]; states[i][0] = sum; } for (int i = 1; i < n; ++i) { for (int j = 1; j < n; ++j) { states[i][j] = matrix[i][j] + Math.min(states[i][j-1], states[i-1][j]); } } return states[n-1][n-1]; }
-
状态转移方程法
-
类似递归的解题思路。我们需要分析,某个问题如何通过子问题来递归求解,也就是所谓的最优子结构。
-
根据最优子结构,写出递归公式,也就是所谓的状态转移方程。有了状态转移方程,代码实现就非常简单了。
-
一般情况下,我们有两种代码实现方法,一种是递归加“备忘录”,另一种是迭代递推。
-
强调:状态转移方程是解决动态规划的关键,写出状态转移方程,问题就解决了一半!!
-
应用:解决上面的最短路径问题
-
状态转移方程:
min_dist(i, j) = w[i][j] + min(min_dist(i, j-1), min_dist(i-1, j))
-
实现代码
-
private int[][] matrix = {{1,3,5,9}, {2,1,3,4},{5,2,6,7},{6,8,4,3}}; private int n = 4; private int[][] mem = new int[4][4]; public int minDist(int i, int j) { // 调用minDist(n-1, n-1); if (i == 0 && j == 0) return matrix[0][0]; if (mem[i][j] > 0) return mem[i][j]; int minLeft = Integer.MAX_VALUE; if (j-1 >= 0) { minLeft = minDist(i, j-1); } int minUp = Integer.MAX_VALUE; if (i-1 >= 0) { minUp = minDist(i-1, j); } int currMinDist = matrix[i][j] + Math.min(minLeft, minUp); mem[i][j] = currMinDist; return currMinDist; }
-
-
四种算法思想比较分析
- 分类
- 贪心、回溯、动态规划:解决多阶段决策最优解模型。
- 分治:解决的问题尽管大部分也是最优解问题,但是,大部分都不能抽象成多阶段决策模型
- 回溯算法:
- 相当于穷举搜索,“万金油”,基本上能用的动态规划、贪心解决的问题,我们都可以用回溯算法解决。
- 时间复杂度高:指数级
- 动态规划:
- 动态规划比回溯算法高效。
- 需要满足一个模型三个特征。
- 动态规划和分治算法在重复子问题上区分非常明显。分治算法要求分割成的子问题,不能有重复子问题,而动态规划正好相反,动态规划之所以高效,就是因为回溯算法实现中存在大量的重复子问题。
- 贪心算法
- 动态规划算法的一种特殊情况。
- 更加高效,代码实现也更加简洁。
- 可以解决的问题也更加有限。它能解决的问题需要满足三个条件,最优子结构、无后效性和贪心选择性(这里我们不怎么强调重复子问题)。
- 贪心选择性”的意思是,通过局部最优的选择,能产生全局的最优选择。