Java プログラミング スキル - データ構造とアルゴリズム「動的プログラミング アルゴリズム」

Java プログラミング スキル - データ構造とアルゴリズム「動的プログラミング アルゴリズム」

[[399211]]

応用シナリオ - ナップサック問題

バックパックの問題: 容量 4 ポンドのバックパックがあり、次のアイテムが利用可能です。

  1. 目標は、バックパックの合計価値を最大化し、重量を超えないようにすることです。
  2. ロードする必要があるアイテムは重複できません

動的プログラミングアルゴリズム入門

  1. 動的計画法アルゴリズムの中心的な考え方は、大きな問題を小さな問題に分割して解決し、段階的に最適な解決策を得ることです。
  2. 動的プログラミング アルゴリズムは、分割統治アルゴリズムに似ています。その基本的な考え方は、解決する問題をいくつかのサブ問題に分解し、最初にサブ問題を解決し、次にこれらのサブ問題の解決策から元の問題の解決策を取得することです。
  3. 分割統治アルゴリズムとは異なり、動的計画法に適用可能な問題を分解することによって得られるサブ問題は、互いに独立していないことがよくあります。 (つまり、次のサブステージの解決は、前のサブステージの解決に基づいてさらに解決されます)。
  4. 動的プログラミングは、最適な解を得るために表に記入することで徐々に進めることができます。

ナップザック問題分析

ナップザック問題とは、主に、指定された容量のナップザックと、特定の価値と重量を持ついくつかのアイテムを指します。アイテムの価値が最大になるように、ナップザックに入れるアイテムを選択する方法。 01バックパックとコンプリートバックパック(コンプリートバックパックとは、各アイテムが無制限に利用できることを意味します)に分かれています。

ここでの問題は、01 バックパックに関するものです。つまり、バックパックに入れることができるのは各アイテムを最大で 1 つだけであり、無限バックパックは 01 バックパックに変換できます。

思考分析

アルゴリズムの主なアイデアは、動的プログラミングを使用して解決することです。 i番目のアイテムが走査されるたびに、w[i]とv[i]に基づいてアイテムをバックパックに入れる必要があるかどうかが決定されます。つまり、n個のアイテムが与えられた場合、v[i]とw[i]をそれぞれi番目のアイテムの価値と重量とし、Cをバックパックの容量とします。 v[i][j]は容量jのバックパックに詰め込める最初のi個のアイテムの最大値を表すものとします。以下の結果が得られます。

  1. v[i][0] = v[0][j] = 0; // テーブルの最初の行と最初の列が 0 で埋められることを意味します
  2. w[i]>jの場合: v[i][j]=v[i-1][j]; //追加する新しい商品の容量が現在のバックパックの容量より大きい場合、前のセルの積載戦略が直接使用されます。
  3. j>=w[i] の場合: v[i][j]=max{v[i-1][j],v[i]+v[i-1][jw[i]]}; //追加する新しい商品の容量がバックパックの現在の容量以下の場合、ロード方法は次のとおりです: v[i-1][j]: 前のセルの最大値 v[i]: 現在の商品の値 v[i-1][jw[i]]: i-1 個の商品を残りのスペース [jw[i] の最大値までロードします

フォーム入力プロセス

コード例

  1. パッケージ com.xie.algorithm;
  2.  
  3. java.util.Arrays をインポートします。
  4.  
  5. パブリッククラスKnapsackProblem {
  6. 公共 静的void main(String[] args) {
  7. //アイテムの重量
  8. 整数[] w = {1, 4, 3};
  9. //アイテムの値
  10. int [] 値 = {1500, 3000, 2000};
  11. //バックパックの容量
  12. 整数m = 4;
  13. //アイテム数
  14. int n = val.length;
  15.  
  16. //商品投入状況を記録するため、2次元配列を定義する
  17. int [][] パス = 新しいint [n + 1][m + 1];
  18.  
  19. //2次元配列を作成する
  20. //v[i][j]は、容量jのバックパックに積載できる最初のi個のアイテムの最大値を表します。
  21. int [][] v = 新しいint [n + 1][m + 1];
  22.  
  23. // 最初の行と列を初期化する
  24. // 最初の列を 0 に設定する
  25. ( int i = 0; i < v.length; i++) {
  26. 0 = 0;
  27. }
  28. // 最初の行を 0 に設定する
  29. ( int i = 0; i < v[0].length; i++) {
  30. 0 から 0 までの値をとる。
  31. }
  32.  
  33. //前の式に従った動的計画処理
  34. //最初の行は処理しない
  35. ( int i = 1; i < v.length; i++) {
  36. //最初の列は処理しない
  37. ( int j = 1; j < v[0].length; j++) {
  38. //式
  39. //プログラムiは1から始まるため、元の式のw[i]はw[i-1]に変更されます。
  40. (w[i - 1] > j) の場合 {
  41. v[i][j] = v[i - 1][j];
  42. }それ以外{
  43. //プログラムは1から始まるので
  44. //v[i][j] = Math.max (v[i - 1][j], val[i - 1] + v[i - 1][j - w[i - 1]]);
  45. (v[i - 1][j] > val[i - 1] + v[i - 1][j - w[i - 1]]) の場合 {
  46. v[i][j] = v[i - 1][j];
  47. }それ以外{
  48. v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
  49. //現在の状況をパスに記録する
  50. パス[i][j] = 1;
  51. }
  52. }
  53. }
  54. }
  55.  
  56. ( int i = 0; i < v.length; i++) {
  57. システム.out.println (Arrays.toString(v[i]));
  58. }
  59.  
  60. int i = パスの長さ - 1;
  61. int j = パス[0].長さ - 1;
  62. i > 0 && j > 0 の場合
  63. パス[i][j] == 1の場合{
  64. System.out.printf ( "%d番目のアイテムがバックパックに入れられました\n" 、i);
  65. j = w[i - 1];
  66. }
  67. 私 - ;  
  68. }
  69. }
  70.  
  71. /**
  72. * [0, 0, 0, 0, 0, 0]
  73. * [0, 1500, 1500, 1500, 1500]
  74. * [0, 1500, 1500, 1500, 3000]
  75. * [0, 1500, 1500, 2000, 3500]
  76. * 3番目のアイテムはバックパックに入れられます
  77. * 最初のアイテムはバックパックに入れられます
  78. */
  79. }

