Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

ナップサック問題

ナップサック問題(knapsack problem)は価値pip_iやサイズviv_iが様々なnn個の品物が与えられた時、合計重量がナップサックの許容重量を超えない範囲で合計の価値が最大化するように品物を詰める問題。整数計画問題(Integer programming)のひとつで0-1整数計画問題という。

Maximizexi i=1npixisubject to  i=1nvixiV{\text{Maximize}}_{x_i} \ \sum^n_{i=1} p_i x_i\\ \text{subject to } \ \sum^n_{i=1} v_i x_i \leq V
  • xi{0,1}x_i \in \{0, 1\}:ナップサックに入れるかどうか

  • viv_i:サイズ

  • pip_i:価値

  • VV:ナップサックの容量

貪欲法

ナップサックの有名な近似解は

  1. サイズあたりの価値pi/vip_i/v_iが高い順に品物の添字を並べかえる

  2. 品物を1から順にナップザックに詰め込んでいき詰め込めなければストップする

というもの。

線形計画問題への近似と貪欲法

貪欲法のとき、最初に詰め込めなくなる品物の番号をii^*として、

xi={1 if  i=1,,i11vi(Vi=1i1vi) if  i=i0 if  i=i+1,,nx^*_i = \begin{cases} 1 & \text{ if } \ i = 1,\cdots, i^* -1\\ \frac{1}{ v_{i^*} } (V - \sum^{i^* - 1}_{i=1} v_i) & \text{ if }\ i = i^*\\ 0 & \text{ if } \ i = i^* + 1,\cdots, n\\ \end{cases}

とおくと、これはxi{0,1}x_i \in \{0, 1\}という制約を0xi10\leq x_i \leq 1に置き換えた線形計画問題の最適解になる(寒野, 2019)

これは整数計画問題であるナップサック問題の実行可能解ではないため、

xi={1 if  i=1,,i10 if  i=i,,nx^*_i = \begin{cases} 1 & \text{ if } \ i = 1,\cdots, i^* -1\\ 0 & \text{ if } \ i = i^*,\cdots, n\\ \end{cases}

とすると、これは貪欲法になる

(※貪欲法は最適解とは限らない)

分岐限定法

離散最適化問題の厳密解法。

xi{0,1},i=1,,nx_i \in \{0, 1\}, i = 1, \cdots, nなら、解は2n2^n個の組み合わせのうちにある。それを列挙木で列挙して解いていく

References
  1. Mondal, A., Majumder, A., & Chaoji, V. (2022). ASPIRE: Air Shipping Recommendation for E-commerce Products via Causal Inference Framework. Proceedings of the 28th ACM SIGKDD Conference on Knowledge Discovery and Data Mining, 3584–3592. 10.1145/3534678.3539197