Lösning: simuleringstestning

Supply Chain Analytics i Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Varning

  • Problem som tar lång tid att lösa bör inte användas med LP eller IP

varningsbild, man som halkar

Supply Chain Analytics i Python

Övergripande koncept

Allmänt koncept:

  • Lägg till slumpmässigt brus i valda nyckelindata
  • Lös modellen upprepade gånger
  • Observera fördelningen
Supply Chain Analytics i Python

Varför vi kan vilja testa

Varför:

  • Indata är ofta uppskattningar och kan vara felaktiga.
  • Tidigare känslighetsanalys ändrade bara en indata i taget.
Supply Chain Analytics i Python

Kontext

Kontext – glastillverkare – resursplanering:

Resurs Prod. A Prod. B Prod. C
Vinst $US $500 $450 $600

Begränsningar:

  • Det finns begränsningar för efterfrågan, produktionskapacitet och lagerkapacitet

Risker:

  • Vinstuppskattningarna kan vara felaktiga
Supply Chain Analytics i 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()
Supply Chain Analytics i Python

Kodexempel – steg 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()
Supply Chain Analytics i 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)
Supply Chain Analytics i Python

Kodexempel – steg 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)
Supply Chain Analytics i Python

Kodexempel – steg 5

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

Utdata: (resultaten kan variera)

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
Supply Chain Analytics i Python

Visualisera som histogram

Produkt A: histogram över produkt a, b, c och målfunktionsvärden

Produkt B: histogram över produkt b

Produkt C: histogram över produkt c

Målfunktionsvärden: histogram över målfunktionsvärden

Supply Chain Analytics i Python

Sammanfattning

  • Bör inte användas på problem som tar lång tid att lösa
  • Fördelar

    • Se hur optimala resultat förändras när modellens indata ändras
  • Steg

    1. Börja med vanlig PuLP-modelkod
    2. Lägg till brus i nyckelindata med Pythons normalvariate
    3. Lägg PuLP-koden i en funktion som returnerar modellens utdata
    4. Skapa en loop som anropar funktionen och lagrar resultaten i en DataFrame
    5. Visualisera resultat-DataFrame
Supply Chain Analytics i Python

Nu kör vi en övning!

Supply Chain Analytics i Python

Preparing Video For Download...