如何在R中复制excel求解器

我用excel解决scheme来解决一个优化问题,我试图在R中复制它。

我发现了许多包如优化,投资回报率等包,但似乎他们都只是把vector作为优化的对象,并允许variables采取任何连续的价值。 在我的情况下,我有一个约束matrix,也需要满足,我的variables只能采取二进制值。

这是我想解决的问题:

AD是机器,1-3是任务,第一个matrix中的数字是X机器做Y任务产生的数值。 约束是:AD可以做,只能做一个任务(不能分割); 每个任务可以工作,只能由一台机器工作。

这是我正在使用的代码:

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) 

有些问题:我怎样才能优化最大值,看来这个函数默认优化的最小值? 我怎样才能添加约束呢? 我怎样才能限制二元variables?

您需要为目标函数和约束matrix构造一个向量,最后使用R LP求解器之一求解:

 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)) 

现在你可以获得解决scheme和目标函数:

 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这样的函数不适合这个问题,因为它们不考虑约束matrix,也因为它们不能限制为二进制variables值。