Python入門トップページ


目次

  1. 「ゴチ」バトルの問題
  2. ナップサック問題と両替問題
  3. 準備
  4. Python で問題を解く
  5. ファイルを読み込んで問題を解く
  6. 遺伝的アルゴリズムを実装する
  7. ソルバーのクラスを作成する
  8. 参考資料

「ゴチ」バトル

Python で問題を解く

まずは 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

目次に戻る