Teste de simulação: solução

Análise de Cadeia de Suprimentos em Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Atenção

  • Problemas que demoram muito para resolver não devem usar LP ou IP

imagem de cautela, homem escorregando

Análise de Cadeia de Suprimentos em Python

Conceito geral

Conceito geral:

  • Adicione ruído aleatório aos inputs que você escolher
  • Resolva o modelo várias vezes
  • Observe a distribuição
Análise de Cadeia de Suprimentos em Python

Por que tentar

Por quê:

  • Inputs são estimativas. Há risco de estarem imprecisos.
  • A Análise de Sensibilidade anterior só mudou um input por vez.
Análise de Cadeia de Suprimentos em Python

Contexto

Contexto - Vidraria - Planejamento de recursos:

Recurso Prod. A Prod. B Prod. C
Lucro US$ $500 $450 $600

Restrições:

  • Há restrições de demanda, capacidade de produção e capacidade de estoque

Riscos:

  • Estimativas de lucro podem estar imprecisas
Análise de Cadeia de Suprimentos em Python
# Initialize Class, & Define Variables
model = LpProblem("Max Glass Co. Profits", LpMaximize)
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)

# Define Objective Function
model += 500 * A + 450 * B + 600 * C

# Define Constraints & Solve
model += 6 * A + 5 * B + 8 * C <= 60
model += 10.5 * A + 20 * B + 10 * C <= 150
model += A  <= 8
model.solve()
Análise de Cadeia de Suprimentos em Python

Exemplo de código - passo 2

a, b, c = normalvariate(0,25), 
          normalvariate(0,25),
          normalvariate(0,25)
# Define Objective Function
model += (500+a)*A + (450+b)*B + (600+c)*C
# Initialize Class, & Define Variables
model = LpProblem("Max Glass Co. Profits", 
                   LpMaximize)

A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)
a, b, c = normalvariate(0,25), 
          normalvariate(0,25), 
          normalvariate(0,25)
# Define Objective Function
model += (500+a)*A + (450+b)*B + (600+c)*C

# Define Constraints & Solve
model += 6 * A + 5 * B + 8 * C <= 60
model += 10.5 * A + 20 * B + 10 * C <= 150
model += A  <= 8
model.solve()
Análise de Cadeia de Suprimentos em Python
def run_pulp_model():
    # Initialize Class
    model = LpProblem("Max Glass Co. Profits", LpMaximize)
    A = LpVariable('A', lowBound=0)
    B = LpVariable('B', lowBound=0)
    C = LpVariable('C', lowBound=0)
    a, b, c = normalvariate(0,25), normalvariate(0,25), normalvariate(0,25)

    # Define Objective Function
    model += (500+a)*A + (450+b)*B + (600+c)*C

    # Define Constraints & Solve
    model += 6 * A + 5 * B + 8 * C <= 60
    model += 10.5 * A + 20 * B + 10 * C <= 150
    model += A  <= 8
    model.solve()
    o = {'A':A.varValue, 'B':B.varValue, 'C':C.varValue, 'Obj':value(model.objective)}
    return(o)
Análise de Cadeia de Suprimentos em Python

Exemplo de código - passo 4

def run_pulp_model():
    # Initialize Class
    model = LpProblem("Max Glass Co. Profits",
                       LpMaximize)
    A = LpVariable('A', lowBound=0)
    B = LpVariable('B', lowBound=0)
    C = LpVariable('C', lowBound=0)
    a, b, c = normalvariate(0,25), 
              normalvariate(0,25),
              normalvariate(0,25)

    # Define Objective Function
    model += (500+a)*A + (450+b)*B + 
             (600+c)*C
    # Define Constraints & Solve
    model += 6 * A + 5 * B + 8 * C <= 60
    model += 10.5 * A + 20 * B + 10 * C <= 150
    model += A  <= 8
    model.solve()
    o = {'A':A.varValue, 'B':B.varValue, 
         'C':C.varValue, 
         'Obj':value(model.objective)}
    return(o)
for i in range(100):
    output.append(run_pulp_model())
df = pd.DataFrame(output)
Análise de Cadeia de Suprimentos em Python

Exemplo de código - passo 5

print(df['A'].value_counts())
print(df['B'].value_counts())
print(df['C'].value_counts())

Saída: (os resultados podem variar)

6.666667    73
0.000000    14
8.000000    13
Name: A, dtype: int64
4.000000    73
5.454546    14
2.400000    13
Name: B, dtype: int64
0.000000    86
4.090909    14
Name: C, dtype: int64
Análise de Cadeia de Suprimentos em Python

Visualizar como histograma

Produto A: histograma do produto a, b, c e objetivo

Produto B: histograma do produto b

Produto C: histograma do produto c

Valores do objetivo: histograma dos valores do objetivo

Análise de Cadeia de Suprimentos em Python

Resumo

  • Não usar em problemas que demoram muito para resolver
  • Benefícios

    • Ver como o ótimo muda quando os inputs mudam
  • Passos

    1. Comece com o código padrão do PuLP
    2. Adicione ruído aos inputs-chave com normalvariate do Python
    3. Envolva o código do PuLP em uma função que retorne a saída
    4. Crie um loop para chamar a função e salvar em um DataFrame
    5. Visualize o DataFrame de resultados
Análise de Cadeia de Suprimentos em Python

Vamos praticar!

Análise de Cadeia de Suprimentos em Python

Preparing Video For Download...