Javascript 在没有重复项的锦标赛中为玩家查找所有组合

Javascript 在没有重复项的锦标赛中为玩家查找所有组合,javascript,algorithm,math,Javascript,Algorithm,Math,对于桌上足球比赛,我有以下要求: 有两种类型的球员A(学生)和B(教师)。(为了简单起见,我们假设A和B玩家的数量相同)。16名学生和16名教师 桌上足球赛应该有尽可能多的回合 一轮意味着:每名球员与一名队友一起与另外两名球员进行一场比赛 每轮比赛,一名球员都需要一名以前从未共事过的队友。“新”玩家 队友必须是不同类型的(学生总是和老师一起玩) 来自对方球队的每个球员也必须是“新球员”(既不是以前的对手,也不是以前的队友) 例如: 我是一名学生(a型球员),与老师T_John(B型球员)作为

对于桌上足球比赛,我有以下要求:

  • 有两种类型的球员A(学生)和B(教师)。(为了简单起见,我们假设A和B玩家的数量相同)。16名学生和16名教师
  • 桌上足球赛应该有尽可能多的回合
  • 一轮意味着:每名球员与一名队友一起与另外两名球员进行一场比赛
  • 每轮比赛,一名球员都需要一名以前从未共事过的队友。“新”玩家
  • 队友必须是不同类型的(学生总是和老师一起玩)
  • 来自对方球队的每个球员也必须是“新球员”(既不是以前的对手,也不是以前的队友)
例如: 我是一名学生(a型球员),与老师T_John(B型球员)作为队友进行了一场比赛。我们和一个学生S_Mike和一个老师T_James比赛。比赛结束后,新一轮比赛开始。在新的一轮(以及所有即将到来的回合)中,我不应该再以队友或对手的身份与(或对抗)杜约翰、杜詹姆斯或S-Mike比赛

我们的想法是在比赛期间结识尽可能多的新人

我创建了第一个原型,每个玩家都有一个他以前从未玩过(或对抗过)的所有玩家的列表。对于每场比赛,我现在从所有球员的列表开始,并为每个球员选择下一个合适的球员作为队友和两个对手。虽然这是可行的,但组合非常有限。我不知道如何获得更好和一致的结果

以下是玩家类中的主要例程:

for (var i = 0; i < availablePlayers.length; i++) {
    var player = availablePlayers[i];
    if (player == this || player.hasPlayedWith(this))
        continue;

    if (!teamMate && player.type != this.type &&
          (!opponent1 || !player.hasPlayedWith(opponent1))) {
        teamMate = player;
        count++;
    }
    else if (!opponent1 && (!teamMate || !player.hasPlayedWith(teamMate))) {
        opponent1 = player;
        count++;
    }
    else if (opponent1 && !opponent2 &&
         player.type != opponent1.type &&
         !player.hasPlayedWith(opponent1)) {
       opponent2 = player;
       count++;
    }
    if (count == 3) {
        return [
          new Team(this, teamMate),
          new Team(opponent1, opponent2)
        ];
    }
}
for(var i=0;i
这里是一个小提琴与整个原型,可视化的球员,球队,比赛和回合。

我很确定一定有某种模式或算法来计算最佳组合。想法还是建议


非常感谢您的帮助。

请更新这些规则,因为虽然知道此算法的人知道您在说什么,但您对它的描述不够清楚=)第2点没有解释地谈论“锦标赛”,第3点的“随机或定义逻辑”不是“或”。您的算法可以规定使用随机,使随机行为成为定义的逻辑。第4点需要改写,第5点毫无意义:两支球队都是对立的球队。不,这不是吹毛求疵:当你描述一个算法时,你需要的技能之一就是能够准确地描述需求。你说有A型和B型,所以听起来好像有两支对立的A队和B队永远不会改变。但从你的第5点来看,听起来球员们可以从队伍中交换球队,“既不是以前的对手,也不是以前的队友”。请澄清这一点,感谢迈克·波马克斯·卡默曼和肯塔的支持。我已经更新了我的问题。希望它更容易理解。@KentaNomoto感谢您的反馈。不,每个队由一名a型球员(学生)和一名B型球员(教师)组成。我希望新的解释能清楚地说明这一点。我不知道我是否会尝试这样做,只是一个提示:生成所有有效的双打(如网球),每个生成的双打都会考虑以前生成的双打。从S中得到一组S。生成所有可能的轮,以便每轮C|S | ^8,每轮为一个节点,如果两轮中没有双精度,则将轮链接在一起。那就把最大的集团从中除掉