lpSolve를 사용한 R의 선형 정수 프로그램

이전 게시물( http://www.supplychaindataanalytics.com/solving-a-simple-linear-programming-problem-using-lpsolve-in-r/ )에서 간단한 선형 최적화 문제를 다음을 사용하여 모델링하고 해결하는 방법을 시연했습니다. R의 lpSolve 패키지

이 포스트에서는 정수 변수 모델링에 대한 주제를 추가하고자 합니다.

이전 게시물에서 x + y <= 3이라는 제약 조건을 사용하여 목적 함수 2x + 3y를 최대화했습니다. 두 변수가 모두 음수가 아닌 연속이면 해는 목적 함수의 최적 값이 9인 y=3입니다.

이 게시물에서는 y가 정수여야 한다는 또 다른 제약 조건을 추가합니다. 또한 이제 x + y <= 3.9가 되도록 초기 제약 조건을 조정합니다. R에서 lpSolve 패키지를 사용하면 int.vec 매개변수를 지정하여 정수 변수 제약 조건을 고려할 수 있으며 문제에서 고려할 정수 변수의 인덱스가 있는 벡터를 나타냅니다. 이 경우 y가 정수이므로 인덱스는 2입니다.

먼저 이전 문제와 유사한 간단한 선형 프로그래밍 문제를 해결하는 것으로 시작합니다. 단, x + y <= 3.9(3.0 대신)입니다. 목적 함수는 변경되지 않습니다. 따라서 이것은 정수가 아닌 문제입니다(벤치마크 역할을 함).

library(lpSolve)
f.obj <- c(2,3)
f.con <- matrix(c(1,1), nrow = 1, byrow = TRUE)
f.dir <- c("<=")
f.rhs <- c(3.9)

solution <- lp(direction = "max",
               objective.in = f.obj,
               const.mat = f.con, 
               const.dir = f.dir, 
               const.rhs = f.rhs
               )

solution
## Success: the objective function is 11.7

x + y <= 3.9라는 제약 조건이 있는 정수가 아닌 문제에 대한 최적 솔루션은 다음과 같은 최적(= 최대)을 갖습니다.

solution$solution
## [1] 0.0 3.9

이제 위의 모델을 다시 한 번 모델링하고 해결합니다. 그러나 y는 정수 변수로 지정됩니다.

library(lpSolve)
f.obj <- c(2,3)
f.con <- matrix(c(1,1), nrow = 1, byrow = TRUE)
f.dir <- c("<=")
f.rhs <- c(3.9)
f.intvec <- c(2)

solution <- lp(direction = "max",
               objective.in = f.obj,
               const.mat = f.con, 
               const.dir = f.dir, 
               const.rhs = f.rhs,
               int.vec = f.intvec
               )

solution
## Success: the objective function is 10.8

추가 정수 제약 조건을 고려하여 목적 함수의 최대 값이 낮아졌습니다. 이제 최적의 시점은 다음과 같습니다.

solution$solution
## [1] 0.9 3.0

보시다시피 최적의 솔루션은 더 이상 y가 3.9가 아니라 y가 3이 되는 것입니다. 이는 실제로 정수 값입니다!

선형 계획법에 관심이 있다면 이 주제에 대한 저의 다른 블로그 게시물을 확인하십시오 . 또한 관심이 있는 경우 비선형 및 2차 계획법 에 대한 내 게시물을 확인하십시오 . 마지막으로 SciPy 모듈을 사용하여 Python의 선형 프로그래밍 에 대한 내 게시물을 읽는 데 관심이 있을 수도 있습니다 .

You May Also Like

Leave a Reply

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.