열렬히.뛰기

선형계획: R

수학 & 통계 > 최적화이론 > 선형계획: R

  • 손으로 구하기 어려운 만큼 컴퓨터로 구해보는 것도 좋다.
  • 단, 반올림 문제가 일어날 수 있는 만큼 자릿수를 조심하는 것이 필요하다.

선형계획법

  • lpSolve라는 패키지를 이용해서 선형계획법을 계산 할 수 있다.
  • 굉장히 쉬운 편이며, 계산이 너무 어려울 때 사용할 수 있다.

설치

Rstudio 기준 : 위쪽 메뉴에서 [tools] → [install packages]

설치 완료되면 다음과 같이 뜬다.

함수 설명

lp()라는 함수에 여러가지 파라미터를 넣어야 작동한다.

  • direction : min인지, max인지를 결정
  • objective.in : 목적함수
  • const.mat : 제약식의 좌변 (행렬 A)
  • const.dir : 제약식의 부등호
  • const.rhs : 제약식의 우변 (벡터 b)
  • all.int : 전부 정수 표기인지 아닌지. T or F로 입력

제약식의 좌변 행렬: 제약식과 비음조건 모두 포괄해야.

예시

다음과 같은 선형계획법 문제가 있다고 치자.

\begin{align*} \text{max.}&\; 10x_1 + 8x_2 +9x_3 \\ \text{s.t.} &\;2x_1 + 3x_2 + x_3 <= 1000 \\ &\;5x_1 + 6x_2 + 6x_3 <= 2400 \\ &\;x_1 + x_2 + x_3 <= 700 \\ &\;x_1 \ge 0,\; x_2 \ge 160,\; x_3 \ge 0 \end{align*}

코드는 다음과 같이 친다.

r
require(lpSolve)

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

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

# 제약식의 우변
B <- c(1000, 2400, 700, 0, 160, 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

답을 내보면 다음과 같다.

r
> opt$solution
[1] 240 160  40