용량 제한 공장 입지 - 사례 연구 P4

Python으로 배우는 공급망 분석

Aaren Stubberfield

Supply Chain Analytics Mgr., Ingredion

시뮬레이션 vs. 민감도 분석

민감도 분석과 함께:

  • 수요·비용 변화가 생산에 미치는 영향 관찰:
    • 어디에 생산을 추가해야 하는가?
    • 생산이 다른 지역으로 이동하는가
    • 어떤 지역이 안정적 생산량을 보이는가?
  • 민감도 분석으로 다변수 동시 변화 vs. 단일 변수 변화 비교 관찰
Python으로 배우는 공급망 분석

시뮬레이션 모델링

용량 제한 공장 입지 모형에 시뮬레이션 테스트를 적용할 수 있습니다.

 

노이즈 입력 예시

  • 수요
  • 변동비
  • 고정비
  • 용량
Python으로 배우는 공급망 분석
# 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])
# Solve
model.solve()
print(LpStatus[model.status])
Python으로 배우는 공급망 분석

목적함수:

model += (lpSum([fix_cost.loc[i,s]*y[(i,s)] for s in size for i in loc])
          + lpSum([(var_cost.loc[i,j] + normalvariate(0.5, 0.5))*x[(i,j)] 
                   for i in loc for j in loc]))

 

총수요:

for j in loc:
    rd = normalvariate(0, demand.loc[j,'Dmd']*.05)
    model += lpSum([x[(i,j)] for i in loc]) == (demand.loc[j,'Dmd']+rd)
Python으로 배우는 공급망 분석

코드 예시 - 단계 3

def run_pulp_model(fix_cost, var_cost, demand,
                   cap):
    # 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 the Constraints
    for j in loc: rd = normalvariate(
                       0, demand.loc[j,'Dmd']*.05)
        model += lpSum(
         [x[(i,j)] for i in loc]) == (
                           demand.loc[j,'Dmd']+rd)
    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])
Python으로 배우는 공급망 분석
    # Solve
    model.solve()
    o = {}
    for i in loc:
        o[i] = value(lpSum([x[(i, j)] for j in loc]))
    o['Obj'] = value(model.objective)
    return(o)
for i in range(100):
    output.append(run_pulp_model(fix_cost, var_cost, demand, cap))
df = pd.DataFrame(output)
Python으로 배우는 공급망 분석

결과

import matplotlib.pyplot as plt
plt.title('지역 E 생산량 히스토그램')
plt.hist(df['E'])
plt.show()

E 지역과 목적함수의 히스토그램 결과

Python으로 배우는 공급망 분석

요약

용량 제한 공장 모형

  • 시뮬레이션 vs. 민감도 분석
  • 코드 예시 단계별 검토
Python으로 배우는 공급망 분석

직접 해보세요!

Python으로 배우는 공급망 분석

Preparing Video For Download...