Python入門トップページ


目次

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

「ゴチ」バトル

CSV ファイルを読み込んで問題を解く

Pandas を利用して,CSV ファイルを読み込んで問題を解いてみよう.なお,Pandas の利用方法はこちらを参照してください.

GitHub のリポジトリからメニューのデータ (gochi-menu.csv) を Pandas のデータフレームに読み込んで表示してみます.なお,Web ブラウザで CSV ファイルをダウンロードして Python プログラムと同じフォルダにコピーしたものを読み込んでも良いでしょう.なお,gochi-sample.csv ファイルの中身は次のようなカンマ区切りのテキストファイルです.

gochi-sample.csv
no,menu,size,price
0,あわびのオイスターソース煮込み,,928
1,かに肉と青梗菜のクリーム煮込み,,598
2,タチウオ四川風炒め,(小),880
3,タチウオ四川風炒め,(大),1180
4,にんにくの芽と蜂の巣の四川風炒め,,598
5,フカヒレスープ,,1280
6,ふかひれ姿煮込み,(小),1860
7,ふかひれ姿煮込み,(大),2580
8,むしホタテにんにく風味,,788
9,伊勢海老チリ or マヨ,,2588
10,海鮮いため,,898
11,海鮮入りおこげ,,898
12,海老サラダ,,598
13,海老チリソース,,698
14,海老マヨネーズ,,698
15,活アゲマキ貝とニンニクの芽炒め,(小),980
16,活アゲマキ貝とニンニクの芽炒め,(大),1280
17,活カキ入りチヂミ,(小),880
18,活カキ入りチヂミ,(大),1000
19,干し海老白菜芯炒め,,498
20,牛肉と生椎茸オイスタソース炒め,,698
21,黒胡椒入り鳥唐揚げ,,498
22,黒酢いり広東風キムチ,,398
23,蒸し豚肉の辛ソース,,598
24,赤酒粕入り豚バラ煮込みと花巻挟み,(小),680
25,赤酒粕入り豚バラ煮込みと花巻挟み,(大),980
26,ジャージャーメン,,550
27,ビーフン五目炒め,(小),880
28,ビーフン五目炒め,(大),1180
29,豚スペアリブ唐揚げ特製ソースかけ,(小),880
30,豚スペアリブ唐揚げ特製ソースかけ,(大),1180
31,豚足とろけるほど醤油煮込み,,398
32,軟らかい豚バラ煮込み,,598
33,北京ダック,,625

次に Python で必要なモジュールをインポートします.

モジュールのインポート
import numpy as np
import pandas as pd
from ortoolpy import knapsack

Pandas で CSV ファイルをデータフレームとして読み込み,中身を確認します.

CSV ファイルを読み込む
url = "https://github.com/rinsaka/sample-data-sets/blob/master/gochi-menu.csv?raw=true"
# url = "gochi-menu.csv"  # カレントディレクトリから読み込む場合
df = pd.read_csv(url)
df
gochi-data-2021.png

読み込んだデータフレームから priceの 列だけを取り出し,NumPy 配列に変換します.

1次元リストに変換する
weight = df.loc[:, 'price' ].values
print(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]

設定金額を指定し,問題を解く.

設定金額を指定し,問題を解く
# 設定金額
capacity = 2980
# 問題を解く
total, order_ids = knapsack(weight, weight, capacity)
print(total)
print(order_ids)
2980.0
[8, 11, 21, 22, 31]

結果の表示を若干工夫してみよう.

注文するかどうかの 0-1 配列を生成
n, _ = df.shape #  データ数
order = np.zeros(n, dtype=int) # 注文を整数の 0 で初期化
order[order_ids] = 1 # 注文するメニューだけを 1 に変更
print(order)
[0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0]

注文の NumPy 配列を Pandas のデータフレームに追加して表示します.

注文を追加したデータフレームを表示
df['order'] = order
df
gochi-menu-results-2021.png

さらに,注文する料理だけを表示します.


df[df["order"]  == 1]
gochi-menu-results-short-2021.png

目次に戻る