2016-07-26 15 views
1

私はいくつかの問題を提供している最適化の問題があります。RGLPK制約の問題

次のコードを実行すると、最適な解決策が得られます。

objective <- DK$DK.proj 

objective.variable.types <- rep("B", length(DK$player)) 
constraint.matrix <- rbind(as.numeric(DK$pos == "SP"), 
         as.numeric(DK$pos == "C"), 
         as.numeric(DK$pos == "1B"), 
         as.numeric(DK$pos == "2B"), 
         as.numeric(DK$pos == "SS"), 
         as.numeric(DK$pos == "3B"), 
         as.numeric(DK$pos == "OF"), 
         DK$salary) 
constraint.directions <- c(
"==", # SP 
"==", # C 
"==", # 1B 
"==", # 2B 
"==", # SS 
"==", # 3B 
"==", # OF, 
"<=") # max salary 

rhs <- c(
2, # SP 
1, # C 
1, # 1B 
1, # 2B 
1, # SS 
1, # 3B 
3, # OF 
50000) # max salary 

Rglpk_solve_LP(obj = objective, mat = constraint.matrix, dir = constraint.directions, rhs = rhs, 
        types = objective.variable.types, max = TRUE) 

しかし、データフレームの中には、複数のポジションがあるため、データフレーム内の一部のプレイヤーが重複しているという問題があります。同じプレイヤーの行は2列あり、位置の列は違っていますが、各プレイヤーは一度しか使用できません。だから私は次のような制約を加えました。

objective <- DK$DK.proj 

objective.variable.types <- rep("B", length(DK$player)) 
constraint.matrix <- rbind(as.numeric(DK$pos == "SP"), 
         as.numeric(DK$pos == "C"), 
         as.numeric(DK$pos == "1B"), 
         as.numeric(DK$pos == "2B"), 
         as.numeric(DK$pos == "SS"), 
         as.numeric(DK$pos == "3B"), 
         as.numeric(DK$pos == "OF"), 
         DK$salary, 
         n_distinct(DK$player)) 
constraint.directions <- c(
"==", # SP 
"==", # C 
"==", # 1B 
"==", # 2B 
"==", # SS 
"==", # 3B 
"==", # OF, 
"<=", # max salary 
"==") # max players 

rhs <- c(
2, # SP 
1, # C 
1, # 1B 
1, # 2B 
1, # SS 
1, # 3B 
3, # OF 
50000, # max salary 
10) # max players 



Rglpk_solve_LP(obj = objective, mat = constraint.matrix, dir = constraint.directions, rhs = rhs, 
      types = objective.variable.types, max = TRUE) 

そして、私は実現可能な解決法を得ることができません。他の制約を守りながら、私は常に10人のユニークで重複していない選手を持つことができるように、私は制約をどのように変更すべきかに関する提案はありますか?

答えて

1

問題は、あなたの制約マトリクスがあなたが思っていることをしていないことです。あなたがコード化した制約マトリクスを見ると、一番下の行はDKデータフレーム内のユニークなプレイヤーの数に等しいすべてのエントリで構成されています。線形計画制約は、制約行列に解ベクトルを乗算するときに達成する必要があります。解ベクトルの1つと行列乗算後の結果のエントリは、ユニークなプレーヤの総数になります。したがって、制約は達成できず、収束しません。

ここで動作するハックです。それはかなりではありませんが、それは仕事を完了します。

objective <- DK$DK.proj 
playerMatrix <- lapply(unique(DK$player), function(name) as.numeric(DK$player==name)) 
playerMatrix <- t(matrix(unlist(playerMatrix), ncol=n_distinct(DK$player))) 

objective.variable.types <- rep("B", length(DK$player)) 
constraint.matrix <- rbind(as.numeric(DK$pos == "SP"), 
          as.numeric(DK$pos == "C"), 
          as.numeric(DK$pos == "1B"), 
          as.numeric(DK$pos == "2B"), 
          as.numeric(DK$pos == "SS"), 
          as.numeric(DK$pos == "3B"), 
          as.numeric(DK$pos == "OF"), 
          DK$salary, 
          playerMatrix) 
constraint.directions <- c(
    "==", # SP 
    "==", # C 
    "==", # 1B 
    "==", # 2B 
    "==", # SS 
    "==", # 3B 
    "==", # OF, 
    "<=", # max salary 
    rep("<=", nrow(playerMatrix))) # unique players 

rhs <- c(
    2, # SP 
    1, # C 
    1, # 1B 
    1, # 2B 
    1, # SS 
    1, # 3B 
    3, # OF 
    50000, # max salary 
    rep(1, nrow(playerMatrix))) # unique players 

    sol <- Rglpk_solve_LP(obj = objective, mat = constraint.matrix, 
      dir = constraint.directions, rhs = rhs, 
      types = objective.variable.types, max = TRUE) 

プレイヤー行列は、固有の選手と同じ行数を持ち、一意のプレイヤーが複数回選択されていないことを確実にすることを追跡します。

+0

恐ろしく、これは素晴らしい作品です! – NateN

関連する問題