Untitled
def gale_shapley_algorithmus(studis, plätze): # Aufgabe I1 - Vergabe von Aufgaben matches = {} # hier aktuellen Matches speichern freie_studis = list(studis.keys()) # Liste der freien Mitarbeiter; keys() nutzen, damit die Keys (hier: die jeweiligen Mitarbeiter) 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 Mitarbeiter 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 Mitarbeiter da sind.. iteration += 1 # Iteration erhöhen print(f"Iteration {iteration}") # Ausgabe der Iteration-Nummer for stud in sorted(freie_studis): # durch Mitarbeiter gehen in alphabetischer Reihenfolge, mittels sorted if len(studis_präferenzen[stud]) == 0: # Überprüfen, ob der Mitarbeiter keine weiteren Aufgaben mehr anfragt print(f"Mitarbeiter {stud} hat alle Aufgaben abgearbeitet.") continue # Wenn keine Aufgaben mehr übrig sind, gehe zum nächsten Mitarbeiter # Mitarbeiter macht ein Angebot an die erste freie Aufgabe in seiner Liste angebotener_platz = studis_präferenzen[stud].pop(0) print(f"Mitarbeiter {stud} (i) fragt Aufgabe {angebotener_platz} (j) an.") # Wahl von i und j if freie_plätze[angebotener_platz] is None: # Ist die Aufgabe aktuell frei? matches[stud] = angebotener_platz # Das Match wird gebildet freie_studis.remove(stud) # Mitarbeiter wird entfernt freie_plätze[angebotener_platz] = stud # Aufgabe wird zugewiesen print(f"Aufgabe {angebotener_platz} (j) ist jetzt besetzt mit Mitarbeiter {stud} (i).") else: # Aufgabe ist schon besetzt, prüfen, ob der neue Mitarbeiter 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 Mitarbeiter bevorzugt wird matches[stud] = angebotener_platz # Neuen Mitarbeiter zuweisen matches.pop(aktueller_match) # Den alten Mitarbeiter abmelden freie_studis.remove(stud) freie_studis.append(aktueller_match) # Den alten Mitarbeiter wieder freigeben freie_plätze[angebotener_platz] = stud # Aktualisieren der Zuordnung print(f"Aufgabe {angebotener_platz} (j) bevorzugt Mitarbeiter {stud} (i) gegenüber {aktueller_match} (i).") else: print(f"Aufgabe {angebotener_platz} (j) lehnt Mitarbeiter {stud} (i) ab.") # Rückweisung durch j # **Anforderung 7: Ausgabe aller aktuell freien Elemente** freie_studis_sorted = sorted(freie_studis) # Alle aktuell freien Mitarbeiter freie_plätze_sorted = [platz for platz, match in freie_plätze.items() if match is None] # Alle freien Aufgaben 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
Leave a Comment