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

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

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暗号化標準を改訂する必要がある

ブログ    

推薦する

...

音声認識システムが裁判にかけられる

舒城県裁判所杭埠法廷は最近、建設工事契約紛争事件の審理に法廷音声認識システムを使用した。これは、杭埠...

ボストン・ダイナミクスの二足歩行ロボット「アトラス」が驚異的な体操ショーを披露、ネットユーザー「恐ろしい」

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

PyTorch を軽量化します。このディープラーニング フレームワークは価値があります。 GitHub 6.6k スター

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

...

...

GPT や Llama などの大規模モデルには「反転の呪い」があります。このバグを軽減するにはどうすればよいでしょうか?

中国人民大学の研究者らは、Llamaなどの因果言語モデルが遭遇する「反転の呪い」は、次のトークン予測...

...

IBM、GPUに匹敵する新しいニューラルネットワークチップを開発

本日 Nature 誌に掲載された論文で、IBM Research のポスドク研究員 Stefano...

...

人工知能、VR、音声検索、従来のマーケティングモデルを変える「三銃士」

人工知能と関連技術はマーケティングの未来を変えつつあり、仮想現実 (VR)、音声検索、人工知能はマー...

ロボットが2000万の仕事に取って代わる:最大の懸念は30代なのに何も知らないこと

[[269741]] 01 数日前、あるニュースが私の周りの多くの人々に反省と心配を抱かせました。 ...

ルカンのリーダーシップの下、自己監督に賭けるMeta AI

自己教師学習は本当に AGI への重要なステップなのでしょうか? Metaの主任AI科学者であるヤン...

人工知能の「最初の一滴」がエンタープライズIT自動化に属する理由

企業の情報技術の意思決定者として、上級管理職や部門長に AI のビジネス価値を示す必要がある場合、I...

LLaVA: GPT-4V(ision) のオープンソース代替品

LLaVA (Large Language and Vision Assistant) は、画像翻訳...