work on step 6

This commit is contained in:
SowinskiBraeden committed 2022-05-02 12:57:39 -07:00
1 parent ffa58fd85b
commit fa1f6648a5
2 files changed
+46 -14

No files matched your search

+45 -13
View File
@@ -60,7 +60,14 @@ running = {
# It starts by trying to get all classes full and give all students a full class list. # It starts by trying to get all classes full and give all students a full class list.
# Then it starts to attempt to fit all classes into a timetable, making corretions along # Then it starts to attempt to fit all classes into a timetable, making corretions along
# the way. Corrections being moving a students class # the way. Corrections being moving a students class
def generateScheduleV3(students: list, courses: dict, blockClassLimit: int=40, studentsDir: str="../output/students.json") -> dict[str, dict]: def generateScheduleV3(
students: list,
courses: dict,
blockClassLimit: int=40,
studentsDir: str="../output/students.json",
conflictsDir: str="../output/conflicts.json"
) -> dict[str, dict]:
def equal(l): # Used to equalize list of numbers def equal(l): # Used to equalize list of numbers
q,r = divmod(sum(l),len(l)) q,r = divmod(sum(l),len(l))
return [q+1]*r + [q]*(len(l)-r) return [q+1]*r + [q]*(len(l)-r)
@@ -332,28 +339,29 @@ def generateScheduleV3(students: list, courses: dict, blockClassLimit: int=40, s
for student in running[block][cname]["students"]: for student in running[block][cname]["students"]:
students[student["index"]]["schedule"][block].append(cname) students[student["index"]]["schedule"][block].append(cname)
with open(studentsDir, "w") as outfile:
json.dump(students, outfile, indent=2)
# Step 6 - Evaluate, move students to fix # Step 6 - Evaluate, move students to fix
conflicts = []
for student in students: for student in students:
blocks = [student["schedule"][block] for block in student["schedule"]] blocks = [student["schedule"][block] for block in student["schedule"]]
final = list(block) origin = list(block)
exceptions = [] exceptions = []
count, conflicts = 0, True count, hasConflict = 0, True
while conflicts: while hasConflict:
count = sum(1 for b in blocks if len(b)==1) count = sum(1 for b in blocks if len(b)==1)
if count < student["expectedClasses"]: if count < student["expectedClasses"]:
blockLens = [len(block) for block in blocks]
# Get clash
index = None index = None
# Attempt to fix
if len(exceptions) > 0: if len(exceptions) > 0:
blocks = [elem for i, elem in enumerate(blocks) if i not in exceptions] blocks = [elem for i, elem in enumerate(blocks) if i not in exceptions]
for index in exceptions: blocks.insert(index, ['exception']) for index in exceptions: blocks.insert(index, ['nil'])
elif len(exceptions) == 0: elif len(exceptions) == 0:
index = blockLens.index(max(blockLens)) index = blockLens.index(max(blockLens))
blockLens = [len(block) for block in blocks]
blockOut = f"block{index+1}" blockOut = f"block{index+1}"
done = False done = False
moveIndex = 0 moveIndex = 0
@@ -392,11 +400,35 @@ def generateScheduleV3(students: list, courses: dict, blockClassLimit: int=40, s
break break
elif count == student["expectedClasses"]: elif count == student["expectedClasses"]:
conflicts = False if len(exceptions) > 0:
elif count > student["expectedClasses"]: for i in range(len(exceptions)):
print("Impossible error") blocks[i] = origin[i]
break # for debug conflicts.append({
"Pupil #": student["Pupil #"],
"Email": "",
"Conflict": "More than one class per block"
})
hasConflict = False
elif count > student["expectedClasses"]:
conflicts.append({
"Pupil #": student["Pupil #"],
"Email": "",
"Conflict": "More classes than expected"
})
hasConflict = False
# Update Student Schedule
student["schedule"] = blocks
# Update Student records
with open(studentsDir, "w") as outfile:
json.dump(students, outfile, indent=2)
# Log Conflict to records
with open(conflictsDir, "w") as outfile:
json.dump(conflicts, outfile, indent=2)
return running return running
+1 -1
View File
@@ -43,7 +43,7 @@ if __name__ == '__main__':
samplemockCourses = getSampleCourses("./sample_data/course_selection_data.csv", True) samplemockCourses = getSampleCourses("./sample_data/course_selection_data.csv", True)
timetable = {} timetable = {}
timetable["Version"] = 3 timetable["Version"] = 3
timetable["timetable"] = generateScheduleV3(sampleStudents, samplemockCourses, 40, "./output/students.json") timetable["timetable"] = generateScheduleV3(sampleStudents, samplemockCourses, 40, "./output/students.json", "./output/conflicts.json")
else: else:
print("Invalid argument") print("Invalid argument")