Untitled
unknown
plain_text
10 months ago
3.8 kB
3
Indexable
def gale_shapley_algorithmus(studis, plätze): # Aufgabe I1 - Vergabe von Praktikumsplätzen
matches = {} # hier aktuellen Matches speichern
freie_studis = list(studis.keys()) # Liste der freien Studierenden; keys() nutzen, damit die Keys (hier: die jeweiligen Studierende) aus Dictionary (studis) zurückgegeben werden
freie_plätze = {platz: None for platz in plätze} # None -> da Beginn alle Plätze frei sind
studis_präferenzen = {stud: list(prefs) for stud, prefs in studis.items()} # für jeden Studi Listen-Kopie machen, damit Originalliste nicht geändert wird
platz_präferenzen = {platz: list(prefs) for platz, prefs in plätze.items()} # gleiches für die Plätze
iteration = 0
while freie_studis: # solange noch freie Studis da sind..
iteration += 1 # Iteration erhöhen
print(f"Iteration {iteration}") # Ausgabe der Iteration-Nummer
for stud in sorted(freie_studis): # durch Studierende gehen in alphabetischer Reihenfolge, mittels sorted
if len(studis_präferenzen[stud]) == 0: # Überprüfen, ob der Studierende keine weiteren Plätze mehr anfragt
print(f"Studierender {stud} hat alle Plätze abgearbeitet.")
continue # Wenn keine Plätze mehr übrig sind, gehe zum nächsten Studierenden
# Studierender macht ein Angebot an den ersten freien Platz in seiner Liste
angebotener_platz = studis_präferenzen[stud].pop(0)
print(f"Studierender {stud} (i) fragt Praktikumsplatz {angebotener_platz} (j) an.") # Wahl von i und j
if freie_plätze[angebotener_platz] is None: # Ist der Platz aktuell frei?
matches[stud] = angebotener_platz # Das Match wird gebildet
freie_studis.remove(stud) # Studierender wird entfernt
freie_plätze[angebotener_platz] = stud # Praktikumsplatz wird zugewiesen
print(f"Praktikumsplatz {angebotener_platz} (j) ist jetzt besetzt mit Studierendem {stud} (i).")
else:
# Platz ist schon besetzt, prüfen, ob der neue Studierende bevorzugt wird
aktueller_match = freie_plätze[angebotener_platz]
if platz_präferenzen[angebotener_platz].index(stud) < platz_präferenzen[angebotener_platz].index(aktueller_match): # Wenn der neue Studierende bevorzugt wird
matches[stud] = angebotener_platz # Neuen Studierenden zuweisen
matches.pop(aktueller_match) # Den alten Studierenden abmelden
freie_studis.remove(stud)
freie_studis.append(aktueller_match) # Den alten Studierenden wieder freigeben
freie_plätze[angebotener_platz] = stud # Aktualisieren der Zuordnung
print(f"Praktikumsplatz {angebotener_platz} (j) bevorzugt Studierenden {stud} (i) gegenüber {aktueller_match} (i).")
else:
print(f"Praktikumsplatz {angebotener_platz} (j) lehnt Studierenden {stud} (i) ab.") # Rückweisung durch j
# **Anforderung 7: Ausgabe aller aktuell freien Elemente**
freie_studis_sorted = sorted(freie_studis) # Alle aktuell freien Studierenden
freie_plätze_sorted = [platz for platz, match in freie_plätze.items() if match is None] # Alle freien Plätze
print(f"Frei sind: {', '.join(freie_studis_sorted)} und {', '.join(freie_plätze_sorted)}") # **Anforderung 7: Freie Elemente**
# **Anforderung 8: Ausgabe aller aktuellen Matches**
print(f"Aktuelle Matches: {matches}") # **Anforderung 8: Aktuelle Matches**
print()
return matches # Rückgabe der endgültigen Matches
Editor is loading...
Leave a Comment