2014-10-01 76 views
1

我正在研究R中的一些代碼來優化我的幻想足球陣容,但是我遇到了一些限制。我基本上有一個球員名單,他們的位置,預期的點數和成本。R多重整數線性規劃中的約束

名冊必須包括:

1 QB 2 RB 2 WR 1 TE 1 FLEX(無論是RB,WR,或TE) 總在$ 200

我的問題的成本是我的代碼希望選擇FLEX位置作爲WR,RB或TE已選擇的播放器。這裏是我正在使用的代碼,我有一張表,我輸入了用於播放器,位置,點數和成本的列。在表中,任何RB,WR或TE都與FLEX一樣位置重複。我試圖改變將pos ==「FLEX」設置爲pos ==「WR」|| pos ==「RB」|| pos ==「TE」的那一行,但那不起作用,我唯一的想法是運行代碼,如果它複製了FLEX播放器,我將它從源表中刪除。雖然這有點痛苦。

任何想法,不勝感激。

name <- mydata$name 
pos <- mydata$pos 
pts <- mydata$pts 
cost <- mydata$cost 

num.players <- length(name) 

f <- pts 

var.types <- rep("B", num.players) 

A <- rbind(as.numeric(pos=="QB") 
     , as.numeric(pos=="RB") 
     , as.numeric(pos=="WR") 
     , as.numeric(pos=="TE") 
     , as.numeric(pos=="FLEX") 
     ,cost) 

dir <- c("==" 
     ,"==" 
     ,"==" 
     ,"==" 
     ,"==" 
     ,"<=") 

b <- c(1 
    , 2 
    , 2 
    , 1 
    , 1 
    , 200) 

library(Rglpk) 

sol <- Rglpk_solve_LP(obj = f 
       , mat = A 
       , dir = dir 
       , rhs = b 
       , types = var.types 
       , max=TRUE) 
sol 

name[sol$solution == 1] 

回答

4

可以重寫:

1 QB 2 RB 2 WR 1 TE 1 FLEX (either a RB, WR, or TE) 

由於

num(QB) == 1 
2 <= num(RB) <= 3 
2 <= num(WR) <= 3 
1 <= num(TE) <= 2 
num(RB) + num(WR) + num(TE) == 6 
+0

咄,那是很容易的。感謝您的幫助,我知道我正在推翻它。 – user1723699 2014-10-01 21:14:08