0-1ナップサック問題 : 分枝限定法
問題. 0-1ナップサック問題(0-1 Knapsack Problem)
個のアイテムからなる集合が与えられる. 番目のアイテムは価値 と重さ を持っている.アイテムをいくつか選び,重み和が 以下で価値の和が最大となるようなものを選べ.
例)
1 | 2 | 3 | 4 | 5 | |
価値 [円] | 7 | 8 | 3 | 4 | 5 |
重さ [kg] | 3 | 5 | 2 | 3 | 4 |
解法. 分枝限定法(Branch and Bound)
まず始めに0-1ナップサック問題を整数計画問題として定式化します.
整数計画問題 (P)
maximize
subject to
変数 は値が のとき 番目のアイテムを選択し, のとき選択をしないことに対応しています.
分枝限定法は変数の値を順番に0か1かに固定していき分枝木を探索していきます.探索の途中で変数 の値を決めるときに, の値はは 0 または 1 に固定されています.このとき,, とすると, から変数の値を決めることは次の問題を解くことに等しく (P) の部分問題となります.ちなみに,変数の値を固定して部分問題を生成する操作を分枝操作(branching operation)と呼びます.
(P) の部分問題
maximize
subject to
分枝木の葉は(P) の許容解に対応するのですが,葉の数は 個もあるので分枝木を全探索することはしたくありません.そこで,変数 の部分問題 を解く必要があるのかをある基準で判定して探索する頂点数を減らすことを考えます.ここでは緩和問題を用いて判定します. も0-1ナップサック問題なのでここでは (P) を考えることにします.
(P) の緩和問題は次のようになります.
線形計画緩和問題 (LP)
maximize
subject to
各変数 は0以上1以下の実数となり (LP) は線形計画問題となります.(LP) は (P) の許容領域を含むので最大化問題の場合は,
(P) の最適値 (LP) の最適値
となります.よって,今までで得られた最良値を としたときに,
(LP)の最適値
ならば,(P) を解いても より大きい値を得ることができないので (P) を解く必要がありません.このように,分枝木の子孫の探索を省略することを限定操作(bounding operation)と呼びます.ちなみに,(LP) の最適解が整数解ならば(P)の最適解となっているので子孫の探索をする必要はありません.
一般に線形計画問題は変数の数と制約式の数に関して多項式時間アルゴリズムとなり,CPLEXやGurobiなどのソルバーを用いて解くのが普通なのですが,(LP) は計算時間 のソルバーを用いないアルゴリズムが知られています.ここでは, のアルゴリズムを紹介しますが気になる方はコルテ,フィーゲンの組合せ最適化の本を参考にして下さい.
(LP) を解くアルゴリズム : (ALG)
ステップ1. 個のアイテムを の大きい順に並び替え, とする.
ステップ2. とする.
ステップ3. とする.
ステップ4. なら としてステップ3に戻る.それ以外は とする.
ステップ5. の値を0にする.
(ALG) はステップ1のソートにかかる時間が支配的となり計算時間は となりますが,分枝限定法では(ALG)のステップ1を前処理で行うことによって各限定操作の緩和問題を解く計算時間は となります.
上の0-1ナップサック問題の例では順番に の大きい順に並んでいるので1番目のアイテムから選択していくと, となり,最適値は 11.8 となります.
まとめ
分枝限定法は最悪の場合指数時間必要となりますが,だいたいのインスタンスで限定操作が上手く働き高速に解くことができます.次のリンク先で問題を解いたのですがが1つのインスタンスでTLEとなりました.
0-1 Knapsack Problem | Aizu Online Judge
緩和問題が線形時間で解けるのは嬉しいですね.