簡體   English   中英

如何在R中復制excel求解器

[英]How to replicate excel solver in R

我使用excel求解器來解決優化問題,我試圖在R中復制它。

我找到了許多軟件包,如optim,ROI等,但似乎所有這些軟件包只將一個向量作為優化對象並允許變量采用任何連續值。 在我的例子中,我有一個約束矩陣,也需要滿足,我的變量只能采用二進制值。

這是我想要解決的問題:

AD是機器,1-3是任務,第一個矩陣中的數字是使用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)

一些問題:如何優化最大值,這個函數默認優化最小值? 如何在其中添加約束? 我怎樣才能限制二進制變量?

您需要為目標函數和約束矩陣構造一個向量,最后使用其中一個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))

現在您可以獲取解決方案和目標函數:

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這樣的函數不適合這個問題,因為它們不考慮約束矩陣,也因為它們不能限制為二進制變量值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM