ナップサック問題を解く(ライブラリknapsackを使用)
ナップサック問題とは、ナップサックに容量を超えずに荷物を詰めるときにその荷物の合計価値が最大となる組み合わせを求める最適化問題です。
ここでは
重さ1kg、値段100円の荷物が3個
重さ2kg、値段300円の荷物が3個
重さ5kg、値段800円の荷物が3個
ある場合に
13kgまで入るナップサックにどのように詰めれば値段が一番高くなるか
について解きます。ライブラリ'ortoolpy'の'knapsack'を用います
関連記事
環境
- windows10 home
- Anaconda 3/ jupyter notebook 5.6.0
- Python 3.7.0
準備
ライブラリortoolpy をpipでインストールします。
pip install ortoolpy
コード
from ortoolpy import knapsack weight = [1,1,1,2,2,2,5,5,5] # 重さ value = [100,100,100,300,300,300,800,800,800] # 値段 capacity = 13 # ナップサックの最大重さ # ナップサック計算 result = knapsack(weight, value, capacity) # 結果表示 print('■値段の合計',result[0],'円') total = 0 print('■組み合わせ') for i in result[1]: print(' 重さ:',weight[i],'kg','値段:',value[i],'円') total += weight[i] print('■重さの合計',total,'kg')
実行結果
値段が最大になる組み合わせとして1kgを1個、2kgを1個、5kgを2個詰めれば、重さ13kg値段2000円となることが分かります。
■値段の合計 2000.0 円
■組み合わせ
重さ: 1 kg 値段: 100 円
重さ: 2 kg 値段: 300 円
重さ: 5 kg 値段: 800 円
重さ: 5 kg 値段: 800 円
■重さの合計 13 kg
以下のサイトを参考にさせていただきました
株式会社GRI >> 頭の体操?AIの定番「ナップザック問題」を考える
Python Software Foundation >> ortoolpy 0.2.23