前提・実現したいこと
pulpを用いてシフトの作成を行うことを目的としています。
以下が作成したプログラムです。
python
1import pandas as pd 2from pulp import LpBinary, LpMinimize, LpProblem, LpVariable, lpSum 3 4#日付の一覧 5day = pd.date_range("2019-12-01", "2019-12-07") 6 7#アルバイトの一覧 8n_member = 10 9member = pd.Series(f"member{i+1}" for i in range(n_member)) 10 11#シフトの一覧 12shift = ["9:00-14:00", "14:00-19:00", "19:00-23:00", "休み"] 13 14#希望出勤日 15kibou = pd.DataFrame( 16 [ 17 [1, 1, 1, 1, 1, 0, 0], 18 [1, 1, 1, 0, 0, 0, 1], 19 [0, 0, 0, 0, 0, 1, 1], 20 [0, 1, 1, 1, 1, 1, 0], 21 [1, 1, 1, 1, 1, 1, 1], 22 [1, 1, 1, 1, 1, 1, 1], 23 [1, 1, 1, 0, 0, 0, 0], 24 [0, 0, 0, 0, 1, 1, 1], 25 [0, 1, 1, 1, 1, 1, 0], 26 [1, 1, 1, 0, 1, 0, 0], 27 ], 28 index=member, 29 columns=day 30 ) 31 32#必要最低人数 33need = pd.DataFrame([[2,2, 2]], index=day, columns=["9:00-14:00", "14:00-19:00", "19:00-23:00"]) 34need 35 36#モデルの作成 37prob = LpProblem(sense=LpMinimize) 38 39#変数 40x = [[[LpVariable(f"x{m}{d}{t}", cat=LpBinary) for t in shift] 41 for d in day] for m in member] 42 43#目的関数 44obj = 0 45for m in range(member.size): 46 #希望出勤日数 47 ks = kibou.iloc[m].sum() 48 #実際に働いた日数 49 actual = lpSum(x[m][j] for j in range(day.size)) 50 #希望出勤日数と実際に働いた日数の差 51 obj = ks - actual 52 #(制約1)実際に働いた日数が希望出勤日数を超えない制約 53 prob += actual <= ks 54prob += obj 55 56#制約条件 57#(制約2)必要最低人数を満たす制約 58for d in range(day.size): 59 for n in range(need.columns.size): 60 prob += lpSum(x[m][d][n] for m in range(member.size)) >= need.iloc[d, n] 61 62#(制約3)1日における出勤回数は1回のみである制約 63for m in range(member.size): 64 for d in range(day.size): 65 prob += lpSum(x[m][d]) == 1 66 67#(制約4)7日間以上の連続勤務を禁止する制約 68for m in range(member.size): 69 prob += lpSum(x[m][d] for d in range(day.size)) <= 6 70 71 72 73prob.solve() 74
この結果をもとに、データフレームの作成を行いたいのですが、書き方がわかりません。
以下のような表を作成したいと思っています。
表は、index=member、columns=dayを表しており、member1は2019-12-01は休みということを表しています。
ご教授のほどお願いします。
2019-12-01 2019-12-02 2019-12-03 ・・・ member1 "休み" "14:00-19:00" "19:00-23:00" member2 "19:00-23:00" "9:00-14:00" "休み" ・ ・ ・
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/09 11:11