Untitled

 avatar
unknown
plain_text
22 days ago
3.8 kB
2
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
Leave a Comment