import pandas as pd
import numpy as np
order = pd.read_excel("data/orders-master.xlsx",sheet_name="Sheet2")
order.sort_values(by='SO Date', inplace=True)
order.reset_index(inplace=True)
dweek = 1
order['dweek']=0
for dd in order.index:
while order.loc[dd,'dweek']==0:
if order.loc[dd,'Delivery date'] - pd.Timestamp('2018-03-01') <= pd.Timedelta(dweek*7,'D'):
order.loc[dd,'dweek'] = dweek
else:
dweek = dweek + 1
sweek = 1
order['sweek']=0
for dd in order.index:
while order.loc[dd,'sweek']==0:
if order.loc[dd,'SO Date'] - pd.Timestamp('2018-03-01') <= pd.Timedelta(sweek*7,'D'):
order.loc[dd,'sweek'] = sweek
else:
sweek = sweek + 1
ww = pd.DataFrame(data=[range(1,40)])
ww.set_index(0,inplace=True)
do = order['dweek']
ao = order['sweek']
so = order['Shift']
INDICES
$o$ customer order
$w$ week number $
INPUT PARAMETERS
$a_o$ arrival period of order o
$d_o$ delivery date of order o
$s_o$ number of shift required for order o
DECISION VARIABLES
$u_o = 1$ if order g is completed after due date; otherwise $u_g=0$ (unit penalty for tardy orders)
$x_{ow} = 1$ if order o is selected for assignment in period w otherwise $x_{ow} = 0$ (scheduling variable)
NTO Number of Tardy Orders
Objective Function
Minimize, $$ \; NTO = \sum_{o \in G} u_o $$
Constraints Order Allocation Constraint
$$ \begin{align} & \sum_{w \in W} x_{ow} s_o <= 108 \\ & \sum_{w} x_{ow} = 1 \\ & \sum_{w:do to D} u_o <= x_{ow} \\ & \sum_{w:1\; to\; ao} x_{ow} = 0 \\ \end{align} $$from pulp import *
prob = LpProblem("Scheduling",LpMinimize)
u = pulp.LpVariable.dicts("delay", [(o) for o in order.index], lowBound=0, cat='Binary')
x = pulp.LpVariable.dicts("selection", [(o,w) for o in order.index for w in ww], lowBound=0, cat='Binary')
prob += lpSum(u[o] for (o) in order.index)
for w in ww:
prob += lpSum(x[(o,w)]*so[o] for (o) in order.index) <= 108
for o in order.index:
prob += lpSum(x[(o,w)] for w in ww) == 1
for o in order.index:
prob += lpSum(u[o] - x[(o,w)] for w in ww.loc[:,do[o]:]) == 0
for o in order.index:
prob += lpSum(x[(o,w)] for w in ww.loc[:,:ao[o]+4]) == 0
prob.solve()
print("Status is", LpStatus[prob.status], " Number of Tardy Orders are", prob.objective.value())
for v in prob.variables():
if v.varValue != 0:
print(v.name, "=", v.varValue)
pp = pd.DataFrame()
for o,week in x:
d = {'order' : [o], 'week' : [week], 'schedule' : [x[(o,week)].varValue]}
d = pd.DataFrame(data=d)
pp= pd.concat([pp,d])
pp = pp.loc[pp['schedule']==1,:]
pp.set_index('order',inplace=True)
order = order.join(pp)
order