From f12a3e55edf68ec19d1342b93e6407fe0014f1f8 Mon Sep 17 00:00:00 2001 From: Alexander Leonhardt Date: Tue, 13 May 2025 08:27:58 +0200 Subject: feat: Added the optimal student---topic assignment script --- assignment.py | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100755 assignment.py (limited to 'assignment.py') diff --git a/assignment.py b/assignment.py new file mode 100755 index 0000000..61f7d62 --- /dev/null +++ b/assignment.py @@ -0,0 +1,145 @@ +#!/bin/python +import glpk +import os +import re +import toml +import sys +import math +import random + +random.seed(1409) +# 1 input parameter, the input filename + +if len(sys.argv) < 2: + print("Usage: assignment.py ") + sys.exit(-1) + +with open(sys.argv[1]) as f: + tm = toml.load(f) + +if not ("students" in tm): + print(f"Missing table students with preferences in {sys.argv[1]}, e.g.\n[students]\n# Student a@abc.de preferes topic 2 over 6 over 4.\n\"a@abc.de\": [2,6,4]") + sys.exit(-1) + +students = tm['students'] +print("#Students = ",len(students)) +m = 0 +mlen = 0 +for s in students.keys(): + m = max(m,max(students[s])+1) + mlen = max(mlen, len(students[s])-1) + +topics = [x for x in range(0,m)] + +interest_decay = lambda x,y: x/math.pow(2,y) +factor = math.pow(2,mlen) +function="exponential" +if "settings" in tm: + if "interest_decay" in tm["settings"]: + if tm["settings"]["interest_decay"] == "lin": + interest_decay = lambda x,y: x-y + factor = mlen+1 + function="linear" + + +lp = glpk.LPX() +lp.name = 'assignment' +lp.obj.maximize = True +lp.rows.add(len(students)+len(topics)) +objective=[] +constraints=[] +for idx,(s,r) in enumerate(zip(students.keys(),lp.rows[:len(students)])): + r.name = 'student %s' % s + # Each student gets exactly one topic + r.bounds = 1.0,1.0 + last = 0 + beg = 0 + while beg