Разделите людей на команды для большей удовлетворенности
Просто вопрос любопытства. Помните, когда в классной группе профессор делил людей на группы определенного числа (n
)?
Некоторые из моих профессоров возьмут список n
людей, с которыми вы хотите работать, и n
людей, с которыми никто не хочет работать, от каждого ученика, а затем магически выделяются группы n
, где учащиеся будут сопоставляться с людьми, которых они предпочитают, и избегать работы с людьми, которых они не предпочитают.
Для меня этот алгоритм очень похож на проблему Knapsack, но я подумал, что я бы спросил, о чем будет ваш подход к этой проблеме.
РЕДАКТИРОВАТЬ: нашел статью ACM, описывающую что-то точно так же, как мой вопрос. Прочтите второй абзац для дежавю.
Ответы
Ответ 1
Для меня это больше похоже на проблему clique.
Как я вижу проблему, я бы установил следующее graph:
- Вершины будут студентами
- Два ученика будут связаны краем, если будут выполняться обе эти следующие вещи:
- По крайней мере один из двух студентов хочет работать с другим.
- Ни один из двух учеников не хочет работать с другим.
Затем речь идет о разбиении графика на клики размером n. (Предполагая, что число студентов делится на n)
Если бы это было невозможно, я бы, вероятно, допустил первое ограничение на краях и имел края между двумя людьми, если ни один из них явно не говорит, что они не хотят работать с другим.
Что касается подхода к эффективному решению этого вопроса, я не знаю, но это, надеюсь, поможет вам приблизиться к пониманию проблемы.
Ответ 2
Вы можете легко моделировать это как проблему кластеризации, и вам даже не нужно было бы определять пространство, вы могли бы просто определить расстояния:
Сделайте двух человек очень близкими, если они оба захотят работать вместе.
Закрыть, если один из них хочет работать с другим.
Среднее расстояние, если есть просто апатия.
Далеко, если кто-то не хочет работать с другим.
Тогда вы могли бы просто найти кластеры, yay. Затем разделите все кластеры слишком большого размера, с уверенностью, что люди в кластерах будут хорошо работать вместе.
Ответ 3
Эта проблема может быть грубой, поэтому мой подход был бы прежде всего грубой силой, а затем исправить ее, когда я получу лучшую идею.
Ответ 4
Существует несколько алгоритмов, которые вы могли бы использовать. Отличным примером является так называемая "проблема стабильного брака", которая имеет идеальное решение. Вы можете прочитать об этом здесь:
http://en.wikipedia.org/wiki/Stable_marriage_problem
Стабильная проблема с браком работает только с двумя группами людей (мужчины/женщины в браке). Если вы хотите создать пару, вы можете использовать вариант, стабильную проблему соседа. В этом случае вы создаете пары, но все из одного пула.
Но вы попросили команду (которую я переводил в > 2 человека за команду). В этом случае вы можете позволить каждому заполнить свой лучший худший результат, а затем запустить