#!/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