Python最適化モデルでコスパの良いクリスマスデートをシミュレートする
Pythonで最適化モデルを作成して安近短なデートプランをシミュレートしてみよう。
目的
あまりお金と時間をかけずに楽しいデートにしたい。
条件
予算:月末で給料前なので5000円まで。
所要時間:平日で翌日も朝早いので7時待合わせなら12時まで。
コース:出来れば自宅マンションでクッキングデートが安近短で良い。
参考データ
政府統計e-Stat 曜日,男女,ライフステージ,一緒にいた人,時刻区分別行動者率
この統計データから人気のコースを集約し、さらに経験則から時間当たりのコストや所要時間を加えて以下の表をCSV形式で作ってみた。
ninki 月2~3回はするという女性の人数(単位千)
jikan、cost 普通にかかる所要時間と予算(¥/h)を経験則で付加
これをpandasでDataFrameとして取得し最適化モデルに組込む。
尚、ninkiについては数値として多少を計るよりも特徴量としてbinningしてカテゴリ変数として扱った。
import pandas as pd
from pulp import LpVariable,LpStatus,value
from ortoolpy import model_min
syuko = pd.read_csv('C:\StaticData\syuko.csv',index_col='estat')
ninki = []
syumi = []
for i in syuko.columns:
ninki.append(syuko.iloc[0][i])
# binning
bin=pd.cut(ninki,3,labels=False,precision=0,duplicates='drop')+1
syumi=list(syuko.columns)
dic = dict(zip(syumi,bin))
さて最適化モデルの作成に入ろう。
変数x,y,zをそれぞれ映画、カラオケ、クッキングをした場合の予定時間とする。
クッキングをメインにしたいので変数Zを多めにしてみよう。
# 最小化モデル定義
mod = model_min()
# 変数設定
x=LpVariable('x',lowBound=0)
y=LpVariable('y',lowBound=0)
z=LpVariable('z',lowBound=0)
# 目的関数設定
mod += syuko.iloc[2][0]*x + syuko.iloc[2][1]*y + syuko.iloc[2][2]*z
# 制約条件
mod += x + y <= 3
mod += y + z >= 3.5
mod += z + x >= 4
mod += x + y + z <= 5
# ソルバー実行
mod.solve()
mst = mod.status
st = LpStatus[mst]
制約条件を色々変えてみてLpStatusからOptimalが返されたら最適解が得られたという事だ。なのでシミュレータとして使ってみても面白い。
因みに
Infensible が返されれば実行不可能
Unbounded なら非有界(無制限で最適解を良く出来る)
Optimal なら最適解のコストと所要時間の組合せを出力する。
# 最適解出力
if st=='Optimal' and value(mod.objective) < 5000:
print("最適予算 " + str(value(mod.objective))+" 円")
plist=[]
con=0
for k,v in dic.items():
print(k,"お薦め度",v," 効率的所要時間",value(mod.variables()[con]),"h")
con += 1
出力結果
やった、クッキングなら自宅マンションで4時間、3,320円で済みそうだ!
(そんな上手くいくか。。)