You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于无重复组队规则的R语言分组代码优化及验证需求

31名学生多轮无重复组队的R语言实现与验证

核心需求

  • 31名学生,每轮分为8组(7组4人、1组3人)
  • 连续进行3轮分组,学生不得与之前组队过的同学同组

优化后的R代码实现

初始化数据与核心分组函数

# 生成31名学生的ID列表
students <- paste0("S", 1:31)

# 初始化组队历史:每个学生对应一个列表,存储已组队过的同学
init_history <- function(students) {
  setNames(vector("list", length(students)), students)
}

# 生成符合规则的单轮分组
generate_valid_groups <- function(students, history, group_sizes = c(rep(4,7), 3)) {
  remaining <- students
  groups <- list()
  
  for (size in group_sizes) {
    if (length(remaining) == size) {
      groups[[length(groups)+1]] <- remaining
      break
    }
    
    # 循环尝试生成符合要求的小组
    valid_group <- NULL
    while (is.null(valid_group)) {
      # 随机选第一个成员,缩小可选范围
      first <- sample(remaining, 1)
      # 筛选未与first组过队的剩余学生
      eligible <- setdiff(remaining, c(first, history[[first]]))
      
      # 可选人数足够时,凑齐小组
      if (length(eligible) >= size - 1) {
        others <- sample(eligible, size - 1)
        valid_group <- c(first, others)
      }
    }
    
    # 更新组队历史:组内成员互相添加到对方的历史列表
    for (member in valid_group) {
      history[[member]] <- unique(c(history[[member]], setdiff(valid_group, member)))
    }
    
    remaining <- setdiff(remaining, valid_group)
    groups[[length(groups)+1]] <- valid_group
  }
  
  list(groups = groups, updated_history = history)
}

执行3轮分组

# 初始化历史记录
current_history <- init_history(students)
all_round_groups <- list()

# 循环生成3轮分组
for (round in 1:3) {
  result <- generate_valid_groups(students, current_history)
  all_round_groups[[round]] <- result$groups
  current_history <- result$updated_history
  cat("第", round, "轮分组完成\n")
}

# 查看每轮分组结果(可选)
for (i in 1:3) {
  cat("\n=== 第", i, "轮分组 ===\n")
  for (j in 1:8) {
    cat("组", j, ":", paste(all_round_groups[[i]][[j]], collapse = ", "), "\n")
  }
}

分组有效性验证方法

1. 自动验证代码

用代码批量检查所有轮次的分组是否符合规则:

validate_all_rounds <- function(all_rounds, students) {
  global_history <- init_history(students)
  is_valid <- TRUE
  
  for (round_idx in 1:length(all_rounds)) {
    groups <- all_rounds[[round_idx]]
    for (group in groups) {
      # 检查组内是否有重复组队的情况
      for (member in group) {
        forbidden_teammates <- global_history[[member]]
        overlap <- intersect(group, forbidden_teammates)
        if (length(overlap) > 0) {
          cat("⚠️ 违规:第", round_idx, "轮中,学生", member, "与", paste(overlap, collapse = "、"), "重复组队\n")
          is_valid <- FALSE
        }
      }
      # 更新全局组队历史
      for (member in group) {
        global_history[[member]] <- unique(c(global_history[[member]], setdiff(group, member)))
      }
    }
    # 检查该轮分组人数是否符合要求
    group_sizes <- sapply(groups, length)
    if (!identical(sort(group_sizes), sort(c(rep(4,7), 3)))) {
      cat("⚠️ 违规:第", round_idx, "轮分组人数不符合要求\n")
      is_valid <- FALSE
    }
  }
  
  if (is_valid) {
    cat("✅ 所有轮次分组均符合规则\n")
  }
  return(is_valid)
}

# 执行验证
validate_all_rounds(all_round_groups, students)

2. 手动验证要点

  • 随机选取3-5名学生,逐一核对他们在3轮中的所有队友,确认无重复名字
  • 检查每轮分组的总人数:所有组人数相加必须等于31
  • 确认每轮分组中,7组为4人、1组为3人,人数结构正确

内容的提问来源于stack exchange,提问作者Tathagato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:23:34