3

私はさまざまな制約を考慮して、可能な限り最高のファンタジーフットボールチームを選ぼうとしています。私の目標は、予想されるポイントの合計を最大化するプレーヤーを選ぶことです。

制約は次のとおりです。

1)チームには以下を含める必要があります。

-1 QB

-2つのRB

-2つのWR

-1 TE

2)プレーヤーのリスクは6を超えてはなりません

3)プレイヤーのコストの合計は300を超えてはなりません。

これどうやってするの?これらの制約を最適化するためのRの最良のパッケージ/関数は何ですか?これらの制約を前提として、投影されたポイントを最大化するための関数呼び出しはどのようになりますか?参考までに、100〜300人のプレイヤーを検索します。

前もって感謝します!次に、データセットの小さな例を示します。

name <- c("Aaron Rodgers","Tom Brady","Arian Foster","Ray Rice","LeSean McCoy","Calvin Johnson","Larry Fitzgerald","Wes Welker","Rob Gronkowski","Jimmy Graham")

pos <- c("QB","QB","RB","RB","RB","WR","WR","WR","TE","TE")

pts <- c(167, 136, 195, 174, 144, 135, 89, 81, 114, 111) 

risk <- c(2.9, 3.4, 0.7, 1.1, 3.5, 5.0, 6.7, 4.7, 3.7, 8.8) 

cost <- c(60, 47, 63, 62, 40, 60, 50, 35, 40, 40) 

mydata <- data.frame(name, pos, pts, risk, cost) 
4

1 に答える 1

8

制約と目的は線形ですが、変数はバイナリ (各プレーヤーを選択するかどうか) です。したがって、問題は線形計画法 (LP) よりも少し一般的であり、混合整数計画法 (MIP) です。CRAN のOptimization Task Viewで、MIP セクションを探します。

CPLEX はおそらくアクセスできない商用ソルバーですが、GLPK は無料です。私があなただったら、おそらく高レベルのインターフェースRglpkを使うでしょう。

問題をマトリックス形式で配置する必要があります。ドキュメントと例を参照することをお勧めします。


編集:実装は次のとおりです。

# We are going to solve:
# maximize f'x subject to A*x <dir> b
# where:
#   x is the variable to solve for: a vector of 0 or 1:
#     1 when the player is selected, 0 otherwise,
#   f is your objective vector,
#   A is a matrix, b a vector, and <dir> a vector of "<=", "==", or ">=",
#   defining your linear constraints.

# number of variables
num.players <- length(name)
# objective:
f <- pts
# the variable are booleans
var.types <- rep("B", num.players)
# the constraints
A <- rbind(as.numeric(pos == "QB"), # num QB
           as.numeric(pos == "RB"), # num RB
           as.numeric(pos == "WR"), # num WR
           as.numeric(pos == "TE"), # num TE
           diag(risk),              # player's risk
           cost)                    # total cost

dir <- c("==",
         "==",
         "==",
         "==",
         rep("<=", num.players),
         "<=")

b <- c(1,
       2,
       2,
       1,
       rep(6, num.players),
       300)

library(Rglpk)
sol <- Rglpk_solve_LP(obj = f, mat = A, dir = dir, rhs = b,
                      types = var.types, max = TRUE)
sol
# $optimum
# [1] 836                      ### <- the optimal total points

# $solution
#  [1] 1 0 1 0 1 1 0 1 1 0     ### <- a `1` for the selected players

# $status
# [1] 0                        ### <- an optimal solution has been found

# your dream team
name[sol$solution == 1]
# [1] "Aaron Rodgers"  "Arian Foster"   "LeSean McCoy"
# [4] "Calvin Johnson" "Wes Welker"     "Rob Gronkowski
于 2013-03-01T00:18:06.630 に答える