Study/R

[R] LP, 선형계획법 R에서 구현

쑨블리 2019. 5. 28. 14:15

먼저 선형 계획법에 대한 개념이 궁금하시다면 이전 글을 확인해주세요

2019/05/28 - [IT] - [분석/통계] LP, 선형계획법

 

예를 들어 아래와 같은 문제가 있다면!

[문제] 어떤 작전부대의 편성을 계획하고 있다.  
 이때 이 작전에 효과적인 전투원은 A, B, C 세 가지 타입이 있다.  
 각 타입의 전투원은 작전을 수행할 때 A타입은 10포인트, B타입은 8포인트, C타입은 9포인트의 효과를 실현할 것으로 기대된다.  
 부대는 각 타입의 전투원을 몇 명씩 편성해야 작전 효과를 극대화할 수 있을까?  
 이때 훈련비용(단위: 천만원)은 각 타입 별로 단위 당 2, 3, 1이 소요되며, 합계 1,000을 초과할 수 없다.  
 전투 준비시간(단위: 시간)은 각각 5, 6, 6이 소요되며, 합계 2,400을 초과할 수 없다.  
 전투참가가능 총인원은 700명을 초과할 없다.  
 또한 본부에서는 특별 명령을 통하여 B타입의 전투원은 160명 이상을 편성하라고 지시하였다. 

목적함수 
 Max. Z = 10x1 + 8x2 +9x3 

제약조건 
 s. t.  2x1 + 3x2 + x3 <= 1000 
        5x1 + 6x2 + 6x3 <= 2400 
        x1 + x2 + x3 <= 700 
        x2 >= 160 
        x1 >= 0, 
        x3 >= 0 

아래와 같이 구현해주시면 됩니다!

install.packages(lpSolve) # 왠지 모르겠눈데 다운로드 안됨 툴에서 설치해야함
library("lpSolve")

# 목적식 (의 계수)
z <- c(10, 8, 9) 

# 제약식의 좌변 (계수)
A <- matrix(c(2, 3, 1,
              5, 6, 6,
              1, 1, 1,
              0, 1, 0,
              1, 0, 0,
              0, 0, 1), 
            nrow=6, byrow=TRUE)

# 제약식의 우변 (해)
B <- c(1000, 2400, 700, 160, 0, 0)

# 제약식의 부등호
dir  <- c("<=", "<=", "<=", ">=", ">=", ">=")

# 최적해
opt <-  lp(direction="max",   # 목적식 조건
           objective.in = z,  #목적식의 계수
           const.mat = A,     # 제약식의 좌변
           const.dir = dir,   # 제약식의 부등호
           const.rhs = B,     # 제약식의 우변
           all.int = T)

# 결과
opt

# 결정변수
opt$solution

 

python에서 구현하는 방법이 궁금하다면

2019/05/28 - [IT] - [python] LP, 선형계획법 python에서 구현