【问题标题】:RGLPK constraints issueRGLPK 约束问题
【发布时间】:2016-07-26 20:04:11
【问题描述】:

我有一个优化问题,它提供了一些问题。

当我运行以下代码时,我得到了一个最佳解决方案。

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 个唯一的、非重复的玩家,同时遵循其他约束的任何建议?

【问题讨论】:

    标签: r mathematical-optimization glpk


    【解决方案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)
    

    玩家矩阵具有与唯一玩家相同的行数,并跟踪确保不会多次选择唯一玩家。

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      相关资源
      最近更新 更多