ナップサック問題#

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

\[\begin{split} {\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 \end{split}\]
  • \(x_i \in \{0, 1\}\):ナップサックに入れるかどうか

  • \(v_i\):サイズ

  • \(p_i\):価値

  • \(V\):ナップサックの容量

貪欲法#

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

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

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

というもの。

貪欲法の例

Amazon.comにおいて空輸してでも「翌日配送」の表示を出すかどうかのレコメンド問題(Mondal et al, 2022)で使われていたもの。

問題

\[\begin{split} \text{argmax}_{\lambda_i} \sum E(\text{Revenue}_i)\\ \text{s. t. } \sum_i E(\text{Cost}_i) \leq \text{Budget} \end{split}\]
  • \(\lambda_i \in \{0, 1\}\):商品\(i\)を表示するときに「翌日配送」の表示をするかどうか

    • 翌日配送は売上を高める可能性があるが空輸するのでコストも掛かる

  • \(E(R_i)\):商品\(i\)の推定売上

    • \(E(R_i) = \lambda_i \cdot \text{price}_i \cdot \Delta_i\)

    • \(\Delta_i\):speed sensitivity。翌日配送でupliftする売上

アルゴリズム

  1. 利益スコア(benefit score)を計算して、商品をbenefit scoreの降順に並べる

\[ \text{benefit score}_i = \frac {\text{price}_i \cdot \Delta_i} {\text{weight}_i \cdot \text{cost}^{fly}_i }_i \]
  1. 予算内なら順にレコメンド対象にしていく

  • \(FLY := \emptyset, k:=1, \text{Budget}^{res} := B\)

  • while \((\text{Budget}^{res} - d_k \cdot \text{weight}_k \cdot \text{cost}^{fly}_k ) \geq 0\) do

    • \(FLY := FLY \cup \{ \text{product}_k \}\)

    • \(\text{Budget}^{res} := \text{Budget}^{res} - d_k \cdot \text{weight}_k \cdot \text{cost}^{fly}_k\)

    • \(k:=k+1\)

  • end

参考:Mondal, A., Majumder, A., & Chaoji, V. (2022, August). ASPIRE: Air Shipping Recommendation for E-commerce Products via Causal Inference Framework. In Proceedings of the 28th ACM SIGKDD Conference on Knowledge Discovery and Data Mining (pp. 3584-3592).

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

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

\[\begin{split} x^*_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} \end{split}\]

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

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

\[\begin{split} x^*_i = \begin{cases} 1 & \text{ if } \ i = 1,\cdots, i^* -1\\ 0 & \text{ if } \ i = i^*,\cdots, n\\ \end{cases} \end{split}\]

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

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

分岐限定法#

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

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

動的計画法#

典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~ - Qiita

参考文献#

  • 寒野善博(2019)『最適化手法入門』、講談社サイエンティフィック

(reading list)