논리 제약 조건

Python으로 배우는 공급망 분석

Aaren Stubberfield

Supply Chain Analytics Mgr.

예제 문제

최대 중량 20,000 lbs

Product Weight (lbs) Profitability ($US)
A 12,800 77,878
B 10,900 82,713
C 11,400 82,728
D 2,100 68,423
E 11,300 84,119
F 2,300 77,765
  • 중량 제한을 넘지 않으면서 최댓값의 수익 제품 선택
  • 의사결정변수:
    • X$_{i}$ = 제품 _i_ 를 선택하면 1, 아니면 0
  • 목적함수:
    • z 최대화 = $\sum$ Profitability$_{i}$X$_{i}$
  • 제약식:
    • $\sum$ Weight$_{i}$X$_{i}$ < 20,0000
Python으로 배우는 공급망 분석
prod = ['A', 'B', 'C', 'D', 'E', 'F']
weight = {'A':12800, 'B':10900, 'C':11400, 'D':2100, 'E':11300, 'F':2300}
prof = {'A':77878, 'B':82713, 'C':82728, 'D':68423, 'E':84119, 'F':77765}

# Initialize Class model = LpProblem("Loading Truck Problem", LpMaximize) # Define Decision Variables x = LpVariable.dicts('ship_', prod, cat='Binary')
# Define Objective model += lpSum([prof[i]*x[i] for i in prod]) # Define Constraint model += lpSum([weight[i]*x[i] for i in prod]) <= 20000
# Solve Model model.solve() for i in prod: print("{} status {}".format(i, x[i].varValue))
Python으로 배우는 공급망 분석

예시 결과

최대 중량 20,000 lbs

Product 선적 여부
A No
B No
C No
D Yes
E Yes
F Yes

결과

  • 수익성: $230,307
  • 제품 중량: 15,700 lbs
Python으로 배우는 공급망 분석

논리 제약 예시 1

제품 E 또는 제품 D 중 하나만 선택합니다(둘 다 불가).

  • X$_{E}$ = 제품 _i_ 를 선택하면 1, 아니면 0
  • X$_{D}$ = 제품 _i_ 를 선택하면 1, 아니면 0
  • 제약
    • X$_{E}$ + X$_{D}$ ≤ 1
Python으로 배우는 공급망 분석

코드 예시 - 논리 제약 예시 1

model += x['E'] + x['D'] <= 1
prod = ['A', 'B', 'C', 'D', 'E', 'F']
weight = {'A':12800, 'B':10900, 'C':11400, 
          'D':2100, 'E':11300, 'F':2300}
prof = {'A':77878, 'B':82713, 'C':82728, 
        'D':68423, 'E':84119, 'F':77765}

# Initialize Class
model = LpProblem("Loading Truck Problem",
                   LpMaximize)

# Define Decision Variables
x = LpVariable.dicts('ship_', prod, 
                      cat='Binary')
# Define Objective
model += lpSum([prof[i]*x[i] for i in prod])

# Define Constraint
model += 
  lpSum([weight[i]*x[i] for i in prod]) <= 20000
model += x['E'] + x['D'] <= 1

# Solve Model
model.solve()
for i in prod:
  print("{} status {}".format(i, x[i].varValue))
Python으로 배우는 공급망 분석

논리 제약 1 예시 결과

최대 중량 20,000 lbs

Product 선적 여부
A No
B No
C Yes
D Yes
E No
F Yes

결과

  • 수익성: $228,916
  • 제품 중량: 15,800 lbs
Python으로 배우는 공급망 분석

논리 제약 예시 2

제품 D를 선택하면 제품 B도 선택해야 합니다.

  • X$_{D}$ = 제품 _i_ 를 선택하면 1, 아니면 0
  • X$_{B}$ = 제품 _i_ 를 선택하면 1, 아니면 0
  • 제약
    • X$_{D}$ ≤ X$_{B}$
Python으로 배우는 공급망 분석

코드 예시 - 논리 제약 예시 2

model += x['D'] <= x['B']

prod = ['A', 'B', 'C', 'D', 'E', 'F'] weight = {'A':12800, 'B':10900, 'C':11400, 'D':2100, 'E':11300, 'F':2300} prof = {'A':77878, 'B':82713, 'C':82728, 'D':68423, 'E':84119, 'F':77765} # Initialize Class model = LpProblem("Loading Truck Problem", LpMaximize) # Define Decision Variables x = LpVariable.dicts('ship_', prod, cat='Binary')
# Define Objective
model += lpSum([prof[i]*x[i] for i in prod])

# Define Constraint
model += 
 lpSum([weight[i]*x[i] for i in prod]) <= 20000
model += x['D'] <= x['B']

# Solve Model
model.solve()
for i in prod:
  print("{} status {}".format(i, x[i].varValue))
Python으로 배우는 공급망 분석

논리 제약 2 예시 결과

최대 중량 20,000 lbs

Product 선적 여부
A No
B Yes
C No
D Yes
E No
F Yes

결과

  • 수익성: $228,901
  • 제품 중량: 15,300 lbs
Python으로 배우는 공급망 분석

기타 논리 제약

논리 제약 제약식
항목 _i_ 를 선택하면 항목 _j_ 도 선택 x$_{i}$ - x$_{j}$ ≤ 0
항목 _i_ 또는 _j_ 중 하나만 선택(동시에 선택 불가) x$_{i}$ + x$_{j}$ = 1
항목 _i_ 를 선택하면 항목 _j_ 는 선택 안 함 x$_{i}$ - x$_{j}$ ≤ 1
항목 _i_ 를 선택하지 않으면 항목 _j_ 도 선택 안 함 -x$_{i}$ + x$_{j}$ ≤ 0
_i_, _j_, _k_ 중 최대 한 개만 선택 x$_{i}$ + x$_{j}$ + x$_{k}$ ≤ 1
1 James Orlin, and Ebrahim Nasrabadi. 15.053 Optimization Methods in Management Science. Spring 2013. Massachusetts Institute of Technology: MIT OpenCourseWare. License: Creative Commons BY-NC-SA.
Python으로 배우는 공급망 분석

요약

  • 논리 제약 예시 검토
  • 기타 논리 제약 표 제시
Python으로 배우는 공급망 분석

이제 실습해 보세요!

Python으로 배우는 공급망 분석

Preparing Video For Download...