[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Реферальные комманды
Quieteroks
Здравствуйте.

Имеется задача поделить список людей на две команды.
Только тут все несколько сложнее, чем просто пополам.

В игру вступают 6 или 12 человек. У каждого своя позиция (как в шахматах).
Определяем лидеров, но это определить легко, не суть важно.
После, к ним должно подключиться по 2 война и/или 3 стрелка.
Т.е. на игру подаются заявки, по приглашению или просто мимо проходили.

Итого, мы имеем список из 6 (12) человек, которых нужно распределить на две команды с учетом их интересов (назовем реферальной зависимостью).

Имеем массив в виде:
array(
0 => array(
'id' => 2,
'ref' => 1,
),

1 => array(
'id' => 4,
'ref' => 3,
),

2 => array(
'id' => 5,
'ref' => 2,
),

3 => array(
'id' => 6,
'ref' => 4,
)
)


Рассмотрим игру на 12 человек...
Соответственно список не один, а на каждый тип игрока (в примере можно сказать, что воины, стрелки аналогичны, но больше по количеству).

Итого, имеем двух лидеров с id 1 и 3.
Набираем к ним команду:

// Массив команды из базы по шаблону выше
$team = array();
// Количество участников... Для первого распределения (воинов)
// Соответственно это происходит в цикле, для каждого типа игроков...
// В силу того, что распределение должно быть одинаковым

$cnt = count($team) / 2;
// Рабочий массив двух команд
$game = array(
'l' => array(0 => 1), // Первая команда уже с лидером
'r' => array(0 => 3), // Правая команда уже с лидером
);
// Отложенный массив
$other = array();
// Распределение
for($j=0; $j<$c; $j++) {
// Первая команда
if(count($game['l']) < $cnt
&& in_array($team[$j]['ref'], $game['l'])) {
$game['l'][] = $team[$j]['id'];
// Вторая команда
} elseif(count($game['r']) < $cnt
&& in_array($team[$j]['ref'], $game['rigt'])) {
$game['r'][] = $team[$j]['id'];
// Обработать позже
} else {
$other[] = $team[$j]['id'];
}
}

// Отложенное распределение
if($c = count($other)) {
for($j=0; $j<$c; $j++) {
if(count($game['l']) < $cnt) {
$game['l'][] = $other[$j]['id'];
} else {
$game['r'][] = $other[$j]['id'];
}
}
}


Вот таким вот образом я распределяю в одном круге, но учитываю мало "интересов".
Т.е. в один круг учитываются не все возможные связи или отсеиваются те, кто мог попасть в левую команду, но попал в правую...

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

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.