Lokalizacja zakładu z ograniczeniami – studium przypadku P3

Analityka łańcucha dostaw w Pythonie

Aaren Stubberfield

Supply Chain Analytics Mgr.

Model lokalizacji zakładu z ograniczeniami

Modelowanie

  • Produkcja w regionalnych zakładach
    • Dwa rozmiary zakładów (mały / duży)
  • Eksport produkcji do innych regionów
  • Otwieranie / zamykanie zakładów produkcyjnych

obraz globu z regionalną produkcją

Analityka łańcucha dostaw w Pythonie

Oczekiwane zakresy

Czego oczekujemy od wartości zmiennych decyzyjnych?

Wielkości produkcji:

  • Wysoka produkcja w regionach z niskimi zmiennymi kosztami produkcji i wysyłki
  • Maksymalna produkcja w regionach z relatywnie niskimi stałymi kosztami produkcji

Zakład produkcyjny otwarty lub zamknięty:

  • Zakład o dużej zdolności produkcyjnej w regionach z wysokim popytem
  • Zakład o dużej zdolności produkcyjnej w regionach z relatywnie niskimi kosztami stałymi
Analityka łańcucha dostaw w Pythonie

Analiza wrażliwości ograniczeń

Całkowita produkcja = Całkowity popyt:

  • shadow prices = Zmiany łącznego kosztu na jednostkę wzrostu popytu w regionie
  • slack = Powinien wynosić zero

Całkowita produkcja ≤ Całkowita zdolność produkcyjna:

  • shadow prices = Zmiany łącznych kosztów na jednostkę wzrostu zdolności produkcyjnej
  • slack = Regiony z nadwyżką zdolności produkcyjnej
Analityka łańcucha dostaw w Pythonie
from pulp import *
import pandas as pd

# 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])
Analityka łańcucha dostaw w Pythonie
# Solve
model.solve()

# Print Decision Variables and Objective Value print(LpStatus[model.status]) o = [{'prod':"{} to {}".format(i,j), 'quant':x[(i,j)].varValue} for i in loc for j in loc] print(pd.DataFrame(o)) o = [{'loc':i, 'lc':y[(i,size[0])].varValue, 'hc':y[(i,size[1])].varValue} for i in loc] print(pd.DataFrame(o)) print("Objective = ", value(model.objective))
# Print Shadow Price and Slack o = [{'name':name, 'shadow price':c.pi, 'slack': c.slack} for name, c in model.constraints.items()] print(pd.DataFrame(o))
Analityka łańcucha dostaw w Pythonie

Pytania biznesowe

Prawdopodobne pytania:

  • Jaki jest oczekiwany koszt tego modelu sieci łańcucha dostaw?

  • Jeśli popyt w regionie wzrośnie, jaki zysk jest potrzebny, aby pokryć koszty produkcji i wysyłki do tego regionu?

  • Które regiony mają jeszcze wolne moce produkcyjne na potrzeby przyszłego wzrostu popytu?

Analityka łańcucha dostaw w Pythonie

Podsumowanie

Omówiono:

  • Oczekiwane zakresy zmiennych decyzyjnych
  • Interpretacja wyników analizy wrażliwości (shadow prices i slack)
  • Kod do rozwiązania modelu i wyświetlenia wyników
  • Prawdopodobne pytania biznesowe
Analityka łańcucha dostaw w Pythonie

Świetna robota! Teraz Twoja kolej

Analityka łańcucha dostaw w Pythonie

Preparing Video For Download...