2017-10-16 150 views
1

我有這樣的優化問題,我試圖根據列X中的唯一值來最大化列z,但也在約束條件下,每個X所選的唯一值總和最大的列Y小於(在此例如)23.使用LpSolve在R中設置線性規劃優化?

例如,我有這樣的樣本數據:

d=data.frame(x=c(1,1,1,2,2,2,3,3,3),y=c(9,7,5,9,7,5,9,7,5),z=c(25,20,5,20,10,5,10,5,3)) 

,看起來像這樣:

X Y Z 
1 1 9 25  
2 1 7 20 
3 1 5 5  
4 2 9 20  
5 2 7 10  
6 2 5 5  
7 3 9 10  
8 3 7 5    
9 3 5 5 

結果應該是這樣的:

X Y Z 
1 1 9 25 
4 2 9 20  
9 3 5 5 

如何在lpSolve :: lp函數中設置此問題?

+0

你試過了什麼?你有沒有想過LP與IP? – sascha

+0

所以基本上我已經在excel中使用解算器完成了這個工作,並且希望將它移到R.我不太關注LP或IP(他們的意思)。我發現堆棧中的其他示例展示瞭如何移動這個過程,但沒有包括如何使用picks約束的總和。 – CooperBuckeye05

+0

您(可能)無法將其解決爲純粹的線性程序,您將需要混合整數編程(由lpsolve支持)。閱讀您要使用的包裝文檔,查看它需要的標準格式,並自行嘗試一些內容,因爲目前這種格式非常廣泛。 * picking *的性質將被表示爲二元變量:如果選擇x0,x0 = 1。只挑選三個候選人中的一個:x0 + x1 + x2 <= 1 (and > = 1如果您需要的話)。 – sascha

回答

3

您試圖最大限度地受到兩種類型的約束選定的選項的Z值的總和:

  • 所選選項的y值的總和不超過23
  • 你選擇每個獨特的x值

可以爲每個選項創建了一個二元變量,然後用lpSolve解決一個值:

d=data.frame(x=c(1,1,1,2,2,2,3,3,3),y=c(9,7,5,9,7,5,9,7,5),z=c(25,20,5,20,10,5,10,5,3)) 
library(lpSolve) 
all.x <- unique(d$x) 
d[lp(direction = "max", 
    objective.in = d$z, 
    const.mat = rbind(outer(all.x, d$x, "=="), d$y), 
    const.dir = rep(c("==", "<="), c(length(all.x), 1)), 
    const.rhs = rep(c(1, 23), c(length(all.x), 1)), 
    all.bin = TRUE)$solution == 1,] 
# x y z 
# 1 1 9 25 
# 4 2 9 20 
# 9 3 5 3 
+0

這個很好用,謝謝!在我仍然只是學習這個包的過程中,我感謝你們的幫助,我通過學習代碼並玩弄它而學習,這是給出一些指導和幫助的完美例子(與其他先前的評論者相反)。再次感謝! – CooperBuckeye05

+0

這可能需要一個新線程,但如果我想將all.x更改爲1,1,2,3(其中有多個1,s(即不唯一)),我該如何去做改變函數的const.mat行?我需要更改lp函數的其他部分嗎? – CooperBuckeye05

+0

@ CooperBuckeye05現在約束限制在每組中只有一個。如果你想讓一個特定的值超過一個,你只需要把'const.rhs'改成除1之外的東西。 – josliber