Secret santa-Algorithmus

Jedes Jahr zu Weihnachten ziehen wir Namen für Geschenk-Austausch in meiner Familie. Dies erfordert in der Regel mehrere Ansichten, bis niemand gezogen hat, Ihr Gatte. Daher habe ich dieses Jahr codiert, meinen eigenen Namen zu zeichnen-app, die in ein paar Namen, ein paar der nicht erlaubten Paarungen und sendet aus einer E-Mail an alle mit Ihren gewählten giftee.

Gerade jetzt, der Algorithmus funktioniert wie folgt (in pseudocode):

function DrawNames(list allPeople, map disallowedPairs) returns map
    //Make a list of potential candidates
    foreach person in allPeople
        person.potentialGiftees = People
        person.potentialGiftees.Remove(person)
        foreach pair in disallowedPairs
            if pair.first = person
               person.Remove(pair.second)

    //Loop through everyone and draw names
    while allPeople.count > 0
        currentPerson = allPeople.findPersonWithLeastPotentialGiftees
        giftee = pickRandomPersonFrom(currentPerson.potentialGiftees)
        matches[currentPerson] = giftee
        allPeople.Remove(currentPerson)
        foreach person in allPeople
            person.RemoveIfExists(giftee)

    return matches

Tut wer weiß mehr über Graphentheorie wissen, eine Art von Algorithmus, der besser funktionieren würde hier? Für meine Zwecke funktioniert, aber ich bin neugierig.

EDIT: Da die E-Mails gingen eine Weile her, und ich bin nur in der Hoffnung, etwas zu lernen, werde ich anders formulieren dies als eine graph-Theorie in Frage. Ich bin nicht so interessiert in den besonderen Fällen, in denen die AUSSCHLÜSSE sind alle Paare (wie bei Ehegatten nicht immer gegenseitig). Ich bin mehr daran interessiert, in den Fällen, in denen es genug gibt AUSSCHLÜSSE, die Suche nach einer Lösung wird der harte Teil. Meine obige Algorithmus ist ein einfacher greedy-Algorithmus, dass ich nicht sicher bin, gelingen würde, in allen Fällen.

Beginnend mit einem vollständigen gerichteten Graphen und eine Liste von vertex-Paare. Für jeden vertex koppeln, entfernen Sie das edge von der ersten Ecke der zweiten.

Das Ziel ist ein graph, wo jeder Knoten hat eine Kante kommen, und eine Kante verlassen.

InformationsquelleAutor Eclipse | 2008-11-07
Schreibe einen Kommentar