アルゴリズム学習のための動的プログラミング戦略の紹介

アルゴリズム学習のための動的プログラミング戦略の紹介

1. コンセプト

動的プログラミング戦略、分割統治戦略。貪欲戦略と同様に、通常は最適解問題を解決するために使用されます。分割統治とは、問題をいくつかのサブ問題に分解して解決することです。動的計画法の特徴は、分解されたサブ問題の中から毎回最適な解決策を選択することです(サブ問題はサブ問題に分解できます)。

動的プログラミングの主な特徴は、決定を下す前にすべてのサブ問題の情報を知っていることです。

動的プログラミングの 2 つの重要な要素は次のとおりです。1) ***サブ構造。 2) 重複するサブ問題。

1) ***サブ構造。これは、動的プログラミング戦略を使用して***問題を解決した後に実行される最初のステップです。いわゆる最適なサブ構造とは、問題に対する最適な解決策にサブ問題に対する最適な解決策が含まれている場合、その問題には最適なサブ構造があることを意味します。これは、動的計画法を採用するための十分な条件です(もちろん、この条件は貪欲戦略も満たします)。この条件が発生した場合、動的計画法を検討できます。

通常考慮される要素は次のとおりです。

1.1) ソリューションではいくつのサブ問題を解決する必要がありますか?

1.2) どのサブ問題を使用するかを決定するには、どの程度の選択が必要ですか?

2) 重複するサブ問題とは、再帰的なソリューションにおいて、多数の同一のサブ問題が生成される場合、同じサブ問題が何度も繰り返し計算され、アルゴリズムの効率が大幅に低下することを意味します。この要素は動的プログラミングの利点です。動的プログラミングはこのような問題を解決するために生まれたと言えます(実際、メモリを備えた再帰アルゴリズムでも同様のアルゴリズムの改善を実現できます)。

2. 問題解決戦略

問題を解決するための一般的な考え方は次のとおりです。

1) 問題の解決には、1つ以上のサブ問題を残す選択が必要であることを証明する

2) サブ問題の再帰的記述を設計する(一般的には、問題とアルゴリズムを解決するための鍵となる、転送方程式とも呼ばれる再帰式があります)

3) 元の問題に対する最善の解決策には、すべての部分問題に対する最善の解決策が含まれていることを証明する

4) サブ問題間に重複があることを証明する

1、3、4 は、サブ問題の構築を動的計画法戦略に準拠させることが目的であることがわかります。それらの目的は、合理的で適切なサブ問題を構築できるようにすることです。ただし、異なる問題に対してサブ問題を構築するという考え方は同じではありません。 1.1 と 1.2 の問題を考慮することに加えて、通常は、このサブ問題をできるだけ単純にし、必要に応じて拡張するという、より効果的な方法があります。

3. 例

より古典的な最長共通部分列問題 (LCS) を使用します。

問題は次のように定義されます: 2 つの部分列 S1[1..m] と S2[1..n] について、それらの最長共通部分列を見つける必要があります (部分列は必ずしも連続している必要はありません)。

解決策1: ブルートフォース法

アイデア:

1) S1[1..m]内のすべてのサブシーケンスをチェックします。

2)それがS2[1..n]内の部分列でもあるかどうかを確認します。

3) 各ステップで、サブシーケンス内で見つかった最長のサブシーケンスを記録します。

明らかに、これは非常に非効率的です。各サブシーケンスは O(n) 時間でチェックする必要があり、チェックするサブシーケンスは 2^m 個あるため、時間の計算量は O(n*2^m) になります。

では、どのように改善すればよいのでしょうか? LCS には *** サブ構造があるため、つまり、必要な最長共通サブシーケンスには最長共通サブシーケンスが含まれているため、動的プログラミングを使用して問題を解決できます。

解決策2: 動的プログラミング

問題解決戦略によれば、まず適切なサブ問題を構築する必要があります。2 番目のポイントに従って、できるだけ単純なサブ問題を構築し、それを拡張します。LCS では、次のようになります。

1) まず、最長共通部分列の長さを求めます。

2) 長さを見つけるアルゴリズムを拡張して、最長共通部分列を取得します。

上記から、再帰式を得ることができます。

(c[i,j]は長さiのS1と長さjのS2の最長共通部分列を表す。xiは文字列Sのi番目の文字を表す。)

上記の再帰的演繹は、図を描くことで簡単に得ることができます。

