Ortools 사용법 및 최적화 이론(Linear Programming)


  • 최적화 소프트웨어인 Ortools의 사용법과 최적화 이론(Optimization)에 대해 작성한 글입니다
    • 키워드 : Ortools 사용법, Ortools Python, Ortools Install, Optimization, 최적화 이론, Linear Programming

최적화란?

최적화 소개, Operation Research의 문제

  • 최적화(Optimization)는 여러 분야에서 다양하게 사용되는 개념
    • 최적화의 정의 : 주어진 제약 조건에서 목표를 가장 잘 가장 좋은(최적의) 해답을 찾는 과정
    • 데이터, AI 분야 : 머신러닝 모델의 파라미터를 찾는 과정에서 사용(Gradient Descent, 비선형 최적화)
    • Operation Research 분야 : 비즈니스 의사 결정 문제를 해결하는 과정에서 사용(Linear Programming, Integer Programming)
    • 이 글에선 Operation Research 분야의 최적화를 주로 설명할 예정
  • Operation Research란?
    • OR은 운용 과학(또는 운영 과학, 경영 과학)이라고 번역이 되는데, 수학적인 방법을 사용해 복잡한 의사결정 문제를 해결하는 학문 분야
    • 군사 작전에서 의사 결정을 최적화하기 위해 시작했고, 여러 산업의 문제 해결에도 사용됨
  • 저는 회사에서 최적화 관련 프로젝트를 진행하면서 익혔고, 팀원분과 아래 프로젝트를 진행하면서 이해도가 높아졌어요



최적화로 풀 수 있는 여러 문제들

  • 여러가지 문제들
    • 공장의 생산 계획 최적화
    • 물류 센터의 배송 경로 최적화
    • 그 외에도 재고 최적화, 가격 최적화 등에도 적용될 수 있음
    • 통신사에서 기지국, 중계기의 최적 위치 선정하기
    • 대역폭 할당 : 트래픽에 따른 최적 자원 분배
    • 시간표 작성 : 교사, 강의실 배정 최적화, 학생 배정
    • 버스 노선 : 버스 경로 최적화
    • 항공편 스케쥴링, 승무원 스케쥴링 근무 최적화
    • 광고 플랫폼에서 광고 예산 할당, 여러 채널의 예산 최적 분배 / 입찰가 최적화, 타겟팅 최적화
    • 모빌리티, 물류, 광고 도메인에서 많이 활용됨
  • 위 내용들을 Operation Research 책, 강의에선 다음과 같이 정의함
    • 수송 문제(Transportation Problem)
      • 여러 공급지에서 여러 수요지로 물건을 운송할 때 최소 비용을 찾는 문제
      • 예 : 세 개의 창고에서 다섯 개의 매장으로 상품을 배송할 때 운송 비용을 최소화하는 방법을 찾는 것
    • 할당 문제(Assignment Problem)
      • m명의 작업자를 n개의 작업에 배정하는 문제. 각 작업자마다 각 작업에 대한 능력치가 다를 때, 전체 효율을 최대화하는 배정 방법을 찾음
      • 예 : 6명의 직원을 5개의 프로젝트에 가장 효율적으로 배정하는 문제
    • 네트워크 최적화(Network Optimization)
      • 최단 경로 찾기, 최소 신장 트리 구하기 등의 문제
      • 예 : 여러 도시를 연결하는 도로 네트워크에서 최소 비용으로 모든 도시를 연결하는 방법을 찾는 것
    • 배낭 문제(Knapsack Problem)
      • 제한된 용량 안에서 가장 가치 있는 물건들의 조합을 찾는 문제
      • 예 : 무게 제한이 있는 등산 가방에 어떤 물건들을 넣을지 결정하는 것
    • 스케줄링 계획(Scheduling Problem)
      • 작업들의 순서와 시작 시간을 정하는 문제
      • 예 : 공장에서 여러 제품을 생산할 때 기계 사용 순서를 최적화하는 것
  • 이 글에선 최적화를 배울 때 초반에 배우는 Linear Programming(LP)에 대해서 다룸
    • Linear Programming : 선형 제약 조건 하에서 선형 목적함수를 최적화하는 방법



