import pulp
# Initialize the model
model = pulp.LpProblem("TEMC_Example2", pulp.LpMinimize)
# Sets
suppliers = ['FA', 'FB']
dcs = ['DCE', 'DCW']
customers = ['RC', 'RS', 'RN']
products = ['P1', 'P2']
# Parameters
supply = {
('FA', 'P1'): 500, ('FA', 'P2'): 300,
('FB', 'P1'): 400, ('FB', 'P2'): 400
}
dc_capacity = {'DCE': 700, 'DCW': 600}
demand = {
('RC', 'P1'): 200, ('RC', 'P2'): 150,
('RS', 'P1'): 300, ('RS', 'P2'): 250,
('RN', 'P1'): 200, ('RN', 'P2'): 200
}
cost_sup_dc = {
('FA', 'DCE'): 5, ('FA', 'DCW'): 7,
('FB', 'DCE'): 6, ('FB', 'DCW'): 3
}
cost_dc_cust = {
('DCE', 'RC'): 3, ('DCE', 'RS'): 7, ('DCE', 'RN'): 4,
('DCW', 'RC'): 4, ('DCW', 'RS'): 2, ('DCW', 'RN'): 5
}
fixed_cost = {'DCE': 1000, 'DCW': 1200}
handling_cost = {'DCE': 2, 'DCW': 1.5}
# Decision variables
x = pulp.LpVariable.dicts('flow_sup_dc', ((i,j,p) for i in suppliers for j in dcs for p in products), lowBound=0, cat='Continuous')
y = pulp.LpVariable.dicts('flow_dc_cust', ((j,k,p) for j in dcs for k in customers for p in products), lowBound=0, cat='Continuous')
z = pulp.LpVariable.dicts('dc_open', dcs, cat='Binary')
# Create Objective function
model += (
pulp.lpSum(cost_sup_dc[i,j]*x[i,j,p] for i in suppliers for j in dcs for p in products) +
pulp.lpSum(cost_dc_cust[j,k]*y[j,k,p] for j in dcs for k in customers for p in products) +
pulp.lpSum(fixed_cost[j]*z[j] for j in dcs) +
pulp.lpSum(handling_cost[j]*y[j,k,p] for j in dcs for k in customers for p in products)
), "Total_Cost"
# Supplier capacity constraints
for i in suppliers:
for p in products:
model += pulp.lpSum(x[i,j,p] for j in dcs) <= supply[i,p]
# DC capacity constraints (only if opened)
for j in dcs:
model += pulp.lpSum(y[j,k,p] for k in customers for p in products) <= dc_capacity[j] * z[j]
# Demand fulfillment constraints
for k in customers:
for p in products:
model += pulp.lpSum(y[j,k,p] for j in dcs) == demand[k,p]
# Flow conservation constraints at DCs
for j in dcs:
for p in products:
model += pulp.lpSum(x[i,j,p] for i in suppliers) == pulp.lpSum(y[j,k,p] for k in customers)
# Solve the optimization problem
model.solve(pulp.PULP_CBC_CMD(msg=0))
# Output results
print("Status:", pulp.LpStatus[model.status])
print("Total Cost = $", pulp.value(model.objective))
# Facility decision outputs
for j in dcs:
print(f"DC {j} Open:", z[j].varValue)
# Flow outputs (Supplier -> DC)
for i in suppliers:
for j in dcs:
for p in products:
if x[i,j,p].varValue > 0:
print(f"Flow from Supplier {i} to DC {j}, Product {p}: {x[i,j,p].varValue}")
# Flow outputs (DC -> Customer)
for j in dcs:
for k in customers:
for p in products:
if y[j,k,p].varValue > 0:
print(f"Flow from DC {j} to Customer {k}, Product {p}: {y[j,k,p].varValue}")