Ich bin ein Tutor für Laborpraktiken an der Universität, basierend auf den Kommentaren der Studenten aus dem letzten Jahr, die wir, mein Chef und ich, ansprechen wollten. Mein Chef hat sich entschieden, ein C-Skript zu schreiben, und ich habe Python (Python-Einschränkung) ausgewählt, um unser Problem zu lösen.
Informationen
- Es gibt 6 Sitzungen
- Es gibt 4 Rollen
- Es gibt 6 Übungen
- Es gibt 32 Studenten
- Es gibt 4 Studenten pro Team
Problem :
Weisen Sie jedem Schüler 4 Rollen in 4 Übungen in 4 verschiedenen Sitzungen zu.
Einschränkungen:
- Die Schüler sollten einmal eine Rolle spielen
- Die Schüler sollten 4 von 6 verschiedenen Übungen machen
- Die Schüler sollten nur eine Übung pro Sitzung machen
- Der Schüler sollte denselben Partner nur einmal treffen
Vorlagen:
Hier ist die Vorlage, die ich für Schüler empfinde, bei der jedes Team aus 4 Schülern besteht. Den Positionen [0, 1, 2 oder 3] sind Rollen zugewiesen. Jede verfügbare Position ist von 1 bis 128 nummeriert
[# Semester
[ # Session
[ # Practice/Team
1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]],
[[25, 26, 27, 28],
[29, 30, 31, 32],
[33, 34, 35, 36],
[37, 38, 39, 40],
[41, 42, 43, 44],
[45, 46, 47, 48]],
[[49, 50, 51, 52],
[53, 54, 55, 56],
[57, 58, 59, 60],
[61, 62, 63, 64],
[65, 66, 67, 68],
[69, 70, 71, 72]],
[[73, 74, 75, 76],
[77, 78, 79, 80],
[81, 82, 83, 84],
[85, 86, 87, 88],
[89, 90, 91, 92],
[93, 94, 95, 96]],
[[97, 98, 99, 100],
[101, 102, 103, 104],
[105, 106, 107, 108],
[109, 110, 111, 112]],
[[113, 114, 115, 116],
[117, 118, 119, 120],
[121, 122, 123, 124],
[125, 126, 127, 128]]]
Mit anderen Worten :
Dies ist eine Sitzung:
[[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]],
Diese Teams machen die gleiche Übung:
[
[1, 2, 3, 4],
[25, 26, 27, 28],
[49, 50, 51, 52],
[73, 74, 75, 76],
[97, 98, 99, 100],
[113, 114, 115, 116]
]
Diese Positionen spielen die gleiche Rolle:
[
1,
5,
9,
13,
17,
21,
25,
...
]
Was ich bisher habe:
Mit Python-Constraint konnte ich die ersten drei Constraints validieren:
Valid solution : False
- sessions : [True, True, True, True, True, True]
- practices : [True, True, True, True, True, True]
- roles : [True, True, True, True]
- teams : [False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False]
Für diejenigen, die interessant sein mögen, mag ich einfach Folgendes:
Für jede Bedingung verwende ich AllDifferentConstraint . Zum Beispiel mache ich für eine Sitzung:
problem.addConstraint(AllDifferentConstraint(), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])
Ich bin nicht in der Lage, das Team einzuschränken. Mein letzter Versuch im Großen und Ganzen semester
war folgender:
def team_constraint(self, *semester):
students = defaultdict(list)
# get back each teams based on the format [# Semester [ #Session [# Practice/Team ...
teams = [list(semester[i:i+4]) for i in range(0, len(semester), 4)]
# Update Students dict with all mate they work with
for team in teams:
for student in team:
students[student] += [s for s in team if s != student]
# Compute for each student if they meet someone more than once
dupli = []
for student, mate in students.items():
dupli.append(len(mate) - len(set(mate)))
# Loosly constraint, if a student meet somone 0 or one time it's find
if max(dupli) >= 2:
print("Mate encounter more than one time", dupli, min(dupli) ,max(dupli))
return False
pprint(students)
return True
Fragen :
- Kann ich für die Teambedingungen tun, was ich will? Ich meine, ich habe keine Ahnung, ob es möglich ist, jedem Schüler 12 Partner zuzuweisen, und jeder von ihnen trifft denselben Partner nur einmal.
- Habe ich für die Teambeschränkung einen performanteren Algorithmus verpasst?
- Irgendeine Pistole, der ich folgen kann?
(4, 4)
anstatt(4, 6)
wie die anderen?