최적화 진행 프로세스

  • (1) 문제 정의 및 수학적 모델링
  • (2) 알고리즘 결정
  • 각각의 과정은 유기적으로 진행함(수학적 모델링을 하면서 알고리즘을 결정하기도 함)



1) 문제 정의 및 수학적 모델링

문제 정의

  • 주어진 문제 상황을 보고, 다음 요소를 생각함
  • 실제 현실의 문제를 수학적 모델로 변환하는 단계
  • 최적화 문제의 구조
    • 의사 결정 변수
    • 목적 함수
    • 제약 조건
  • 의사 결정 변수(Decision Variables)
    • 우리가 실제로 찾고자 하는 값
    • 예 : X, Y
  • 목적 함수(Objective Function)
    • 최대화, 최소화하는 대상
    • 예 : 이익 최대화, 비용 최소화
  • 제약 조건(Constraint)
    • 의사 결정 변수들이 만족해야 하는 조건
    • 예 : 예산 제한, 생산 용량 제한, 한사람이 연속으로 스케줄을 진행할 수 없음
  • 참고로 목적 함수가 없다면, 최적화 문제가 아닌 실행 가능성 문제(Feasibility Problem), 제약 만족 문제(Constraint Satisfaction Problem, CSP)라고 할 수 있음
    • 이 케이스는 조건을 만족하는 해가 존재하는가? 조건에 만족하는 해를 찾음
    • 최적화 문제는 조건을 만족하는 해 중 가장 좋은 해는?
    • 때론 최적(Optimal)이 아니여도 조건에 해당되는 값만 찾아도 괜찮은 경우가 있음


문제 상황 파악

  • 우리가 통제할 수 있는 것(의사 결정 변수)과 통제할 수 없는 것(파라미터)를 구분함
    • 생산 계획(어떤 제품을 만드는 계획)에서 통제 가능한 것과 통제 불가능한 것을 나누면
    • 통제 가능: 제품의 생산량
    • 통제 불가능 : 시장 수요, 원자재 가격
  • 목표 설정
    • 달성하고자 하는 것
    • 보통 이익 최대화, 비용 최소화, 생산 시간 최소화가 많이 사용됨
  • 제약의 여러 종류
    • 물리적 제약 : 저장 공간, 생산 능력
    • 논리적 제약 : 선행 관계, 상호 배타성
    • 정책적 제약 : 최소 주문량, 예산 제한


최적화 문제 예시

  • 과자 공장에서 과자 A와 B를 생산 A는 개당 100원의 이익, B는 개당 150원의 이익이 발생
  • 하루 최대 생산량은 총 200개
  • A는 최소 50개 이상 생산해야 함
  • 위 문제를 정의하면
    • 의사 결정 변수 : A의 생산량, B의 생산량
    • 목적 함수 : 이익 최대화
    • 제약 조건
      • 총 생산량 제한(두 요소의 생산량을 합치면 200보다 낮아야 함)
      • x 생산량 제한(최소 50개 이상)
      • x, y는 모두 0 이상(음수 생산 불가능)


최적화 문제 예시 2

  • 커피숍에서 바리스타 근무 시간표를 짜야 함
  • 가게는 매일 9시부터 22시까지 운영
  • 시간당 최소 2명의 바리스타가 필요
  • 각 바리스타는 하루 8시간 근무
  • 인건비를 최소화하고 싶음
  • 위 문제를 요소에 맞게 정의하면
    • 의사결정 변수: 각 바리스타의 시작 근무 시간
    • 목적함수: 총 인건비 최소화
    • 제약조건
      • 매 시간 최소 인원 충족(최소 2명)
      • 근무 시간 제한(하루 8시간)
      • 운영 시간 준수(9시 ~ 22시)



