PHP随机团队计划生成器 - 循环计划程序

时间:2011-05-03 14:19:51

标签: php scheduler round-robin

在新问题中提出这个问题后得到负面反馈......这是我修改过的问题。是的,它与我正在进行的项目相同,但我不清楚我需要基本上有一个Round Robin类型的调度程序。

我正在研究Round Robin Style Hockey League Scheduler,需要一些帮助。

总体目标是让最终管理员用户能够打入3个变量并让它执行圆形Robin风格的计划,直到WEEKS计数器被击中。以下是球队数量和比赛周数的示例。

$Teams = array('team1','team2','team3','team4','team5','team6','team7','team8');
$Weeks = 16;

目标是让它循环16次,每周制作4场比赛,让每支球队每周打1次。循环算法应该让团队每周都有不同的团队,直到所有可能的组合完成,但不超过16周。如果我们只有4支队伍或更少的队伍而不是可能的组合,我们需要重新开始循环,直到周数被击中。


修改

我大约90%是我需要这个脚本做的...但我坚持一件事。我需要帮助合并多维数组。

首先是Tiers。接下来是周(都是第1周)。然后是团队的比赛匹配。

Array
(
[1] => Array
    (
        [1] => Array
            (
                [1] => Array
                    (
                        [home] => Whalers
                        [visitor] => Lumberjacks
                    )

                [2] => Array
                    (
                        [home] => Team America
                        [visitor] => Wolfpack
                    )

            )

    )

[2] => Array
    (
        [1] => Array
            (
                [1] => Array
                    (
                        [home] => Warriors
                        [visitor] => Litchfield Builders
                    )

                [2] => Array
                    (
                        [home] => Icemen
                        [visitor] => Nighthawks
                    )

            )

    )

[3] => Array
    (
        [1] => Array
            (
                [1] => Array
                    (
                        [home] => The Freeze
                        [visitor] => Devils Rejects
                    )

                [2] => Array
                    (
                        [home] => Cobras
                        [visitor] => New Haven Raiders
                    )

                [3] => Array
                    (
                        [home] => Crusaders
                        [visitor] => Whalers
                    )

                [4] => Array
                    (
                        [home] => Blizzard
                        [visitor] => CT Redlines
                    )

            )

    )

我希望最终结果放弃层并将所有相同周的游戏合并在一起,如下所示:

Array
    (
        [1] => Array
            (
                [1] => Array
                    (
                        [home] => Whalers
                        [visitor] => Lumberjacks
                    )

                [2] => Array
                    (
                        [home] => Team America
                        [visitor] => Wolfpack
                    )

                [3] => Array
                    (
                        [home] => Warriors
                        [visitor] => Litchfield Builders
                    )

                [4] => Array
                    (
                        [home] => Icemen
                        [visitor] => Nighthawks
                    )

                [5] => Array
                    (
                        [home] => The Freeze
                        [visitor] => Devils Rejects
                    )

                [6] => Array
                    (
                        [home] => Cobras
                        [visitor] => New Haven Raiders
                    )

                [6] => Array
                    (
                        [home] => Crusaders
                        [visitor] => Whalers
                    )

                [8] => Array
                    (
                        [home] => Blizzard
                        [visitor] => CT Redlines
                    )

            )

    )

4 个答案:

答案 0 :(得分:1)

也许是这样的?

<?php
$teams = array(
    'Team 1',
    'Team 2',
    'Team 3',
    'Team 4',
    'Team 5',
    'Team 6',
    'Team 7',
    'Team 8'
);

function getMatches($teams) {
    shuffle($teams);
    return call_user_func_array('array_combine', array_chunk($teams, sizeof($teams) / 2));
}

for ($i = 0; $i < 14; $i += 1) {
    print_r(getMatches($teams));
}

我没有真正了解你如何定义时间表,所以如果你能解释一下,我会尽力帮助。

答案 1 :(得分:1)

弹出一个,随机,弹出另一个。这是你的游戏。如果剩下一个,一些随机团队必须成为一个主力并且本周玩两场比赛:

for ($week=1; $i<=$totalWeeksPlayed; $i++)
{

  $games = 0;
  $temp = $teams;

  while (count($temp) > 1)
  {
    $team = array_shift($temp);  
    shuffle($temp);
    $opponent = array_shift($temp);
    $game[$week][$games] = $team . ' vs' . $opponent;
    $games++;
  }

  if (count($temp) == 1)
  {
    $workhorses = $teams;
    unset($workhorses[array_search($temp[0], $teams));
    shuffle($workhorses);
    $team = $temp[0];
    $opponent = array_shift($workhorses);
    $game[$week][$games] = $team . ' vs' . $opponent;
    $games++;
  }

}

答案 2 :(得分:1)

下面的问题从上面复制。

如果我弄错了,请纠正我,但是如果所有球队都必须定期进行比赛,那么如果队员数量奇数,是否可以让所有球队都进行相同数量的比赛? - Yoshi 2011年5月3日15:05


米歇尔,

您尝试配对的团队数量(在这种情况下,8个团队持续16周)可能是一项艰巨的任务,而且只是“调度过程”的开始。一旦确定了正确的平衡团队配对,这只是将时间表放在一起进行分发的开始。接下来,每周4个时段的列表包括:星期几,整个16周的每个时段的开始时间和地点名称。评论:对您最有帮助的是获得一个具有平衡对手的8队调度矩阵,以及 home&amp;离开状态。它对时间表的质量产生很大影响。平衡分配早期和晚期时段非常重要,同样适用于家庭和家庭。离开状态,与对手平分球队分配。大部分余额是通过使用平衡的团队对矩阵来完成的。

在波士顿地区经过35年的教学,辅导和日程安排后,我可以提供以下信息。为体育组织创建联赛或比赛时间表似乎是许多人共享的永无止境的任务,随着参与者年龄的增长和联赛的变化而反复重复,与创建日程相关的学习曲线对于那些接管。

话虽如此,我很惊讶有多少受过高等教育的数学向导试图提出解决一个人调度问题的完美解决方案(算法)。我和我的朋友(他是一名数学/程序员天才)在3年的时间里创建了软件,可以在为4到22个团队创建时间表时完美地平衡所有重要组件。我们学到的是,没有算法能够处理添加到常规变量中的所有可能变量,以创建平衡的计划。我所说的是有尽可能多的“假设”,因为有数学排列和组合只涉及创建一个列出对手和家庭&amp;游客的访客状态。

例如:让我们为9支球队每周打4场比赛创造一个完美平衡的赛程。九个星期后,所有队伍都打了8场比赛,所有队员都有1场比赛,所有队员都在4个时段中都打过两次,所有队伍都被安排了4次主队和4次访客队。

还有谁想要?好吧现在来了很有趣。因为你选择的4个时段每个星期六有2个游戏,每个星期天有2个游戏,所以弹出第一个问题(在制定,发布和传递时间表之后,当来自2个不同团队的2个教练打电话并说他们在星期六工作时,你可以将我们的游戏转移到星期日吗?当然,我可以做到这一点。我只会进行更改,重新发布和重新分发时间表。

在新的时间表发布后,几天后,一位不同的教练打来电话说:“嘿,你把我的一些游戏移到星期六,我星期六工作......,把它们移回去”。电话再次响起。这次是来自另一支球队的教练,并表示他们在比赛的第5周参加比赛,并且不能在那一周比赛。最后,最后一个电话来自另一位教练。他说,他的一名球员的父母在周日下午教授CCD课程,他的一半球队参加了CCD课程,并希望将我们所有的周日比赛都移到周六。够!

我的观点是,无论你做什么或计划的完美程度如何,最好的解决方案是在将比赛日期和时间段分配给任何赛程之前找出尽可能多的球员/教练团队限制或限制。这些不可预测的变量使得完美的时间表变得混乱。当分发不受欢迎的时间表时,人们会生气并抱怨。如果时间表很糟糕,有些家长不会在第二年签下他们的小伙子。当你有一个有两三个小孩的年轻家庭时就​​会发生这种情况,爸爸的工作限制了他在那里的能力。当有一个清晨游戏时,我认为你可以看到妈妈的困难,当它全部落在她的肩膀上。

对于那些不熟悉日程安排的人,请坚持下去。获得后,随着时间的推移会变得更好 处理问题的一点经验。如果您购买计划软件程序来计算团队对,请小心。坚持看到他们创建的计划的完整单循环。检查上述内容(关于平衡和分配)。

Bob R

答案 3 :(得分:0)

给出一个团队表,比方说    团队(        队名    );

和一个固定装置表

夹具(        日期;    );

通过'播放'分解关系

比赛(        fixture_date。        队名    );

然后,这只是迭代每个日期,然后团队并随机选择一个没有固定日期的团队,并且没有参加选定团队的团队(或者没有参加选定的团队)最近)。

虽然更简单的解决方案是让团队[n](其中n为0 ......团队数量-1)为不同的X值发挥团队[(n +(团队数量))%X]。