Мне нужно назначить n людей m курсам, где каждый человек указал свое первое и второе предпочтение, и каждый курс имеет максимальное количество присутствующих. Каждый человек может посещать только один курс. Алгоритм должен найти одно решение, в котором
- максимальное количество людей, назначенных по одному из своих предпочтений, максимально
- количество людей, назначенных для их первого выбора, максимизируется (с учетом 1, который имеет более высокий приоритет).
Я догадался, что это не необычная проблема, но поиск не принесет ничего слишком полезного, поэтому я решил бросить свое. Это то, к чему я пришел:
- Для курсов, которые имеют меньше первых предпочтений, чем максимальное количество присутствующих, назначьте всех этих лиц курсу.
- Для других курсов: Поместите случайных людей в курс, который выбрал этот курс в качестве первого выбора, пока курс не будет полным.
- Для курсов, которые имеют меньше вторых предпочтений, чем свободные места, назначьте всех этих лиц курсу.
- Для других курсов: Поместите случайных людей в курс, который выбрал этот курс как второй выбор, пока курс не будет полным.
- Для каждого человека без курса: при первом (затем втором) предпочтении следует искать человека, который выбрал другой курс, где пятна еще свободны (если найдено более одного, возьмите тот, который выбрал курс с большинством свободные места), переместите этого человека на второй выбор и назначьте пропавшего без вести.
Я все еще не думаю, что этот алгоритм найдет оптимальное решение проблемы из-за последнего шага. Любые идеи, как сделать это лучше? Есть ли другой алгоритм, который решает эту проблему?