programing

R에서 Excel 해결사를 복제하는 방법

oldcodes 2023. 6. 18. 16:17
반응형

R에서 Excel 해결사를 복제하는 방법

최적화 문제를 해결하기 위해 엑셀 솔버를 사용했고, R에서 복제하려고 합니다.

Optim, ROI 등과 같은 많은 패키지를 찾았지만, 모두 최적화할 대상으로 벡터만 사용하고 변수가 연속적인 값을 취할 수 있도록 허용하는 것 같습니다.이 경우에도 충족해야 하는 제약 조건 행렬이 있고 변수는 이항 값만 취할 수 있습니다.

제가 해결하고자 하는 문제는 다음과 같습니다.

A-D는 기계이고, 1-3은 작업이며, 첫 번째 행렬의 숫자는 X 기계를 사용하여 Y 작업을 수행함으로써 생성된 값입니다.제약 조건은 다음과 같습니다. A-D는 하나의 작업만 수행할 수 있고 하나의 작업만 수행할 수 있습니다(분할할 수 없음). 각 작업은 하나의 기계에서만 작업할 수 있습니다.

사용 중인 코드는 다음과 같습니다.

par = rep(c(0,1),6)

mat <- matrix(c(9,10,11,4,5,10,1,3,5,7,5,4), nrow = 3)

fr <- function(x) {  
  y= matrix(x,nrow = 4)
  sum(mat %*% y)
}

a = optim(par, fr)

몇 가지 질문:이 함수의 기본 최적화 최소값처럼 보이는 최대값을 최적화하려면 어떻게 해야 합니까?제약 조건을 어떻게 추가할 수 있습니까?이진 변수로 제한하려면 어떻게 해야 합니까?

목적 함수와 제약 조건 행렬에 대한 벡터를 구성해야 하며, 마지막으로 RLP 솔버 중 하나를 사용하여 해결해야 합니다.

library(lpSolve)
costs <- matrix(c(9, 10, 11, 4, 5, 10, 1, 3, 5, 7, 5, 4), nrow=3)
nr <- nrow(costs)
nc <- ncol(costs)
columns <- t(sapply(1:nc, function(x) rep(c(0, 1, 0), c(nr*(x-1), nr, nr*(nc-x)))))
rows <- t(sapply(1:nr, function(x) rep(rep(c(0, 1, 0), c(x-1, 1, nr-x)), nc)))
mod <- lp("max", as.vector(costs), rbind(columns, rows), "<=", rep(1, nr+nc), binary.vec=rep(TRUE, nr*nc))

이제 솔루션과 목표 기능을 파악할 수 있습니다.

mod$objval
# [1] 27
matrix(mod$solution, nrow=nr)
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    1
# [2,]    1    0    0    0
# [3,]    0    1    0    0

다음과 같은 기능을 합니다.optim제약 조건 행렬을 고려하지 않고 이항 변수 값으로 제한할 수 없기 때문에 이 문제에 적합하지 않습니다.

언급URL : https://stackoverflow.com/questions/30225830/how-to-replicate-excel-solver-in-r

반응형