Een groep van $$N$$ studenten zoekt een stageplaats bij $$N$$ bedrijven (elk bedrijf biedt dus 1 stageplaats aan, en gelukkig zijn er evenveel stageplaatsen als er studenten zijn). Om stageplaatsen op een zinvolle manier toe te kennen, geven studenten hun voorkeur voor bedrijven aan, en omgekeerd geven ook bedrijven hun voorkeur aan voor studenten. Deze voorkeur wordt voorgesteld door een natuurlijk getal, nl. tussen 1 en N (grenzen inbegrepen). De hoogste voorkeur krijgt hierbij 1, de laagste voorkeur wordt door het getal N voorgesteld.

De studenten worden in een lijst geordend (en krijgen dus een rangnummer tussen 0 en N-1 (grenzen inbegrepen)), en analoog worden de bedrijven via een lijst geordend (en elk bedrijf krijgt dus ook een rangnummer tussen 0 en N-1 (grenzen inbegrepen)). De voorkeur van de studenten wordt weergegeven in een lijst $$s$$ van $$N$$ lijsten, met elk $$N$$ gehele getallen (elk getal 1 t.e.m. N komt voor, er zijn geen ex aequo's), en analoog voor de voorkeur van de bedrijven, voorgesteld door de lijst $$b$$. Op die manier geeft de variabele $$s[i][j]$$ de voorkeur van student $$i$$ aan voor bedrijf $$j$$, en geeft de variabele $$b[i][j]$$ de voorkeur aan van bedrijf $$i$$ voor student $$j$$.

Een toekenning van studenten aan bedrijven, zullen we voorstellen via een woordenboek $$w$$. De sleutel in dit woordenboek is een rangnummer van een bedrijf (dus een natuurlijk getal tussen 0 en N-1 (grenzen inbegrepen)) en de bijhorende waarde is het rangnummer van de toegewezen student (opnieuw een natuurlijk getal tussen 0 en N-1 (grenzen inbegrepen)).

Klasse StageBeheer

Programmeer in deze klasse het volgende:

Voorbeeld

sb = StageBeheer([[4, 5, 2, 1, 3], [2, 1, 5, 3, 4], [5, 2, 4, 1, 3], [1, 5, 3, 4, 2], [4, 3, 1, 2, 5]], [[3, 5, 1, 4, 2], [3, 5, 1, 4, 2], [4, 3, 5, 2, 1], [4, 5, 3, 1, 2], [1, 4, 2, 5, 3]])
print(sb.beste_bedrijf(3)) #0
print(sb.beste_bedrijf(2)) #3
print(sb.beste_student(2)) #4
print(sb.beste_student(4)) #0
print(sb.geldige_toekenning({0: 0, 1: 3, 2: 4, 3: 2, 4: 1})) #True
print(sb.geldige_toekenning({0: 6, 1: 3, 2: 4, 3: 0})) #False
print(sb.score_toekenning_bedrijf({0: 0, 1: 3, 2: 4, 3: 2, 4: 1})) #15
print(sb.score_toekenning_bedrijf({0: 6, 1: 3, 2: 4, 3: 0})) #-1
print(sb.score_toekenning_student({0: 0, 1: 3, 2: 4, 3: 2, 4: 1})) #15
print(sb.score_toekenning_student({0: 6, 1: 3, 2: 4, 3: 0})) #-1

Elk van onderstaande klassen beschikt over de methode toekenning() met als enig argument een object van de klasse stageBeheer. Het resultaat van de methode is een woordenboek dat een gevonden toekenning voorstelt. De tekst hieronder beschrijft telkens de te volgen strategie bij het genereren van oplossingen voor het toekenningsprobleem.

Klasse DefaultZoeker

Het resultaat komt tot stand door aan het bedrijf met rangnummer $$i$$ student met rangnummer $$i$$ toe te kennen.

Klasse GulzigBedrijfZoeker

Loop alle bedrijven af in de volgorde waarin ze in de lijst van voorkeuren voorkomen. Kies voor elk bedrijf de meest geschikte student, die nog geen bedrijf toegewezen kreeg.

Klasse GulzigStudentZoeker

Loop alle studenten af in de volgorde waarin ze in de lijst van voorkeuren voorkomen. Koppel aan elke student het meest geschikte bedrijf, dat nog geen stagiair toegewezen kreeg.

Voorbeeld

sb = StageBeheer([[6, 3, 2, 5, 4, 1], [2, 4, 5, 1, 3, 6], [4, 2, 6, 3, 1, 5], [2, 3, 5, 6, 1, 4], [1, 2, 3, 5, 4, 6], [3, 1, 2, 6, 4, 5]], [[2, 4, 3, 5, 1, 6], [1, 2, 5, 3, 4, 6], [5, 1, 2, 6, 3, 4], [6, 2, 1, 5, 4, 3], [4, 5, 2, 1, 6, 3], [6, 4, 3, 1, 5, 2]])
sb.zoek_toekenning(DefaultZoeker()) #{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
sb.zoek_toekenning(GulzigBedrijfZoeker()) #{0: 4, 1: 0, 2: 1, 3: 2, 4: 3, 5: 5}
sb.zoek_toekenning(GulzigStudentZoeker()) #{0: 3, 1: 4, 2: 5, 3: 1, 4: 2, 5: 0}

Klasse StabieleToekenningZoeker

Voorbeeld

sb = StageBeheer([[3, 2, 4, 1], [4, 2, 3, 1], [4, 3, 2, 1], [3, 2, 4, 1]], [[1, 3, 4, 2], [2, 3, 4, 1], [1, 3, 2, 4], [2, 1, 3, 4]])
sb.zoek_toekenning(StabieleToekenningZoeker()) #{0: 0, 1: 3, 2: 2, 3: 1}