首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建每一个可能的团队组合--组合优化

创建每一个可能的团队组合--组合优化
EN

Stack Overflow用户
提问于 2015-07-22 19:39:12
回答 1查看 299关注 0票数 2

如果标题不能准确地描述我正在做的事情,我很抱歉。

我正试图为一个幻想的体育比赛构建每一个可能的假想团队。这意味着将所有可用的球员组合在一起,每个球员都有各自的特点,比如他们所在的球队、他们的位置和他们的薪水,这就限制了他们在一支球队中的数量。我遇到的麻烦是找到了一种有效的记忆方法来把它们结合起来。

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

代码语言:javascript
复制
 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人的球队,其中至少有1名球员来自所有5个角色,不超过3名球员来自同一支球队,工资加起来不到50名。

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

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

每支球队不超过两名球员,每个职位中至少有一名球员,工资总额不超过36名。

我一直试图实现一个公式,通过所有的~6毫米组合逐步使用包iterpc,查找和计算每个步骤的工资/团队号码。这让我在每一步都能把所有的东西都放进内存中,但是速度非常慢,效率很低--这相当于创建每一个可能的团队,并连续地应用规则。

任何替代的方法都会很棒!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-22 20:12:19

安装加起来七个最低收入的球员,你得到28.这意味着任何一个工资超过22的人都不能加入球队。

代码语言:javascript
复制
pool <- subset(player_pool,salary<=22)

从这里寻找combos,我会选择显而易见的方法,而不是寻找效率:

  1. 识别所有的行组合 rs <- combn(seq(nrow(池)),8)
  2. 试验条件 good_rs <- with(池,应用(rs,2,函数(X){ sum(salaryx) <= 50 &length(唯一(位置) == 5 && max(长度(拆分(x,teamx x) <= 3 }))

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

代码语言:javascript
复制
length(which(good_rs))
# [1] 339
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31572497

复制
相关文章

相似问题

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