ナップサック問題(0/1)ビジュアライザー
0/1ナップサック問題を動的計画法(dynamic programming)でアニメーション表示 — DPテーブルを1マスずつ埋めながら、依存関係にあるセルをハイライトし、ステップ実行にも対応。ブラウザ上でそのまま動作します。
疑似コード
Press Run to animate the algorithm.
Time · Space
使い方
- 1 Runを押すと、動的計画法のテーブルが1マスずつ埋まっていきます。
- 2 各行が1つの品物、各列が0からWまでの容量を表します。
- 3 各セルは、その品物を「取らない」場合(上のセル)と「取る」場合の値のうち、大きい方になります。
- 4 右下隅のセルが達成可能な最良の値です。Shuffleを押すと新しい品物セットが生成されます。
このツールを使う理由
- 0/1ナップサック問題を、総当たり(brute force)ではなく動的計画法で解く様子を確認できます。
- 各セルが依存する2つのセルからどのように構築されるかを観察できます。
- 総当たりの指数関数的な計算量に対し、O(n·W)の実行時間がどれほど効率的かを理解できます。
- すべての処理はお使いのブラウザ内で完結します。登録不要、アップロードも不要です。
よくある質問
0/1ナップサック問題とは何ですか?
重さと価値を持つ複数の品物と、容量Wの制約が与えられたとき、各品物を「取る」か「取らない」かのみを選び(部分的に取ることは不可)、総重量がWを超えない範囲で価値の合計を最大化する組み合わせを求める問題です。
DPテーブルはどのように動作しますか?
dp[i][w]は、最初のi個の品物と容量wを使った場合の最良の価値です。各セルはmax(その品物を取らない場合 = dp[i-1][w]、取る場合 = dp[i-1][w-wi] + vi)で求められます。
計算量はどれくらいですか?
時間計算量はO(n·W)、空間計算量もO(n·W)です(O(W)まで削減可能)。これは擬多項式時間(pseudo-polynomial)と呼ばれ、Wが小さいほど効率的です。
なぜ「0/1」ナップサックと呼ばれるのですか?
各品物は丸ごと取る(1)か、まったく取らない(0)かのどちらかであり、一部だけ取ることはできません。これは、貪欲法(greedy)で解ける分数ナップサック問題(fractional knapsack)とは異なる点です。
ナップサック問題(0/1)ビジュアライザー とは?
0/1ナップサック問題ビジュアライザーは、動的計画法のテーブルをアニメーションでシミュレートするツールです。dp[i][w]は、最初のi個の品物と容量wを使った場合の最良の価値を表し、各品物を「取らない」か「取る」かのmaxで計算されます。右下隅のセルが最適値になります。
機能
DPテーブルのアニメーション
各アイテムと容量が検討されるたびに値テーブルが埋まっていく様子を確認できます。
計算量
時間・空間計算量: O(nW)(擬似多項式時間)。この問題は一般にNP困難です。
100%プライベート
すべての処理はブラウザ内で完結します——データが外部にアップロードされることはありません。
例
Input
items (w,v) = (10,60),(20,100),(30,120); capacity 50
Output
max value = 220 (take items 2 and 3, weight 50)
主な用途
-
1
動的計画法を学ぶ
重複する部分問題がどのように最適値を構築するかを確認できます。
-
2
資源配分
重量や予算の制約の下でアイテムを選択する状況をモデル化します。
-
3
擬似多項式時間への理解
O(nW)が真の意味での多項式時間ではない理由を理解します。
Zerethonの0/1ナップサック問題ビジュアライザーは、動的計画法による解法をブラウザ上でアニメーション表示し、各アイテムと残り容量ごとに最適値のテーブルを埋めていきます。処理はO(nW)の時間計算量とO(nW)の空間計算量で実行されます(nはアイテム数、Wは容量)——Wはそのビット長に対して指数的であるため、これは擬似多項式時間アルゴリズムです。0/1ナップサック問題は一般にNP困難です。
- カテゴリ
- アルゴリズム
- 料金
- 無料
- プライバシー
- ブラウザベース
- 登録
- 不要
参考文献
- ナップサック問題 — Wikipedia
- MIT OCW 6.006 — Introduction to Algorithms (CLRS) — MIT OpenCourseWare
プライバシー
明記されない限り、データがブラウザの外に送信されることはありません。ナップサック問題(0/1)ビジュアライザー は完全にクライアント側で動作します — サーバーへのアップロードなし、ログなし、入力内容のトラッキングなし。
初めての方へ。Big-O 解析付きのステップバイステップ解説を読む: Dynamic Programming を学ぶ →
関連ツール
バブルソート ビジュアライザー
バブルソートの動きをアニメーションで確認できるツール。ステップ実行や速度調整、カスタム入力データ、比較・交換回数のリアルタイム表示、擬似コードの表示に対応しています。すべてブラウザ内だけで動作します。
ツールを開く挿入ソート(Insertion Sort)ビジュアライザー
挿入ソートをアニメーションで可視化。ステップ実行や速度調整、カスタム入力、比較回数・書き込み回数のリアルタイム表示、疑似コード(pseudocode)表示に対応。すべてブラウザ内で完結します。
ツールを開く選択ソート(Selection Sort)ビジュアライザー
ステップ実行、速度調整、カスタム入力、比較/交換回数のライブカウンター、擬似コードを備えたSelection Sortのアニメーション。すべてブラウザ内だけで完結します。
ツールを開くマージソート ビジュアライザー
マージソートの動きをアニメーションで再現するツールです。ステップ実行、速度調整、独自のデータ入力、比較・書き込み回数のリアルタイム表示、擬似コード表示に対応。すべてブラウザ上だけで動作します。
ツールを開くZerethon Social で作成・共有・成長しよう
無料登録。ポイントを獲得し、実績を集め、世界中のクリエイターとつながりましょう。