파이썬 최적화 모델로 코스파의 좋은 크리스마스 데이트 시뮬레이션

파이썬으로 최적화 모델을 만들어 안근 짧은 데이트 계획을 시뮬레이션해 보자.




목적

너무 돈과 시간을 들이지 않고 즐거운 데이트하고 싶다.

조건

예산:월말에 월급전이므로 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엔으로 끝난 것 같다!
(그런 능숙해질까..)

좋은 웹페이지 즐겨찾기