如何进行循环赛安排,使得两名选手在整个锦标赛中不会再次互相比赛

时间:2014-06-12 06:22:33

标签: php arrays algorithm schedule

我有一个用户列表。例如 -

  

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,我必须循环,以便在之前阶段玩过的玩家不再玩

0 个答案:

没有答案