PuLP 모델링 기본

Python으로 배우는 공급망 분석

Aaren Stubberfield

Supply Chain Analytics Mgr.

PuLP란?

  • PuLP는 Python으로 작성된 선형계획법(LP) 및 정수계획법(IP) 문제용 모델링 프레임워크입니다.

  • COIN-OR 재단(Computational Infrastructure for Operations Research)이 유지 관리합니다.

  • PuLP는 다음 솔버와 연동됩니다

    • CPLEX
    • COIN
    • Gurobi
    • 등
Python으로 배우는 공급망 분석

PuLP 예시 – 자원 스케줄링

  • 두 종류의 케이크를 파는 부티크 베이커리 컨설팅
  • 30일 한 달
  • 보유 자원:
    • 오븐 1대
    • 제빵사 2명
    • 포장 담당 1명 – 22일만 근무
Python으로 배우는 공급망 분석

PuLP 예시 – 자원 스케줄링

  • 두 케이크의 자원 소요가 다름:
Cake A Cake B
오븐 0.5일 1일
제빵사 1일 2.5일
포장 1일 2일

.

Cake A Cake B
이익 $20.00 $40.00
Python으로 배우는 공급망 분석

PuLP 예시 – 자원 스케줄링

  • 목표: 이익 최대화
    • 이익 = 20*A + 40*B
  • 제약:
    • A ≥ 0
    • B ≥ 0
    • 0.5A + 1B ≤ 30
    • 1A + 2.5B ≤ 60
    • 1A + 2B ≤ 22
Python으로 배우는 공급망 분석

PuLP의 공통 모델링 절차

  1. 모델 초기화
  2. 의사결정변수 정의
  3. 목적함수 정의
  4. 제약식 정의
  5. 모델 풀기
Python으로 배우는 공급망 분석

모델 초기화 - LpProblem()

LpProblem(name='NoName', sense=LpMinimize)
  • name = 출력 .lp 파일에 사용될 문제 이름, 예: "My LP Problem"
  • sense = 목적함수 최대화/최소화
    • 최소화 = LpMinimize (기본값)
    • 최대화 = LpMaximize
Python으로 배우는 공급망 분석

PuLP 예시 – 자원 스케줄링

  1. 모델 초기화
from pulp import *

# Initialize Class
model = LpProblem("Maximize Bakery Profits", LpMaximize)
Python으로 배우는 공급망 분석

의사결정변수 정의 - LpVariable()

LpVariable(name, lowBound=None, upBound=None, cat='Continuous', e=None)
  • name = 출력 .lp 파일에 사용될 변수 이름
  • lowBound = 하한
  • upBound = 상한
  • cat = 변수 유형
    • 정수
    • 이진
    • 연속 (기본값)
  • e = 열 기반 모델링에 사용
Python으로 배우는 공급망 분석

PuLP 예시 – 자원 스케줄링

  1. 클래스 초기화
  2. 변수 정의
# Define Decision Variables
A = LpVariable('A', lowBound=0, cat='Integer')
B = LpVariable('B', lowBound=0, cat='Integer')
Python으로 배우는 공급망 분석

PuLP 예시 – 자원 스케줄링

  1. 클래스 초기화
  2. 변수 정의
  3. 목적함수 정의
# Define Objective Function
model += 20 * A + 40 * B
Python으로 배우는 공급망 분석

PuLP 예시 – 자원 스케줄링

  1. 클래스 초기화
  2. 변수 정의
  3. 목적함수 정의
  4. 제약식 정의
# Define Constraints
model += 0.5 * A + 1 * B <= 30
model += 1 * A + 2.5 * B <= 60
model += 1 * A + 2 * B <= 22
Python으로 배우는 공급망 분석

PuLP 예시 – 자원 스케줄링

  1. 클래스 초기화
  2. 변수 정의
  3. 목적함수 정의
  4. 제약식 정의
  5. 모델 풀기
# Solve Model
model.solve()
print("Produce {} Cake A".format(A.varValue))
print("Produce {} Cake B".format(B.varValue))
Python으로 배우는 공급망 분석

PuLP 예시 – 자원 스케줄링

from pulp import *

# Initialize Class
model = LpProblem("Maximize Bakery Profits",
                   LpMaximize)

# Define Decision Variables
A = LpVariable('A', lowBound=0,
                cat='Integer')
B = LpVariable('B', lowBound=0, 
                cat='Integer')

# Define Objective Function
model += 20 * A + 40 * B
# Define Constraints
model += 0.5 * A + 1 * B <= 30
model += 1 * A + 2.5 * B <= 60
model += 1 * A + 2 * B <= 22

# Solve Model
model.solve()
print("Produce {} Cake A".format(A.varValue))
print("Produce {} Cake B".format(B.varValue))
Python으로 배우는 공급망 분석

요약

  • PuLP는 Python용 LP/IP 모델러입니다.
  • PuLP 모델링 5단계를 검토했습니다

    1. 모델 초기화
    2. 의사결정변수 정의
    3. 목적함수 정의
    4. 제약식 정의
    5. 모델 풀기
  • 자원 스케줄링 예제를 완료했습니다

Python으로 배우는 공급망 분석

연습해 봅시다!

Python으로 배우는 공급망 분석

Preparing Video For Download...