У меня действительно ужасный код, который занимает ДЛИННОЕ время для запуска.Сначала, если составлен список поддельных курсов колледжа:
library(tidyverse)
library(lubridate)
library(gtools)
rm(list = ls())
course_subjects<-c("Math", "English", "History","Writing","Engineering","Chemistry","Biology","Business","Physics","Economics","Music","Art")
course_numbers<-sprintf("%04d",seq(900,2050,by = 15))
course.offerings<-expand.grid("course_subject" = course_subjects,
"course_number" = course_numbers)%>%
mutate(course = paste0(course_subject,"-",course_number),# specify the course name
offerings = ceiling(8.75*rchisq(length(course_numbers)*length(course_subjects),0.0001,3)+1))%>%#randomly assign the number of sections, assume the distribution of number of sections offered is skewed right
dplyr::select(course,
offerings)
rm(course_subjects)
rm(course_numbers)
, затем создайте коды для доступных аудиторий в 10 кампусах, обозначенных буквами, и с 20 комнатами на кампус
lecture.halls<-expand.grid("campus" = LETTERS[1:10],
"classroom" = sprintf("%03d",seq(1,20,by = 1)))%>%
mutate(lecture_hall = paste0(campus,classroom))%>%
dplyr::select(lecture_hall)
Одинпоследний шаг перед запуском реального кода -f * ckery.Сделайте так, чтобы количество разделов, предлагаемых для каждого из этих курсов, было несколько искажено, чтобы у вас были действительно популярные классы, которым нужно много разделов и курсов, в которых не так много предлагаемых разделов, и создавайте уникальные идентификаторы разделов.
expanded.offerings<-as.data.frame(course.offerings[rep(row.names(course.offerings), course.offerings$offerings),])%>%
group_by(course)%>%
mutate(section = paste0(course,"-",sprintf("%03d",row_number(course))))%>%
ungroup()%>%
dplyr::select(section)
Как и было обещано, в этом разделе я чувствую, что делаю что-то очень глупое.Я использую цикл for для перехода один за другим и заполняю первый, второй, третий, четвертый, пятый, шестой и седьмой временные блоки, доступные для каждого дня недели, и удаляю строки из набора данных предложения курса, которые я пробую, чтобычтобы быть уверенным, что если я буду преподавать один и тот же курс в одном классе в день, они будут, по крайней мере, в разных секциях, и иллюзия выборки из реального каталога курсов может продолжаться.Я знаю, что если бы я знал больше о функциях отображения, это, вероятно, было бы быстрее и эффективнее, мне просто нужен способ заполнить матрицу путем выборки из 1-го списка.Примечание: я выбрал цикл for, потому что хочу создать некоторую сложность с генерацией данных, чтобы я мог составлять расписания, которые бы учитывали курсы с различными атрибутами, такими как количество дней в неделю, продолжительность занятий и т. Д. ...
В любом случае, цикл for, который генерирует данные, которые выглядят примерно так, как я собираюсь, ниже
for(i in 1:nrow(lecture.halls)){
#MONDAY COURSES
mon1.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$mon1[i]<-expanded.offerings[mon1.remove.this.row,1]
expanded.offerings<-expanded.offerings[-mon1.remove.this.row,]
mon2.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$mon2[i]<-expanded.offerings[mon2.remove.this.row,1]
expanded.offerings<-expanded.offerings[-mon2.remove.this.row,]
mon3.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$mon3[i]<-expanded.offerings[mon3.remove.this.row,1]
expanded.offerings<-expanded.offerings[-mon3.remove.this.row,]
mon4.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$mon4[i]<-expanded.offerings[mon4.remove.this.row,1]
expanded.offerings<-expanded.offerings[-mon4.remove.this.row,]
mon5.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$mon5[i]<-expanded.offerings[mon5.remove.this.row,1]
expanded.offerings<-expanded.offerings[-mon5.remove.this.row,]
mon6.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$mon6[i]<-expanded.offerings[mon6.remove.this.row,1]
expanded.offerings<-expanded.offerings[-mon6.remove.this.row,]
mon7.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$mon7[i]<-expanded.offerings[mon7.remove.this.row,1]
expanded.offerings<-expanded.offerings[-mon7.remove.this.row,]
#TUESDAY COURSES
tues1.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$tues1[i]<-expanded.offerings[tues1.remove.this.row,1]
expanded.offerings<-expanded.offerings[-tues1.remove.this.row,]
tues2.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$tues2[i]<-expanded.offerings[tues2.remove.this.row,1]
expanded.offerings<-expanded.offerings[-tues2.remove.this.row,]
tues3.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$tues3[i]<-expanded.offerings[tues3.remove.this.row,1]
expanded.offerings<-expanded.offerings[-tues3.remove.this.row,]
tues4.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$tues4[i]<-expanded.offerings[tues4.remove.this.row,1]
expanded.offerings<-expanded.offerings[-tues4.remove.this.row,]
tues5.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$tues5[i]<-expanded.offerings[tues5.remove.this.row,1]
expanded.offerings<-expanded.offerings[-tues5.remove.this.row,]
tues6.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$tues6[i]<-expanded.offerings[tues6.remove.this.row,1]
expanded.offerings<-expanded.offerings[-tues6.remove.this.row,]
tues7.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$tues7[i]<-expanded.offerings[tues7.remove.this.row,1]
expanded.offerings<-expanded.offerings[-tues7.remove.this.row,]
#WEDNESDAY COURSES
wed1.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$wed1[i]<-expanded.offerings[wed1.remove.this.row,1]
expanded.offerings<-expanded.offerings[-wed1.remove.this.row,]
wed2.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$wed2[i]<-expanded.offerings[wed2.remove.this.row,1]
expanded.offerings<-expanded.offerings[-wed2.remove.this.row,]
wed3.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$wed3[i]<-expanded.offerings[wed3.remove.this.row,1]
expanded.offerings<-expanded.offerings[-wed3.remove.this.row,]
wed4.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$wed4[i]<-expanded.offerings[wed4.remove.this.row,1]
expanded.offerings<-expanded.offerings[-wed4.remove.this.row,]
wed5.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$wed5[i]<-expanded.offerings[wed5.remove.this.row,1]
expanded.offerings<-expanded.offerings[-wed5.remove.this.row,]
wed6.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$wed6[i]<-expanded.offerings[wed6.remove.this.row,1]
expanded.offerings<-expanded.offerings[-wed6.remove.this.row,]
wed7.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$wed7[i]<-expanded.offerings[wed7.remove.this.row,1]
expanded.offerings<-expanded.offerings[-wed7.remove.this.row,]
#THURSDAY COURSES
thu1.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$thu1[i]<-expanded.offerings[thu1.remove.this.row,1]
expanded.offerings<-expanded.offerings[-thu1.remove.this.row,]
thu2.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$thu2[i]<-expanded.offerings[thu2.remove.this.row,1]
expanded.offerings<-expanded.offerings[-thu2.remove.this.row,]
thu3.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$thu3[i]<-expanded.offerings[thu3.remove.this.row,1]
expanded.offerings<-expanded.offerings[-thu3.remove.this.row,]
thu4.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$thu4[i]<-expanded.offerings[thu4.remove.this.row,1]
expanded.offerings<-expanded.offerings[-thu4.remove.this.row,]
thu5.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$thu5[i]<-expanded.offerings[thu5.remove.this.row,1]
expanded.offerings<-expanded.offerings[-thu5.remove.this.row,]
thu6.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$thu6[i]<-expanded.offerings[thu6.remove.this.row,1]
expanded.offerings<-expanded.offerings[-thu6.remove.this.row,]
thu7.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$thu7[i]<-expanded.offerings[thu7.remove.this.row,1]
expanded.offerings<-expanded.offerings[-thu7.remove.this.row,]
#FRIDAY COURSES
fri1.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$fri1[i]<-expanded.offerings[fri1.remove.this.row,1]
expanded.offerings<-expanded.offerings[-fri1.remove.this.row,]
fri2.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$fri2[i]<-expanded.offerings[fri2.remove.this.row,1]
expanded.offerings<-expanded.offerings[-fri2.remove.this.row,]
fri3.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$fri3[i]<-expanded.offerings[fri3.remove.this.row,1]
expanded.offerings<-expanded.offerings[-fri3.remove.this.row,]
fri4.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$fri4[i]<-expanded.offerings[fri4.remove.this.row,1]
expanded.offerings<-expanded.offerings[-fri4.remove.this.row,]
fri5.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$fri5[i]<-expanded.offerings[fri5.remove.this.row,1]
expanded.offerings<-expanded.offerings[-fri5.remove.this.row,]
fri6.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$fri6[i]<-expanded.offerings[fri6.remove.this.row,1]
expanded.offerings<-expanded.offerings[-fri6.remove.this.row,]
fri7.remove.this.row<-sample(1:nrow(expanded.offerings),1,replace = F)
lecture.halls$fri7[i]<-expanded.offerings[fri7.remove.this.row,1]
expanded.offerings<-expanded.offerings[-fri7.remove.this.row,]
}
rm(list = ls.str(mode = 'numeric'))
Любая помощь в повышении эффективности этого кода или идеи о том, как выполнить построение расписанияБыло бы очень полезно, если бы он мог работать с 3 секционными заседаниями (в одном и том же лекционном зале в одно и то же время дня, но в разные дни недели) и / или позволять различным курсам иметь разную продолжительность лекций.Снова извините за безобразие