Как я могу создавать «команды» из списка взвешенных «пользователей» случайным образом, но справедливо, используя PHP? - PullRequest
4 голосов
/ 14 февраля 2010

Чего я надеюсь достичь, так это способности генерировать «команды» пользователей. У меня будет x количество мужчин, взвешенное (десятичный вес навыка, например 75.23) и y количество женщин (также со значением веса навыка).

Учитывая этот список пользователей, я бы взял для ввода количество команд (скажем, 6 команд). Затем я просматриваю список «х» и «у» и систематизирую их так, чтобы создавались наилучшие средневзвешенные команды. Я бы хотел сохранить баланс команд (соотношение мужчин и женщин)

Я не хочу, чтобы «сложенные» команды (лучшие в одной команде). Я бы хотел равномерное распределение веса.

Любопытно, как я мог добиться этого в PHP? Я бы использовал базу данных MySQL для получения пользователей со значениями веса. Я бы заранее знал, сколько у меня будет пользователей, а также сколько команд я бы хотел создать.

Буду признателен за любые предложения или ссылки на решение, если кто-нибудь найдет что-то подобное. Я просто не математик, поэтому я не знаю, какая здесь формула.

Спасибо. Я ценю любой вклад!

EDIT

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

  1. Я хочу, чтобы команды были примерно одинакового размера
  2. Я хочу, чтобы средний (средний) показатель квалификации для каждой команды был примерно равен
  3. Я хочу, чтобы соотношение мужчин и женщин в каждой команде было примерно одинаковым (то есть, если по дивизионам мы получим распределение, 5 мужчин и 3 женщины на команду, я хотел бы сохранить это примерно так же). На самом деле не проблема, если я сначала сортирую мужчин, а потом женщин (или наоборот).
  4. Мне не нужен линейный подход (команда 1 получает наивысшую оценку, команда 2, наивысшая секунда, команда 3 ... и так далее). Кажется, что у Тима метод взятия (если 6 команд) 6 человек и рандомизации, а затем распределения по линейному принципу, работает хорошо.

Ответы [ 3 ]

3 голосов
/ 14 февраля 2010

Я не полностью ясно, что вы здесь ищете, поэтому я повторю то, что, как я понимаю, вы спрашиваете.Если это не правильно, вы можете уточнить свои требования, отредактировав свой вопрос:

У вас есть список определенного числа мужчин и определенного числа женщин.У каждого человека есть известная оценка навыка.Вы хотите разделить их на определенное количество команд со следующими целями:

  • вы хотите, чтобы команды были примерно одинакового размера
  • вы хотите средний (средний) навыкоценка для каждой команды примерно равна
  • Вы хотите, чтобы соотношение мужчин и женщин в каждой команде было примерно равно

Я бы подумал, что простой метод для достижения этой цели будетbe:

  1. Создайте список всех мужчин в порядке убывания навыка.
  2. Создайте список всех женщин в порядке убывания навыка.
  3. Добавьте список женщин в конец списка мужчин.
  4. Начните с начала комбинированного списка и распределите каждого человека по очереди в круговой манере.(То есть, выделите первого человека для команды номер один, второго - для команды номер два и т. Д., Пока вы не назначите по одному человеку для каждой из команд, которые вы хотите создать. Затем начните снова с команды один, распределяя людейкаждой команде по порядку и т. д.)

При таком подходе вам будут гарантированы следующие результаты:

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

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

2 голосов
/ 14 февраля 2010

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

Известные алгоритмы для идеального соответствия, описанные выше (например, алгоритм Эдмонда), могут не адаптироваться к групповому случаю. Возможно, я бы посмотрел на метод имитации отжига или простой генетический алгоритм.

0 голосов
/ 14 февраля 2010

Если количество людей в каждой группе (x, y) относительно ровное, а общее количество людей относительно высокое, случайная выборка должна работать достаточно хорошо. Смотрите здесь о том, как выбрать случайные строки из базы данных MySQL: http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_rand

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

* 1006 Е.Г. *

while(new random record){

if(team_skill+random person skill > n*mean){
 next;
}

if(team_skill+random person skill < n*mean && selected team members =n){
team + random person;
break;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...