首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >number软件包-限制所选择的唯一可变组件的数量

number软件包-限制所选择的唯一可变组件的数量
EN

Stack Overflow用户
提问于 2020-12-17 18:11:10
回答 1查看 239关注 0票数 0

我使用ompr包创建和解决整数规划问题。为了简单起见,我将以NFL足球奇幻球员为例。

我希望在两场比赛中取得最大的得分,而每场每场只打1名球员。(为了简单起见,这里假设任何球员都可以发挥任何位置。)

我遇到的问题是,在25名可能的玩家中,我想将两场比赛中选择的球员数限制在15名。添加的ompr变量中的i组件表示玩家索引,但我不知道如何添加一个约束来限制唯一的i所选择的总数。

任何帮助都将不胜感激!

代码语言:javascript
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-17 19:01:59

您可以在玩家之间添加一组二进制变量,这些变量可以跟踪玩家在任何游戏中是否被使用。然后,可以将这些变量的和限制在极限(15)上。这允许你只计算一个球员一次,即使他们在这两个游戏中被使用。然后,您可以添加一个大的M约束,如果玩家在任何游戏中的任何位置都使用了一个新的二进制变量,那么这个约束将被强制为1,但是如果没有使用该玩家,则允许变量为0。因为我们有两场比赛,每场比赛最多只能有一名球员,所以我们可以为所有的球员设定大的M为2。

代码语言:javascript
复制
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) %>%
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65346135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档