- 손으로 구하기 어려운 만큼 컴퓨터로 구해보는 것도 좋다.
- 단, 반올림 문제가 일어날 수 있는 만큼 자릿수를 조심하는 것이 필요하다.
선형계획법
- 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