我有一个用户列表。例如 -
1,2,3,.... 100
这些用户属于一个城市。其他城市也有类似的名单。
我正在使用循环调度算法来安排属于同一城市的玩家之间的匹配。因此,如果我希望每个玩家玩3个匹配,我运行算法3次而不是(用户数 - 1)。所以对于第一阶段,这是可以的。
现在,下一阶段是国家之间,即来自整个州的球员之间。所以我想使用循环算法,但不希望之前玩过的玩家再玩一次。我怎样才能做到这一点。
这是我的循环计划:
$users = range(0, 99);
$played_before = array();
foreach ($users as $key => $value) {
$played_before[$value] = array_rand($users,3);
}
shuffle($users);
$no_of_matches_per_player = 3;
if( $length % 2 == 1){
$users = array_push($users, 'x');
}
$mid = $length / 2;
$l1 = array();
$l2 = array();
for ($i=0; $i < $no_of_matches_per_player ; $i++) {
$l1 = array_slice($users, 0, $mid);
$l2 = array_slice($users, $mid);
$l2 = array_reverse($l2);
$round = Embed::zip($l1, $l2);
array_push($schedule, $round);
$insert = array(array_pop($users));
array_splice( $users, 1, 0, $insert);
}
我创建了一个测试数组$ users和$ playing_before。
$ playing_before包含player_ids作为键以及他作为值玩过的一系列玩家。
Embed :: zip功能类似于python的zip功能。它将来自两个或多个数组的相同索引的元素压缩。对于例如 数组1:1,2,3 阵列2:4,5,6 Zip函数将返回: 数组:([0] =&gt;数组(1,4),[1] =&gt;数组(2,5),[2] =&gt;数组(3,6))
州分为城市和城市分为俱乐部。因此,例如
Club1 - 1,2,3,... 10
Club2 - 11,12,13,... 20
对于city stage,用户数组是1,2,3,... 20,我在这个数组上进行循环调度。
然后是状态阶段:
City1:1,2,3,... 20
City2:21,22,23,.... 40
现在用户阵列将是1,2,3,...... 40,我必须循环,以便在之前阶段玩过的玩家不再玩