Дамы и господа,
Мои лучшие друзья и я каждый год проводим обмен подарками типа «Секретный Санта», в этом году я пытался придумать несколько способов сделать его интересным. В нем участвуют шесть человек, и я хочу разработать небольшую программу, которая позволит шестерым из нас оценить предпочтительных получателей подарков от 1 до 5, а также предпочитаемых дарителей.
Итак, допустим, нас называют A, B, C, D, E и F.
A представляет два списка:
Список 1 - Люди, которым я больше всего хотел бы сделать подарок: B, D, C, F, E
Список 2 - Люди, от которых мне больше всего хотелось бы получить подарок: F, D, E, B, C
Все шестеро из нас представят оба этих списка, поэтому у меня будет 12 списков вместе. Полагаю, мой вопрос в том, каков наилучший алгоритм, позволяющий теперь назначать каждому человеку получателя подарка?
Я думал о чем-то вроде этого:
Если два человека оба выбрали друг друга в своих списках противников (то есть А больше всего хочет отдать В, В больше всего хочет получить от А), то я немедленно назначаю А для Б. Так что теперь А удален из нашего списка получатели подарков и B удаляются из нашего пула дарителей.
После того, как я назначил "идеальные совпадения", я все-таки потерялся, есть ли алгоритм установления для подобных ситуаций? Очевидно, что это только для развлекательной ценности, но наверняка должно быть «реальное» применение чего-то подобного? Возможно расписание или что-то?
Мой Google-фу подвел меня, но я чувствую, что это может быть из-за моей собственной неточности в поисковых терминах.
Cheers,
(и счастливых праздников, я думаю),
Rob
Обновление / Часть 2
Хорошо, Ин Сяо пришел на помощь, порекомендовав алгоритм Гейли Шепли для Устойчивой проблемы брака , и я реализовал это в Python и его работает угощение Тем не менее, это просто мысль, которая пришла мне в голову. Я предполагаю, что в нашей группе из шести лучших друзей есть три пары «экстра-лучших» друзей, поэтому у меня есть ощущение, что мы просто получим три пары AB, CD, EF и BA, DC, FE с точки зрения подарка давать и получать.
Есть ли алгоритм, который мы могли бы разработать, который учитывал бы ранжирование людей, но также ограничивал двух людей, образующих "закрытую группу"? То есть, если А назначено купить подарок для Б, B нельзя назначить купить подарок для А? Возможно, мне нужно решить проблему Стабильные соседи по комнате ?
Похожие вопросы: