Python入門トップページ


目次

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

「ゴチ」バトル

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

目次に戻る