コード:

  1. charb[50][50]; //LCS出力を容易にするためにパス図を記録する 
  2. intc[50][50]; //c[i][j]は長さiのx文字列と長さjのy文字列のLCSの長さを格納します 
  3. charx[50], y[50]; //x,yは比較する2つの文字列を格納する 
  4. voidLCS()
  5. {
  6. intm = strlen(x+1);
  7. intn = strlen(y+1);
  8.   //初期化 
  9.   (int i = 1; i <= m; ++i)の場合
  10. c[i][0] = 0;
  11.   (intj=1;j<=n;++j)の場合
  12. c[0][j] = 0;
  13.   (int i = 1; i <= m; ++i)の場合
  14.   (intj=1;j<=n;++j)の場合
  15. {
  16.   (x[i] == y[j])の場合
  17. {
  18. c[i][j] = c[i-1][j-1] + 1;
  19. b[i][j] = '\' ;
  20. }
  21. そうでない場合(c[i-1][j] >= c[i][j-1])
  22. {
  23. c[i][j] = c[i-1][j];
  24. b[i][j] = '|' ;
  25. }
  26.   それ以外 
  27. {
  28. c[i][j] = c[i][j-1];
  29. b[i][j] = '-' ;
  30. }
  31. }
  32. }
  33.   // 出力LCS  
  34. void printLCS(inti, intj)
  35. {
  36.   (i == 0|| j == 0)の場合
  37.   戻る;
  38.   b[i][j] == '\'場合
  39. {
  40. printLCS(i-1, j-1);
  41. x[i] + ""を印刷します
  42. }
  43. そうでない場合は(b[i][j] == '|' )
  44. printLCS(i-1, j);
  45.   それ以外 
  46. printLCS(i, j-1);
  47. }

IV. 要約

LCS には、最長増加/減少サブシーケンス、編集距離など、さまざまなバリエーションがあります。

動的プログラミングの鍵となるのは、上で述べた 2 つの重要な要素、すなわち *** サブ構造と繰り返されるサブ問題です。*** 問題に関連情報がある場合、またはそのような問題に変換できる場合は、動的プログラミングを使用してみることができます。ただし、サブ問題の構築には、再帰方程式の構築という、ある程度の思考が必要です。

ただし、動的プログラミングは最も「賢明な」決定を下すことができますが、それを行う前にすべてを知る必要があり、明らかに「保守的」であるため、すべての問題に適用できるわけではありません。現時点では、他の最適化アルゴリズムを検討することができます。

オリジナルリンク: http://www.cnblogs.com/Quains/archive/2011/11/09/2241879.html

【編集者のおすすめ】

  1. PHP+MySQL アプリケーションで XOR 暗号化アルゴリズムを使用する
  2. これまで見たことのないアルゴリズムのダンス(ビデオ)
  3. PHP 5 におけるガベージコレクションアルゴリズムの進化についての簡単な説明
  4. JavaScript におけるいくつかの一般的なソートアルゴリズムの共有
  5. プログラマーが知っておくべき 20 世紀の 10 大アルゴリズム

<<:  百度、検索エンジンアルゴリズムを調整して微博コンテンツのインデックスを強化

>>:  XML暗号化アルゴリズムが破られ、W3CはXML暗号化標準を改訂する必要がある

ブログ    
ブログ    

推薦する

DNAを使って画像を直接保存する「生きた細胞カメラ」は96ピクセルの解像度を持つ

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

AIエンジニアリングは組織がAIを最大限に活用するのに役立ちます

「人工知能」という言葉は、最近はどこにでも見られるようになり、産業界におけるその応用に混乱が生じてお...

サポートベクターマシンを使用して非線形データセットを学習する方法

サポートベクターマシン (SVM) [[326874]]サポート ベクター マシンとは何ですか? サ...

最も孤独なニューラル ネットワーク: たった 1 つのニューロンですが、「クローンをシャドウ」することができます

世界で最も先進的なニューラルネットワークモデルは何ですか?それは人間の脳に違いない。人間の脳には86...

20B大型モデルの性能はLlama2-70Bに匹敵します!完全にオープンソースで、ベースからツールまですべてが明確に整理されています

たった今、国産オープンソースモデルのパラメータ数の記録がまた更新されました! 9月20日、上海人工知...

...

ドラッグアンドドロップ機械学習の愛と憎しみ

ドラッグアンドドロップ機械学習は、私が長い間考えてきたものです。 1. 過去世と現在世ドラッグ アン...

...

Truffleを使用してスマートコントラクトをデプロイする方法

[[397532]]この記事はWeChatの公開アカウント「ブロックチェーン研究室」から転載したもの...

一言で女の子がN着の服を着替えてくれた。Googleが動画生成を新たな高みへ。ネットユーザー「競争が激化」

Google はたった 1 つの動きで、AI ビデオ生成を新たなレベルに引き上げました。文章からビ...

...

顔認識は「スマート交通」に役立ち、3つの側面でその価値を実証する

近年、都市化の急速な発展と都市人口の継続的な増加により、都市交通の重要性がますます高まっています。わ...

前例のない変化:パンデミックはテクノロジーと未来を急速に形作っている

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

インテリジェントな人間とコンピュータの相互作用とは何ですか?

これは非常に興味深い質問であり、知性と人間とコンピューターの相互作用の両方が関係しており、さらに重要...

C# でのジョセフ リング アルゴリズムの簡単な分析

C# アルゴリズムを勉強しているときに、C# ジョセフ リング アルゴリズムに出会いました。ジョセフ...