2015-05-13 38 views
11

我用Excel求解解決優化問題,我試圖複製其在R.如何複製Excel求解中的R

我發現很多的包像的Optim,投資回報率等,但似乎所有的它們只將矢量作爲對象進行優化,並允許變量取任何連續的值。在我的情況下,我有一個約束矩陣,也需要滿足,我的變量只能採用二進制值。

這是問題,我想解決:

A-d是機器,1-3是任務,並在第一矩陣的數量是利用X光機做Ÿ任務所產生的價值。約束條件是: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) 

一些問題:如何優化最大,似乎這個功能默認優化最低?我該如何添加約束條件?我怎樣才能限制二元變量?

+0

矩陣是一個畸形向量;重塑它,你很好去(假設你理解如何編碼矢量的優化)。 'xmat = matrix(1:4,ncol = 2); x = c(xmat)' – Frank

+0

謝謝弗蘭克!我試過了,它工作。但我有一些跟進問題。我確實不知道如何編碼矢量的優化。 – Yoki

+1

只需添加一個「 - 」減號來加總功能,優化就會最大化。 – forecaster

回答

13

您需要構造一個向量的目標函數和約束矩陣,最後的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這樣的函數不適合這個問題,因爲它們不考慮約束矩陣,也因爲它們不能限制爲二進制變量值。

+0

嗨,你能解釋一下這整個事情是如何工作的嗎?特別是爲什麼'columns'和'rows'必須重複。 – riders994

+0

@ riders994基本上'rbind(columns,rows)'返回線性程序的約束矩陣,'rep(1,nr + nc)'是右邊,'as.vector(costs)'是目標功能。我使用'rep'和其他R函數來構造這個特定線性規劃問題的約束矩陣。如果你有不同的問題,你可能會使用不同的代碼來獲得矩陣。你可以在其幫助頁面閱讀'rep':'?rep'。 – josliber