시뮬레이션 테스트 해답

Python으로 배우는 공급망 분석

Aaren Stubberfield

Supply Chain Analytics Mgr.

주의

  • 해결에 오래 걸리는 문제에는 LP나 IP를 사용하지 않아야 합니다.

주의 이미지, 미끄러지는 사람

Python으로 배우는 공급망 분석

전체 개념

일반 개념:

  • 선택한 핵심 입력에 무작위 잡음 추가
  • 모델을 반복적으로 해결
  • 분포 관찰
Python으로 배우는 공급망 분석

시도하는 이유

이유:

  • 입력은 대개 추정치이며, 부정확할 위험이 있습니다.
  • 이전 민감도 분석은 한 번에 하나의 입력만 변경했습니다.
Python으로 배우는 공급망 분석

맥락

맥락 - 유리 회사 - 자원 계획:

Resource Prod. A Prod. B Prod. C
Profit $US $500 $450 $600

제약:

  • 수요, 생산능력, 창고 용량 제약이 있습니다.

위험:

  • 이익 추정이 부정확할 수 있습니다.
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()
Python으로 배우는 공급망 분석

코드 예시 - 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()
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)
Python으로 배우는 공급망 분석

코드 예시 - 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)
Python으로 배우는 공급망 분석

코드 예시 - 5단계

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

출력: (결과는 달라질 수 있음)

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
Python으로 배우는 공급망 분석

히스토그램으로 시각화

제품 A: 제품 A, B, C 및 목적함수의 히스토그램

제품 B: 제품 B의 히스토그램

제품 C: 제품 C의 히스토그램

목적값: 목적값의 히스토그램

Python으로 배우는 공급망 분석

요약

  • 해결에 오래 걸리는 문제에는 사용하지 말아야 합니다.
  • 이점

    • 입력이 변할 때 최적 결과가 어떻게 달라지는지 확인
  • 단계

    1. 기본 PuLP 모델 코드로 시작
    2. Python의 normalvariate로 핵심 입력에 잡음 추가
    3. 모델 출력을 반환하는 함수로 PuLP 코드를 감싸기
    4. 함수를 반복 호출하고 결과를 DataFrame에 저장
    5. 결과 DataFrame 시각화
Python으로 배우는 공급망 분석

직접 해보세요!

Python으로 배우는 공급망 분석

Preparing Video For Download...