Operations Research

Operations Research 란 ?

aiden0729

 

 

Operations Research 자체는 개인적으로 굉장히 생소한 단어이다. 통계 - ML 등의 흐름에서 갑자기 나타난 단어 같달까.

그러나 생각보다 고등학교, 대학교(경영, 경제학) 등에서 종종 볼 수 있는 개념이다. '결정 최적화' 정도가 아마 해당 단어를 나타내는 개념이 아닐까 싶다.

 

클래시컬한 실용수학 방법론 중 하나이며, Industrial Engineering 내 Management Science 라고도 불리기도 한다. 1940-50년 효율적인 액션이 굉장히 중요한 전시에 특히 많이 중요했는데, 그 후에는 Supply Chain 등에서 주로 사용되다가 최근들어 ML이 부상하고 예측값나 분류값이 나오면서 이 값들을 어떻게 효율적으로 액션으로 연결시켜야할지 관련하여 IT기업에서도 조금씩 도입하는 기업들이 있는 것 같다.

 

다양한 예측값이 있지만 한정된 자원에 의한 '최적화' 그리고 ' Hard Constraint' 으로 대표되는 엄격한 제한사항을 준수해야만하는 BM이나 모델에 필요한 개념이다. Programming 이라는 용어 자체가 '최소비용 혹은 최대이윤'이 나도록 배열하게 만드는 계획 정도로 통용된다. 

 

 

머신러닝 vs OR 쉽게 비교

 

  머신러닝 Operations Research
무엇을 하나? 예측 (Prediction) 최적화 (Optimization)
주요 목표 결과 예측, 분류 행동 결정, 의사결정
주요 기술 트리, SVM, Neural Network Linear Programming, Integer Programming, Dynamic Programming
활용 예시 배달 시간 예측, 수요 예측 배차 최적화, 가격 책정, 경로 선택

 

 

Full-IT 서비스라면 예측대로 행동하면 되겠지만, 실제 물리적 액션이 필요한 기업은 '시간' 등 추가적인 변수가 있기 때문에 최적화된 행동 전략이 필요하여 필요한 것이다. Operations Research는 아래와 같은 일반적인 구성을 가지고 있으며, 그에 따른 예시이다.

 

 

 

 

 

OR(Operations Research) 문제의 기본 구성

OR 문제는 아래 3가지 요소로 구성:

 

목표함수 (Objective Function) 무엇을 최대화 or 최소화할 것인가 이익 최대화, 비용 최소화, 거리 최소화, 배달시간 최소화
의사결정변수 (Decision Variables) 뭘 조정할 것인가 (얼마나, 어떻게) A 제품 몇 개 생산할까? 라이더를 어디로 배치할까?
제약조건 (Constraints) 반드시 지켜야 할 조건 자원(원자재, 시간) 한계, 사람 수 제한, 수요량 제한 등

 

 

예시 보기: 생산 계획 문제

문제:

  • 공장에서 제품 A, B, C 생산해야 해.
  • 하루 원자재 100개, 작업 시간 80시간이 있음.
  • 제품 A 하나 만들면 원자재 5개, 시간 4시간 소요 → 이익 10만원
    제품 B 하나 만들면 원자재 8개, 시간 5시간 소요 → 이익 15만원
    제품 C 하나 만들면 원자재 6개, 시간 3시간 소요 → 이익 12만원
  • 내일 수요 예측 결과:
    A는 10개쯤, B는 8개쯤, C는 6개쯤 팔릴 것 같음 (ML이 알려줌).

질문:

그럼 A를 몇 개, B를 몇 개, C를 몇 개 만들어야 할까?
(원자재, 시간은 제한돼 있는데 수요는 예측만 됐잖아?)

 

 

Integer Programming으로 문제를 세워보자

1. 의사결정 변수(Decision Variables):

  • A = A 제품 생산 개수
  • B = B 제품 생산 개수
  • C = C 제품 생산 개수
    이 값들을 정수(1개, 2개…)로 결정해야 해 (fractional 안 됨).

2. 목표함수 (Objective Function):

총 이익을 최대화
→ 10 * A + 15 * B + 12 * C → 최대화


3. 제약조건 (Constraints):

  • 원자재 제한:
    5 * A + 8 * B + 6 * C ≤ 100
  • 작업 시간 제한:
    4 * A + 5 * B + 3 * C ≤ 80
  • 수요 예측값 이상 만들 필요 없음:
    A ≤ 10, B ≤ 8, C ≤ 6
  • 음수 불가:
    A, B, C ≥ 0
  • 정수 조건:
    A, B, C는 정수 (Integer!)

 

 

아래는 Integer Programming의 간단한 예시 코드이다

from pulp import LpMaximize, LpProblem, LpVariable

# 문제 정의
prob = LpProblem("Production Plan", LpMaximize)

# 변수 정의 (Integer)
A = LpVariable("A", lowBound=0, upBound=10, cat="Integer")
B = LpVariable("B", lowBound=0, upBound=8, cat="Integer")
C = LpVariable("C", lowBound=0, upBound=6, cat="Integer")

# 목표함수
prob += 10 * A + 15 * B + 12 * C

# 제약조건
prob += 5 * A + 8 * B + 6 * C <= 100   # 원자재
prob += 4 * A + 5 * B + 3 * C <= 80    # 시간

# 풀기
prob.solve()

# 결과 보기
print(f"A: {A.value()}, B: {B.value()}, C: {C.value()}")