基于无重复组队规则的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
相关产品推荐
相关产品推荐