수학적 모델링

  • 위에 정의한 내용을 수식으로 변환하는 과정. 외국어 번역과 유사함
  • 최적화 문제 예시 1의 과자 공장 생산량 결정 문제
    • 의사 결정 변수 : A의 생산량, B의 생산량
    • 목적 함수 : 100x + 150y = 이익
    • 제약 조건
      • x + y <= 200(총 생산량 제한)
      • x >= 50(A 최소 생산량)
      • x, y >= 0(음수 생산 불가능)
  • 최적화 문제 예시 2의 커피숍 바리스타 스케줄링 문제
    • 의사결정 변수 : 이것이 답이 되는가?
      • 각 시간대별로 일하는 바리스타의 수”가 답이 될 수 있을까
      • 수식으로는: x₁ = 9시 바리스타 수, x₂ = 10시 바리스타 수, …
    • 목적함수는 “우리가 최적화하고 싶은 것”을 수식으로 표현
      • “인건비 최소화”가 목표
      • 시급이 10,000원이라면 MIN(SUM(10000(x₁ + x₂ + … + x₁₃)))
    • 제약조건은 ~해야한다를 찾아서 부등식이나 등식으로 바꿈
      • “매 시간 최소 2명이 있어야 한다”
        • x₁ ≥ 2, x₂ ≥ 2, … (각 시간별로)
      • “한 사람은 8시간까지만 일할 수 있다”
        • 이 조건은 조금 더 복잡하지만, 결국 “연속된 8개의 x의 합”이 관련됩니다
  • “최소 ~명이 필요하다” → x ≥ (숫자)
  • “최대 ~개까지 가능하다” → x ≤ (숫자)
  • “A와 B를 합해서 ~이하” → x + y ≤ (숫자)
  • “A는 B의 두 배 이상” → x ≥ 2y

만약 수학적 모델링 과정이 어렵다면

  • 최종 Output 먼저 생각하기
    • 이 문제를 풀면 뭘 알고 싶은가? : 이 질문은 회사에서 커뮤니케이션을 할 때도 도움이 된다. 회의할 때 자주 활용함
    • 물류 창고의 위치를 찾고 싶은 경우
      • 어느 위치가 가장 좋을지를 알고 싶어요
      • 그러면 의사결정 변수는 x 좌표, y 좌표
  • 극단적인 케이스 생각하기
    • 제약조건을 찾을 때 활용
    • 창고가 서울에 있어도 되나요?
      • 아뇨. 너무 땅 값이 비싸요 → 그럼 땅 값을 제약 조건으로 사용
  • 처음엔 단순하게 접근하고 점진적으로 요소 추가하기
    • 처음에 모든 현실적 제약을 고려하려고 하면 어려움
    • 단순한 버전으로 한번 만들고, 거기서 제약을 추가하는 방식으로 문제 정의하는 것을 추천



2) 알고리즘 결정

  • 최적화를 진행할 때 선택할 수 있는 알고리즘은 다양함

  • 이미지 출처 : neos-guide
  • 최적화 문제를 정의하고, 여러 기준을 토대로 알고리즘을 결정함
    • 변수가 연속적(Continuous)인가? 이산값(Discrete)인가?
      • 변수가 실수 값을 가질 수 있는 경우 : Continuous -> LP 고려
      • 변수가 정수나 2진(Binary)값을 가지는 경우 : Discrete -> Integer Programming(IP), Binay Integer Programming(BIP) 고려
      • 변수가 실수, 정수 모두 다 사용해야 한다 -> Mixed Integer Programming(MIP)
    • 제약 조건과 목적 함수가 선형적인가?
      • 선형적이다 : 변수가 1차식으로만 표현, 변수끼리 곱하지 않음
      • 제약 조건과 목적 함수가 선형이면 LP/IP/MIP
      • 비선형이 존재하면 비선형 최적화
    • 논리적 제약이 많은가?
      • 복잡한 논리적 제약이 있으면 Constraint Programming(CP)
      • 제약 조건이 없는 경우엔 Unconstrained Optimization
    • 불확실성 여부에 따라서 다름
      • 불확실함이 없는 경우 : 모든 데이터를 정확히 아는 경우 => LP, IP
      • 불확실함이 있는 경우 : Stochastic Optimization, Robust Optimization
  • 또한 해 관점에서
    • 최적해가 반드시 필요한가?
    • Feasible한 값도 괜찮은가?(Feasible : 제약 조건을 만족하는 해. 최적은 아니지만 조건을 충족한 값을 의미)