【編集者のおすすめ】

  1. 仮想サーバー管理の6つのベストプラクティス
  2. 2021 年にソフトウェア開発業界を支配する 15 のテクノロジー トレンド
  3. コンピュータのインストールに必須のソフトウェア 5 つ。それぞれが他のものよりも強力で、一度使用するとそれなしでは生きていけなくなります。
  4. これは素晴らしい。これは私が今まで見たSpringCloudマイクロサービスアーキテクチャの最も詳細な説明です | 添付の面接の質問
  5. 中国の3大通信事業者はニューヨーク証券取引所から上場廃止されたことで損失を被ったのか?

<<:  13 のインテリジェントなインタラクティブ AI チャットボット プラットフォーム

>>:  自然言語処理ライブラリ - Snownlp

ブログ    
ブログ    

推薦する

DIFFアルゴリズムがわからない場合は、私に連絡してください(画像付き)

序文インタビュアー: 「仮想 DOM と Diff アルゴリズムをご存知ですか? 説明してください。...

GPT-4 の補完精度はわずか 6% です。北京大学などが、初の「マルチラウンド、マルチモーダル」PPTタスク完了ベンチマークPPTCを提案

大規模言語モデル(ChatGPT や GPT-4 など)に関する最近の評価作業は、主に基本的な自然言...

量子コンピュータ、数学オリンピックのための AI... これらは 2020 年のコンピュータと数学における大きな進歩です

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

AIがデータセンターの設計をどう変えるか

AI システムへの世界的な支出は 2023 年から 2026 年の間に 2 倍になると予想されており...

2021年の中国AI音声認識産業の市場現状と発展見通しの分析

2020年、中国のスマート音声市場規模は113.96億元に達し、前年比19.2%増加した。中国のスマ...

人工知能の時代において、Web フロントエンドは何ができるのでしょうか?

私は最近、クローラーを使用してページのスナップショットを取得し、ページの互換性の包括的なテストを実施...

AF2を超える? Iambic、NVIDIA、Caltech が、状態固有のタンパク質-リガンド複合体の構造予測のためのマルチスケール深層生成モデルを開発

タンパク質と小分子リガンドによって形成される結合複合体は、生命にとって遍在し、不可欠です。科学者は最...

米国の改正規則:自動運転車は人間の制御を必要としない

米道路交通安全局(NHTSA)は木曜日、自動運転車メーカーに対し、衝突基準を満たすために完全自動運転...

IBM、海洋ゴミに関する質問に答えるAIアバターを開発

海洋ゴミは世界的な問題となっている。たとえすべてのデータを収集できたとしても、海洋問題の専門家である...

マイクロソフトCEOナデラ氏:世界は人工知能に関して幅広い合意を形成しつつある

マイクロソフトのCEOサティア・ナデラ氏は1月17日(現地時間)の火曜日、人工知能に関して世界中でコ...

Google Bard「叙事詩」アップデート:カスタマイズされた中国語サービス、画像分析機能を公開

今年3月、Googleは生成AI「Bard」のベータ版のリリースを発表しました。当時、このバージョン...

...

...

GenAIは主流になるが、CIOの行動は遅い

過去2週間、OpenAIの創設者サム・アルトマン氏は取締役会により解雇され、関連メンバーはマイクロソ...