まずは ortoolpy モジュールの knapsack をインポートします.もしもエラーが表示されたら,準備を参考に,ortoolpy をインストールしよう.なお,ortoolpy をインストールしてもモジュールのインポートに失敗する場合は,Jupyter Notebook を再起動してください.再起動後はインポートに成功します(2021年7月に学内の情報処理実習室で確認).
モジュールのインポート
from ortoolpy import knapsack
この問題をナップサック問題として解くために,weight と value に同じ値を設定します.設定金額を capacity に設定します.
問題のパラメータを設定する
weight = [928, 598, 880, 1180, 598, 1280, 1860,
2580, 788, 2588, 898, 898, 598, 698,
698, 980, 1280, 880, 1000, 498, 698,
498, 398, 598, 680, 980, 550, 880,
1180, 880, 1180, 398, 598, 625]
value = [928, 598, 880, 1180, 598, 1280, 1860,
2580, 788, 2588, 898, 898, 598, 698,
698, 980, 1280, 880, 1000, 498, 698,
498, 398, 598, 680, 980, 550, 880,
1180, 880, 1180, 398, 598, 625]
capacity = 2980
knapsack
関数で問題を解く
問題を解く
sol = knapsack(weight, value, capacity)
結果を表示します.最適解,つまり value 合計の最大値は [8, 11, 21, 22, 31] 番目(0番目からスタートすることに注意)の商品を選んだときに 2980.0 ( = 788 + 898 + 498 + 398 + 398)となり,この値が capacity と等しいので,解が見つかったことを意味します.
結果を表示する
sol
(2980.0, [8, 11, 21, 22, 31])
結果の表示を若干工夫しよう.
結果を表示する
if (sol[0] == capacity):
print("解が見つかりました : ", sol[1])
for i in sol[1]:
print(weight[i])
else:
print("***** 解が見つかりませんでした *****")
解が見つかりました : [8, 11, 21, 22, 31] 788 898 498 398 398