Linear Programming

  • 선형 계획법
    • 많은 현실 문제를 선형으로 근사할 수 있음
    • 복잡한 최적화 문제를 해결할 때 선형 계획법이 기초가 되는 경우가 있음
    • 위 최적화 문제 예시 둘 다 LP 문제
  • LP에서 주목할 점
    • 모든 식이 일차식(xy 같은 이차항이 없음)
      • 선형 계획법의 기본 요구사항은 모든 식이 일차식이어야 함
      • 수학적인 선형은 변수들이 곱해지거나 제곱되지 않고, 단순히 더해지기만 하는 것을 의미미함
      • 선형인 식 : 3x + 2y
      • 비선형 : xy(변수가 곱해짐) 또는 x^2(변수가 제곱)
      • 선형성이 보장되어야 global optimum을 찾을 수 있음. 비선형이 되면 문제가 훨씬 복잡해짐
    • 부등호 사용
      • 현실의 제약을 표현할 때 중요함
      • 제약 조건을 잘 보는 것이 중요한데, 재료를 정확히 M을 사용한다보단 M 이하로 사용한다가 현실적인 옵션(재료는 남아도 되므로)
    • 음수 제약이 명시적으로 포함
      • 음수 제약이 없으면, 수학적으로 -10개 생산이 가능함. 그러나 현실에선 음수 생산은 불가능



최적화 솔루션

  • 최적화 솔루션은 모델링 툴과 솔버로 나뉨
  • 모델링 툴 : 다양한 솔버를 선택할 수 있음. 최적화 문제를 해결하는 인터페이스라고 보면 됨
  • 솔버 : 자동차의 엔진처럼 핵심 알고리즘이 구현됨
    • 실제 최적화 문제를 푸는 것은 솔버
    • Gurobi, Cplex 등이 대표적인 상용 솔버
    • Ortools에서 사용할 수 있는 솔버
      • 단순한 선형 문제 : GLOP
      • 정수 제약이 있는 경우 : SCIP
      • 복잡한 논리 제약이 있는 경우 : CP-SAT 솔버
  • 아래 글에선 구글이 만든 Ortools에 대해 설명할 예정
  • 그 외 최적화솔루션, 솔버에 대해선 Optimization Software에 잘 나와있음



Ortools 사용하기

  • Ortools는 구글에서 만든 최적화를 위한 오픈소스 제품
  • 차량 라우팅 문제, LP, CP 등의 문제를 처리하는데 최적화 됨
  • Ortools 문서 : 이 페이지에서 다양한 알고리즘의 설명과 코드 예시를 볼 수 있음
    • GitHub에서 예시 코드를 보는 것도 추천
  • 그러나 함수들만 보는 것은 어려움. 문서가 불친절


설치

pip3 install ortools



