प्रत्येक क्रिसमस हम अपने परिवार में उपहार एक्सचेंजों के लिए नाम खींचते हैं। इसमें आमतौर पर मल्टीप्ल रेड्रॉप्स शामिल होते हैं जब तक कि कोई भी अपने पति को खींच नहीं लेता है। इसलिए इस साल मैंने अपना नाम ड्राइंग ऐप तैयार किया जो नामों का एक समूह, अस्वीकृत जोड़ी का एक गुच्छा लेता है, और अपने चुने हुए गिफ्ट के साथ सभी को एक ईमेल भेजता है।गुप्त सांता एल्गोरिदम
अभी, एल्गोरिथ्म इस तरह काम करता है (स्यूडोकोड में):
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
किसी को जो ग्राफ सिद्धांत के बारे में अधिक जानता है एल्गोरिथ्म है कि बेहतर यहाँ काम करेगा किसी तरह पता है? मेरे उद्देश्यों के लिए, यह काम करता है, लेकिन मैं उत्सुक हूँ।
संपादित करें: चूंकि ईमेल कुछ समय पहले बाहर निकले थे, और मैं बस कुछ सीखने की उम्मीद कर रहा हूं, मैं इसे ग्राफ़ सिद्धांत प्रश्न के रूप में दोहरा दूंगा। मुझे विशेष मामलों में इतनी दिलचस्पी नहीं है कि बहिष्कार सभी जोड़े हैं (जैसे पति/पत्नी एक दूसरे को नहीं मिल रहे हैं)। मुझे उन मामलों में अधिक दिलचस्पी है जहां पर्याप्त बहिष्कार हैं जो किसी समाधान को ढूंढना कठिन हिस्सा बन जाते हैं। उपरोक्त मेरा एल्गोरिदम सिर्फ एक साधारण लालची एल्गोरिदम है कि मुझे यकीन नहीं है कि सभी मामलों में सफल होगा।
एक पूर्ण निर्देशित ग्राफ और वर्टेक्स जोड़े की एक सूची से शुरू हो रहा है। प्रत्येक vertex जोड़ी के लिए, पहले vertex से दूसरे को किनारे को हटा दें।
लक्ष्य एक ग्राफ प्राप्त करना है जहां प्रत्येक चरम पर एक किनारे आ रहा है, और एक किनारा छोड़ रहा है।
यही वह है जिसे मैं ढूंढ रहा था! धन्यवाद! – Eclipse
बिल्कुल नहीं: यह एक निर्देशित ग्राफ है, और आप जरूरी नहीं कि एक परिपूर्ण मिलान चाहते हैं; आप बस एक सबग्राफ चाहते हैं जैसे कि प्रत्येक वर्टेक्स में indgree = outdegree = 1 - a * cycle cover * है। [इसे एक सही मिलान करने वाली समस्या को कम करने के तरीके हैं, लेकिन इसे हल करने के तरीके भी हैं।] – ShreevatsaR
@ShreevatsaR: ग्राफ को निर्देशित करने की आवश्यकता नहीं है। प्रत्येक चक्र के लिए दिशा चुनने के लिए बस एक सिक्का फ्लिप करें। (यह माना जा रहा है कि सभी ब्लैकलिस्टेड जोड़े सममित हैं।) –