我使用ompr包创建和解决整数规划问题。为了简单起见,我将以NFL足球奇幻球员为例。
我希望在两场比赛中取得最大的得分,而每场每场只打1名球员。(为了简单起见,这里假设任何球员都可以发挥任何位置。)
我遇到的问题是,在25名可能的玩家中,我想将两场比赛中选择的总球员数限制在15名。添加的ompr变量中的i组件表示玩家索引,但我不知道如何添加一个约束来限制唯一的i所选择的总数。
任何帮助都将不胜感激!
n_players = 25
n_positions = 11
n_games = 2
# Points each player will score at each position per game
points_game1 = matrix(runif(25*11), nrow = 25, ncol = 11)
points_game2 = matrix(runif(25*11), nrow = 25, ncol = 11)
points_array <- array(c(points_game1, points_game2), dim = c(n_players, n_positions, 2))
mip <- ompr::MIPModel() %>%
# Initialize player/position set of binary options
ompr::add_variable(x[i, j, k], i = 1:n_players, j = 1:n_positions, k = 1:n_games, type = 'binary') %>%
# Every player/game can only be 0 or 1 across all positions
ompr::add_constraint(sum_expr(x[i, j, k], j = 1:n_positions) <= 1, i = 1:n_players, k = 1:n_games) %>%
# Every position/game has to be exactly 1 across all players
ompr::add_constraint(sum_expr(x[i, j, k], i = 1:n_players) == 1, j = 1:n_positions, k = 1:2) %>%
# ****** Limit to 15 players total ??? ****
# Objective is to maximize points
ompr::set_objective(sum_expr(x[i, j, k] * points_array[i, j, k], i = 1:n_players, j = 1:n_positions, k = 1:n_players), 'max') %>%
# Solve model
ompr::solve_model(with_ROI(solver = 'symphony', verbosity = -2))发布于 2020-12-17 19:01:59
您可以在玩家之间添加一组二进制变量,这些变量可以跟踪玩家在任何游戏中是否被使用。然后,可以将这些变量的和限制在极限(15)上。这允许你只计算一个球员一次,即使他们在这两个游戏中被使用。然后,您可以添加一个大的M约束,如果玩家在任何游戏中的任何位置都使用了一个新的二进制变量,那么这个约束将被强制为1,但是如果没有使用该玩家,则允许变量为0。因为我们有两场比赛,每场比赛最多只能有一名球员,所以我们可以为所有的球员设定大的M为2。
ompr::add_variable(is_used[i], i = 1:n_players, type = 'binary') %>%
ompr::add_constraint(sum_expr(is_used[i],i = 1:n_players) <= 15) %>%
# big M constraint ensuring that is_used is 1 if a player is used
ompr::add_constraint(2*is_used[i] >= sum_expr(x[i,j,k],j = 1:n_positions, k = 1:2), i = 1:n_players) %>%https://stackoverflow.com/questions/65346135
复制相似问题