r - 创建每一种可能的团队组合——组合优化

标签 r combinations simulation combinatorics

如果标题没有准确描述我正在做的事情,我深表歉意。

我正在尝试为梦幻体育比赛构建每一个可能的假设团队。这意味着要结合所有可用的球员,每个球员都有自己所在球队、位置和薪水等特征,这限制了一支球队的人数。我遇到的麻烦是找到一种有效内存的方法来将它们组合起来。

我制作了一个示例数据集:

 player_pool <- data.frame(id = seq(1,30), salary = seq(1,30), team = rep(LETTERS[seq(from=1, to=5)],6), position = rep(LETTERS[seq(from=1, to=5)],6))

在这 30 名球员中,我想选择每支 8 人的球队,所有 5 个角色中至少有 1 名球员,同一球队的球员不超过 3 名,总工资低于 50。

例如,这将是一个有效的团队:

 id salary team position
 1   1      A   A
 2   2      B   B
 3   3      C   C
 4   4      D   D
 5   5      E   E
 6   6      A   A
 7   7      B   B
 8   8      C   C

每队球员不超过两名,每个位置至少 1 名,总工资 36,不超过上限。

我一直在尝试实现一个公式,使用 iterpc 包逐步遍历所有 ~6MM 组合,在每一步查找并计算工资/团队数字。这让我可以将每一步的所有内容都放入内存中,但速度非常慢且效率低下——这相当于创建每个可能的团队并连续应用规则。

任何替代方法都会很棒!

最佳答案

设置将 7 名收入最低的球员加起来,得到 28。这意味着工资超过 22 的人都不能加入球队。

pool <- subset(player_pool,salary<=22)

寻找组合从这里开始,我会采取显而易见的路线,而不是寻找效率:

  1. 识别所有行组合

    rs <- combn(seq(nrow(pool)),8)
    
  2. 测试条件

    good_rs <- with(pool,apply(rs,2,function(x){
      sum(salary[x]) <= 50 &&
      length(unique(position[x])) == 5 &&
      max(lengths(split(x,team[x]))) <= 3
    }))
    

结果它运行得足够快(不到一秒),我看到 339 个匹配的组合

length(which(good_rs))
# [1] 339

关于r - 创建每一种可能的团队组合——组合优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31572497/

相关文章:

r - R 的并行包加载库的 RAM 使用过多

r - shiny-server:变量名限制在 10000 字节以内

python - 从 python 中的列表列表创建列表的所有组合

list - 使用较长列表中的任意两个元素创建列表 DrRacket

java - 如何将代理与优先级范围关联 Anylogic

管道中的 R print() 强制错误类型

python - 在 docker 镜像中安装 R

dataset - 生成天际(PC游戏)药水的所有可能组合的最有效方法是什么?

java - 如何在Java中构建类似QGraphicsView的组件

Java资源-游戏模拟