Localização de plantas com capacidade — estudo de caso P4

Análise de Cadeia de Suprimentos em Python

Aaren Stubberfield

Supply Chain Analytics Mgr., Ingredion

Simulação vs. análise de sensibilidade

Com análise de sensibilidade:

  • Veja como mudanças em demanda e custos afetam a produção:
    • Onde adicionar produção?
    • A produção muda para outra região?
    • Quais regiões têm produção estável?
  • Compare mudanças múltiplas de uma vez vs. uma por vez com análise de sensibilidade
Análise de Cadeia de Suprimentos em Python

Modelagem por simulação

Podemos aplicar testes de simulação ao nosso Modelo de Localização de Plantas com Capacidade

 

Entradas possíveis para adicionar ruído

  • Demanda
  • Custos variáveis
  • Custos fixos
  • Capacidade
Análise de Cadeia de Suprimentos em Python
# 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])
Análise de Cadeia de Suprimentos em Python

Objetivo:

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]))

 

Demanda total:

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)
Análise de Cadeia de Suprimentos em Python

Exemplo de código — etapa 3

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])
Análise de Cadeia de Suprimentos em Python
    # 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)
Análise de Cadeia de Suprimentos em Python

Resultados

import matplotlib.pyplot as plt
plt.title('Histograma da Prod. na Região E')
plt.hist(df['E'])
plt.show()

resultados do histograma da região E e do objetivo

Análise de Cadeia de Suprimentos em Python

Resumo

Modelo de planta com capacidade

  • Simulação vs. análise de sensibilidade
  • Passo a passo do exemplo de código
Análise de Cadeia de Suprimentos em Python

Vamos praticar!

Análise de Cadeia de Suprimentos em Python

Preparing Video For Download...