Supply Chain Analytics in Python
Aaren Stubberfield
Supply Chain Analytics Mgr., Ingredion
With Sensitivity Analysis:
We can apply simulation testing to our Capacitated Plant Location Model
Possible inputs for adding noise
# Initialize Class
model = LpProblem(
"Capacitated Plant Location Model",
LpMinimize)
# Define Decision Variables
loc = ['A', 'B', 'C', 'D', 'E']
size = ['Low_Cap','High_Cap']
x = LpVariable.dicts(
"production_",
[(i,j) for i in loc for j in loc],
lowBound=0, upBound=None, cat='Continuous')
y = LpVariable.dicts(
"plant_", [(i,s)for s in size for i in loc],
cat='Binary')
# Define Objective Function
model +=(lpSum([fix_cost.loc[i,s]*y[(i,s)]
for s in size for i in loc])
+ lpSum([var_cost.loc[i,j]*x[(i,j)]
for i in loc for j in loc]))
# Define the Constraints
for j in loc: model +=
lpSum([x[(i, j)] for i in loc]) == demand.loc[
j,'Dmd']
for i in loc: model +=
lpSum([x[(i, j)] for j in loc]) <= lpSum(
[cap.loc[i,s]*y[(i,s)]
for s in size])
# Solve
model.solve()
print(LpStatus[model.status])
Objective:
model += (lpSum([fix_cost.loc[i,s]*y[(i,s)] for s in size for i in loc])
+ lpSum([(var_cost.loc[i,j] + normalvariate(0.5, 0.5))*x[(i,j)]
for i in loc for j in loc]))
Total Demand:
for j in loc:
rd = normalvariate(0, demand.loc[j,'Dmd']*.05)
model += lpSum([x[(i,j)] for i in loc]) == (demand.loc[j,'Dmd']+rd)
def run_pulp_model(fix_cost, var_cost, demand,
cap):
# Initialize Class
model = LpProblem(
"Capacitated Plant Location Model",
LpMinimize)
# Define Decision Variables
loc = ['A', 'B', 'C', 'D', 'E']
size = ['Low_Cap','High_Cap']
x = LpVariable.dicts(
"production_",
[(i,j) for i in loc for j in loc],
lowBound=0, upBound=None,
cat='Continuous')
y = LpVariable.dicts(
"plant_",
[(i,s) for s in size for i in loc],
cat='Binary')
# Define the Constraints
for j in loc: rd = normalvariate(
0, demand.loc[j,'Dmd']*.05)
model += lpSum(
[x[(i,j)] for i in loc]) == (
demand.loc[j,'Dmd']+rd)
for i in loc: model +=
lpSum([x[(i,j)] for j in loc]) \
<= lpSum([cap.loc[i,s]*y[(i,s)]
for s in size])
# Solve
model.solve()
o = {}
for i in loc:
o[i] = value(lpSum([x[(i, j)] for j in loc]))
o['Obj'] = value(model.objective)
return(o)
for i in range(100):
output.append(run_pulp_model(fix_cost, var_cost, demand, cap))
df = pd.DataFrame(output)
import matplotlib.pyplot as plt
plt.title('Histogram of Prod. At Region E')
plt.hist(df['E'])
plt.show()
Capacitated Plant Model
Supply Chain Analytics in Python