2016-07-26 102 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) 

但问题是一些球员在数据框架中被重复,因为他们有多个职位。有两行同一个玩家,只有一个不同的位置列,但我只能使用每个玩家一次。所以我加了下面的约束。

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