我正面临调度问题,
我们有9支球队......我们需要安排每支球队与其他球队进行一场比赛..
所以我们每周有4场比赛,为期9周。
现在使用以下功能,我们可以将所有匹配作为组合9c2
$matches = getCombinations(array(1, 2, 3, 4, 5, 6, 7, 8, 9), 2);
function getCombinations($teams, $group_length) {
$teams_len = count($teams);
if($group_length == 1) {
$return = array();
foreach($teams as $b){
$return[] = array($b);
}
return $return;
} else {
//get one level lower combinations
$oneLevelLower = getCombinations($teams, $group_length-1);
//for every one level lower combinations add one element to them that the last element of a combination is preceeded by the element which follows it in base array if there is none, does not add
$newCombs = array();
foreach($oneLevelLower as $oll){
$lastEl = $oll[$group_length-2];
$found = false;
foreach($teams as $key => $b){
if($b == $lastEl){
$found = true;
continue;
//last element found
}
if($found == true){
//add to combinations with last element
if($key < $teams_len){
$tmp = $oll;
$newCombination = array_slice($tmp,0);
$newCombination[]=$b;
$newCombs[] = array_slice($newCombination,0);
}
}
}
}
}
return $newCombs;
}
返回所有匹配项..
array (size=36)
0 =>
array (size=2)
0 => int 1
1 => int 2
1 =>
array (size=2)
0 => int 1
1 => int 3
2 =>
array (size=2)
0 => int 1
1 => int 4
3 =>
array (size=2)
0 => int 1
1 => int 5
4 =>
array (size=2)
0 => int 1
1 => int 6
5 =>
array (size=2)
0 => int 1
1 => int 7
6 =>
array (size=2)
0 => int 1
1 => int 8
7 =>
array (size=2)
0 => int 1
1 => int 9
8 =>
array (size=2)
0 => int 2
1 => int 3
9 =>
array (size=2)
0 => int 2
1 => int 4
10 =>
array (size=2)
0 => int 2
1 => int 5
11 =>
array (size=2)
0 => int 2
1 => int 6
12 =>
array (size=2)
0 => int 2
1 => int 7
13 =>
array (size=2)
0 => int 2
1 => int 8
14 =>
array (size=2)
0 => int 2
1 => int 9
15 =>
array (size=2)
0 => int 3
1 => int 4
16 =>
array (size=2)
0 => int 3
1 => int 5
17 =>
array (size=2)
0 => int 3
1 => int 6
18 =>
array (size=2)
0 => int 3
1 => int 7
19 =>
array (size=2)
0 => int 3
1 => int 8
20 =>
array (size=2)
0 => int 3
1 => int 9
21 =>
array (size=2)
0 => int 4
1 => int 5
22 =>
array (size=2)
0 => int 4
1 => int 6
23 =>
array (size=2)
0 => int 4
1 => int 7
24 =>
array (size=2)
0 => int 4
1 => int 8
25 =>
array (size=2)
0 => int 4
1 => int 9
26 =>
array (size=2)
0 => int 5
1 => int 6
27 =>
array (size=2)
0 => int 5
1 => int 7
28 =>
array (size=2)
0 => int 5
1 => int 8
29 =>
array (size=2)
0 => int 5
1 => int 9
30 =>
array (size=2)
0 => int 6
1 => int 7
31 =>
array (size=2)
0 => int 6
1 => int 8
32 =>
array (size=2)
0 => int 6
1 => int 9
33 =>
array (size=2)
0 => int 7
1 => int 8
34 =>
array (size=2)
0 => int 7
1 => int 9
35 =>
array (size=2)
0 => int 8
1 => int 9
但是一支球队一天不能有两场比赛,而且每支球队都需要四场比赛..
所以我们必须将这些比赛安排到周计划中,这样每周8支球队打4场比赛,剩下一支球队......每支球队有4场比赛......
* PS我没有实现组合功能,它从某人... thnx复制到他......我们使用php虽然我不认为语言在这里很重要..
答案 0 :(得分:1)
你可以使用round-robin tournament scheduling algorithm来解决这个问题,有九个常规团队和一个“再见”团队。 Here is a PHP implementation