Ortools Python 코드 설명

  • Solver 인스턴스 생성 : 어떤 솔버를 사용할지 명시

      solver = pywraplp.Solver.CreateSolver('GLOP')
    
  • 의사 결정 변수 정의

      # 변수 x는 0 이상의 실수값을 가질 수 있음
      # CreateNumVar의 인자는 (최소값, 최대값, 변수 이름)
      x = solver.NumVar(0, solver.infinity(), 'x')
      y = solver.NumVar(0, solver.infinity(), 'y')
    
  • 제약 조건 설정 : solver.Add로 제약 조건 추가

      # x + 2y ≤ 10 형태의 제약 조건 추가
      solver.Add(x + 2 * y <= 10)
      solver.Add(x + y <= 6)
    
  • 목적 함수 설정 : solver.Maximize, solver.Minimize 사용

      # 최대화: 2x + 3y
      solver.Maximize(2 * x + 3 * y)
    
    • 또는 다음과 같이 구성할 수 있음

        objective = solver.Objective()
        objective.SetCoefficient(x, 2)  
        objective.SetCoefficient(y, 3) 
        objective.SetMaximization()
      
  • 최적화 시작 : solver.Solve()를 실행하면 최적화가 시작
    • x.solution_value()을 사용하면 값을 확인할 수 있음
      status = solver.Solve()
        
      # 결과 출력
      if status == pywraplp.Solver.OPTIMAL:
          print('해를 찾았습니다!')
          print('x =', round(x.solution_value(), 2))
          print('y =', round(y.solution_value(), 2))
          print('최적값 =', round(solver.Objective().Value(), 2))
      else:
          print('해를 찾지 못했습니다')
    
  • 정리
    • Solver 생성: 문제 유형에 맞는 솔버를 선택. 여기서는 선형 계획법을 위한 ‘GLOP’을 사용
    • 변수 정의: solver.NumVar()를 사용해 변수를 생성. 각 변수의 범위를 지정할 수 있음
    • 제약조건 추가: solver.Add()를 사용해 제약조건을 추가
    • 목적함수 설정: solver.Maximize() 또는 solver.Minimize()로 목적 함수를 설정
    • 문제 해결: solver.Solve()로 해를 구함


Ortools의 Solver

  • GLOP: Google의 자체 선형 계획법 솔버입니다. 순수한 선형 계획법 문제(즉, 모든 변수가 실수이고 제약조건과 목적함수가 선형인 경우)에 사용. 가장 기본적이고 간단한 문제에 적합함
  • SCIP: 혼합 정수 계획법(MIP) 문제를 풀 수 있는 솔버. 변수 중 일부가 정수여야 하는 경우에 사용함
  • CP-SAT: 제약 프로그래밍(Constraint Programming) 문제를 위한 솔버. 복잡한 논리적 제약 조건이 있는 문제에 적합함



연습 문제

  • 연습 문제는 직접 풀어보는 것을 추천해요!



연습 문제 1번

  • 작은 가구 공장에서 책상과 의자를 만듭니다.
    • 책상: 이익 200달러, 제작 시간 4시간, 목재 30단위 필요
    • 의자: 이익 100달러, 제작 시간 2시간, 목재 10단위 필요
    • 가용 자원: 하루 작업시간 32시간, 목재 200단위
  • 목표: 하루 최대 이익을 계산하기





연습 문제 2번

  • 작은 학교의 시간표를 작성해야 합니다.
    • 3명의 선생님(국어, 수학, 영어)
    • 2개 학급
    • 하루 4교시
    • 각 선생님은 각 학급에 하루 1회 이상 수업
    • 한 선생님이 같은 시간에 두 학급에서 수업할 수 없음
    • 같은 과목은 하루에 2교시 이상 연속으로 배치할 수 없음
  • 목표는 미정. 실행 가능한 Feasible한 값 출력하기
  • SCIP 솔버를 사용해서 풀고, 나중에 Constraint Programming을 학습하면 CP로 풀어보는 것을 추천



정리

  • 최적화의 정의와 어떤 흐름으로 문제를 푸는지, 수학적 모델링을 하는 과정에 대해 작성함
    • 머신러닝, AI 분야가 아니지만 회사에선 이런 문제를 푸는 경우도 있음
  • 다음 글에선 IP, MIP, CP를 Ortools로 해결하는 과정에 대해 작성할 예정



레퍼런스 및 추천 자료



  • 글 작성하는데 걸린 시간 : 2시간 15분
    • 하고자 하는 이야기, 개요 정리 : 13분
    • 초안 글 작성 : 46분
    • 클로드와 셀프 글 피드백 : 안함
    • 2차 글 작성 : 1시간 16분

카일스쿨 유튜브 채널을 만들었습니다. 데이터 분석, 커리어에 대한 내용을 공유드릴 예정입니다.

PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다

이 글이 도움이 되셨거나 의견이 있으시면 댓글 남겨주셔요.

Buy me a coffeeBuy me a coffee





© 2017. by Seongyun Byeon

Powered by zzsza