【发布时间】:2020-11-03 15:07:42
【问题描述】:
我正在尝试为我的课程制定时间表。 我有38个学生。我将在 11 (5+6) 次(BES 和 PBL)上见到他们。
对于每个场合,它们被随机分为 8 组,从而产生 6 组 5 和 2 组 4。
对于每个场合,我都想选择一名学生来领导该小组——一位领导者。理想情况下,我希望每个学生都成为一个小组的负责人。
我最多通过以下方式获得36个独特的领导者。 有没有办法在 R 中运行优化,以便我想要一个最大化唯一领导者数量的目标函数?我的猜测是,目前的限制是随机抽样分组的方式。
set.seed(13)
studentlist <- data.frame(Name=as.character(c(paste0("A",seq(1:38)))))
studentlist$PBL1 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist$PBL2 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist$PBL3 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist$PBL4 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist$PBL5 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist$BES1 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist$BES2 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist$BES3 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist$BES4 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist$BES5 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist$BES6 <- sample(factor(rep(1:8, length.out=nrow(studentlist)),
labels=paste0(1:8)))
studentlist <- as.data.frame(studentlist)
BES_leaders <- studentlist %>% select(Name, BES1:BES6) %>% pivot_longer(cols = "BES1":"BES6",names_to = "Occassion",values_to = "Group")
#initiate i to count set.seed
i <- 1
#initialise best solution
BES_leaders3 <- data.frame()
while(length(unique(BES_leaders2$Leader))<=36) {
set.seed(i)
return.i <- i
BES_leaders_2 <- BES_leaders %>% nest_by(Occassion,Group) %>% mutate(Leader= sample(c(data$Name),1,replace = FALSE)) %>% select(Occassion,Group,Leader)
BES_leaders2 <- as.data.frame(BES_leaders_2)
BES_leaders3 <- if(length(unique(BES_leaders2$Leader)) > length(unique(BES_leaders3$Leader))){BES_leaders2} else {BES_leaders3}
i <- i+1
print(length(unique(BES_leaders3$Leader)))
}
【问题讨论】:
-
不清楚你想要什么,你的数据代表什么。 IE。什么是场合,什么是领导者?您是否为每个场合随机生成学生集群?您的问题确实读起来像带有边约束的优化分配问题。 IE。谁被分配到什么的限制。这些问题可以在 R 中使用整数编程来解决。有软件包可以做到这一点。也许你可以为你的问题定义增加一些清晰度。
-
@SteveM 为了清晰起见,我进行了编辑。现在读起来更好了吗?
-
看起来你有 6 组 x 11 次 = 66 组。那么,为什么不将 38 名学生一次分配给 66 个小组中的 38 个作为领导,然后将剩余的 37 名学生随机分配给分配领导的小组,而所有 38 名学生的领导是谁并不重要?
-
以上更正。我看到创建的不是 6 个而是 8 个组,所以总共 88 个组。因此,如果您有 38 名学生,您可以将每个学生指定为两次领导,即 88 项特定领导分配中的 76 项。
-
@SteveM,您能否在回答问题时提供一个示例,以便我将其标记为可能的解决方案?
标签: r optimization while-loop dplyr sampling