Разделите людей на команды для наибольшего удовлетворения

Просто вопрос любопытства. Помните, когда в групповой работе профессор делил людей на группы определенного числа (n)?

Некоторые из моих профессоров возьмут список n люди, с которыми хочется работать и n людей, с которыми не хочется работать, от каждого студента, а затем волшебным образом собирать группы n где ученики будут сопоставляться с людьми, которых они предпочитают, и избегать работы с людьми, которые им не нравятся.

Для меня этот алгоритм звучит очень похоже на проблему рюкзака, но я подумал, что могу спросить о том, каким будет ваш подход к такого рода проблемам.

РЕДАКТИРОВАТЬ: нашел статью ACM, описывающую что-то в точности как мой вопрос. Прочитайте второй абзац для дежавю.

4 ответа

Решение

Для меня это больше похоже на проблему клики.

Как я вижу проблему, я бы настроил следующий график:

  • Вершины будут студентами
  • Два студента были бы связаны ребром, если бы выполнялись обе следующие вещи:
    1. По крайней мере, один из двух студентов хочет работать с другим.
    2. Ни один из двух студентов не хочет работать с другим.

Затем нужно разбить граф на клики размером n. (Предполагая, что количество студентов делится на n)

Если бы это было невозможно, я бы, вероятно, пропустил первое ограничение на ребра и имел ребра между двумя людьми, если ни один из них явно не говорит, что они не хотят работать с другим.

Что касается подхода к эффективному решению этой проблемы, я понятия не имею, но, надеюсь, это поможет вам ближе разобраться в проблеме.

Вы можете легко смоделировать это как проблему кластеризации, и вам даже не нужно будет определять пространство, вы можете просто определить расстояния:

Сделайте двух людей очень близкими, если они оба хотят работать вместе. Закройте, если один из них хочет работать с другим. Среднее расстояние, если есть только апатия. Далеко, если один не хочет работать с другим.

Тогда вы могли бы просто найти кластеры, ура. Затем разделите любые кластеры слишком большого размера, с уверенностью, что люди в кластерах будут хорошо работать вместе.

Эта проблема может быть грубой, поэтому мой подход был бы сначала сделать ее грубой, а затем исправить ее, когда я получу лучшее представление.

Есть пара алгоритмов, которые вы можете использовать. Отличным примером является так называемая "проблема стабильного брака", которая имеет идеальное решение. Вы можете прочитать больше об этом здесь:

http://en.wikipedia.org/wiki/Stable_marriage_problem

Проблема стабильного брака работает только с двумя группами людей (мужчины / женщины в случае брака). Если вы хотите сформировать пару, вы можете использовать вариацию, проблему стабильного соседа по комнате. В этом случае вы создаете пары, но все приходят из одного пула.

Но вы попросили команду (которую я перевожу в>2 человека на команду). В этом случае вы можете разрешить всем заполнить свои лучшие и худшие совпадения, а затем запустить

Другие вопросы по тегам