Analiza sensibilității prețului umbră

Analitică în lanțul de aprovizionare cu Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Definirea prețului umbră

Probleme de modelare:

  • Constrângerile modelului se bazează adesea pe estimări
  • Modificările intrărilor schimbă soluția?

Prețuri umbră:

  • Variația valorii optime a funcției obiectiv la o creștere cu o unitate a părții drepte a unei constrângeri, ceilalți parametri rămânând constanți.
Analitică în lanțul de aprovizionare cu Python

Context - Companie de sticlă - Planificarea resurselor:

Resursă Prod. A Prod. B Prod. C
Ore de producție 6 5 8
Capacitate depozit mp 10.5 20 10
Profit $US $500 $450 $600

Constrângeri:

  • Ore capacitate producție ≤ 60
  • Capacitate depozit ≤ 150 mp
  • Producție maximă A ≤ 8
Analitică în lanțul de aprovizionare cu Python

Exemplu de cod

# Initialize Class, Define Vars., and Objective
model = LpProblem("Max Glass Co. Profits", 
                   LpMaximize)
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)
model += 500 * A + 450 * B + 600 * C

# Constraint 1
model += 6 * A + 5 * B + 8 * C <= 60

# Constraint 2
model += 10.5 * A + 20 * B + 10 * C <= 150
# Constraint 3
model += A  <= 8

# Solve Model
model.solve()
print("Model Status: 
        {}".format(LpStatus[model.status]))
print("Objective = ", value(model.objective))
for v in model.variables():
    print(v.name, "=", v.varValue)
Analitică în lanțul de aprovizionare cu Python

Soluția exemplului

Soluție:

Produse Prod. A Prod. B Prod. C
Cazuri produse 6.667 4 0

Valoarea obiectivului este $5133.33

Analitică în lanțul de aprovizionare cu Python

Revizuirea constrângerilor

Variabilă de decizie:

  • A până la C = Numărul de cazuri pentru produsele A până la C

Constrângeri:

  • 6A + 5B + 8C ≤ 60 (capacitate de producție limitată)
  • 10A + 20B + 10C ≤ 150 (capacitate depozit limitată)
  • A ≤ 8 (producție maximă pentru A)
Analitică în lanțul de aprovizionare cu Python

Afișarea prețului umbră

Cod Python:

o = [{'name':name, 'shadow price':c.pi} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Analitică în lanțul de aprovizionare cu Python

Prețurile umbră explicate

Rezultat:

  name  shadow price
   _C1     78.148148
   _C2      2.962963
   _C3     -0.000000

Constrângerile:

  1. capacitate de producție limitată
  2. capacitate depozit limitată
  3. producție maximă pentru A
Analitică în lanțul de aprovizionare cu Python

Slack-ul constrângerii

slack:

  • Cantitatea de resursă neutilizată.

Python:

o = [{'name':name, 'shadow price':c.pi, 'slack': c.slack} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Analitică în lanțul de aprovizionare cu Python

Slack-ul constrângerii explicat

Rezultat:

  name  shadow price     slack
   _C1     78.148148 -0.000000
   _C2      2.962963 -0.000000
   _C3     -0.000000  1.333333

Despre constrângerile active

  • slack = 0, atunci activă
  • Modificarea unei constrângeri active schimbă soluția

Constrângerile:

  1. capacitate de producție limitată
  2. capacitate depozit limitată
  3. producție maximă pentru A
Analitică în lanțul de aprovizionare cu Python

Rezumat

  • Cum se calculează:
    • shadow prices
    • slack-ul constrângerii
  • Identificarea constrângerilor active
    • slack = 0, atunci activă
    • slack > 0, atunci neactivă
Analitică în lanțul de aprovizionare cu Python

Încercați!

Analitică în lanțul de aprovizionare cu Python

Preparing Video For Download...