2

在一个新问题中提出这个问题得到负面反馈后......这是我修改后的问题。是的,这是我正在从事的同一个项目,但我不清楚我是否需​​要基本上有一个循环类型的调度程序。

我正在开发循环式曲棍球联赛调度程序,需要一些帮助。

总体目标是最终管理员用户能够输入 3 个变量并让它执行循环式调度,直到 WEEKS 计数器被击中。以下是球队数量和比赛周数的示例。

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

目标是让它循环 16 次,每周进行 4 场比赛,每支球队每周比赛 1 次。循环赛算法应该让球队每周与不同的球队比赛,直到所有可能的组合都完成,但不超过 16 周。如果我们只有 4 支球队或少于可能的组合的球队,我们将需要重新开始循环赛,直到达到周数。


编辑:

我大约 90% 完成了我需要这个脚本来做的事情……但我被困在一件事上。我需要合并多维数组的帮助。

首先是层级。接下来是周(都是第 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

4 回答 4

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++;
  }

}
于 2011-05-03T14:54:50.290 回答
1

下面的问题是从上面复制的。

如果我弄错了,请纠正我,但是如果所有球队都必须定期进行相同的比赛,如果有奇数支球队,是否有可能让所有球队参加相同数量的比赛?– 耀西 2011 年 5 月 3 日 15:05


米歇尔,

您尝试配对的团队数量(在本例中为 8 个团队,为期 16 周)可能是一项艰巨的任务,并且只是“调度过程”的开始。一旦确定了正确、平衡的团队配对,就只是制定时间表以进行分配的开始。接下来,4 个每周时段的列表包括:一周中的某一天,整个 16 周季节的每个时间段的开始时间和位置名称。评论:对你最有帮助的是得到一个 8 队的调度矩阵,该矩阵具有平衡的对手,以及主客场地位。这对日程安排的质量有很大的影响。重要的是要平均分配早晚时段,平等的主客场状态,以及与对手平等的球队分配。大多数平衡是通过使用平衡的团队配对矩阵来实现的。

在波士顿地区从事了 35 年的教学、指导和安排运动之后,我可以提供以下信息。为体育组织制定联赛或比赛时间表似乎是一项永无止境的任务,并且随着参与者年龄的增长和联赛运营者的变化而不断重复,与制定时间表相关的学习曲线对于那些接管。

话虽如此,我很惊讶有多少受过高等教育的数学奇才参与尝试提出解决一个人的调度问题的完美解决方案(算法)。我和一个朋友(他是一个数学/程序员天才)在 3 年的时间里创建了一个软件,在为 4 到 22 个团队创建时间表时完美地平衡了所有重要组件。我们学到的是,没有一种算法可以处理所有可能的变量,这些变量被添加到正常变量中以创建平衡的时间表。我要说的是,存在与数学排列和组合一样多的“假设”,这些排列和组合仅处理创建一个列出对手以及游戏的主场和访客状态的团队矩阵。

例如:让我们为一个 9 支球队每周打 4 场比赛创建一个完美平衡的时间表。九周后,所有球队打了 8 场比赛,都进行了 1 次轮空,所有球队在 4 个时段的每个时段都打了 2 次,并且都被安排为 4 次主队和 4 次客队。

还有什么人想要的?那么现在来的乐趣。因为您选择的 4 个时段每个星期六有 2 场比赛,每个星期天有 2 场比赛,所以会弹出第一个问题(在创建、发布和分发时间表之后,当来自 2 个不同团队的 2 名教练打电话说他们星期六工作时,你能把我们的比赛改到星期天吗?当然,我可以。我会做出改变,重新发布和重新分发赛程表。

新的赛程表发布后,几天后,另一位教练打来电话说:“嘿,你把我的一些比赛移到了周六,我周六工作......,把它们移回来”。电话又响了。这次是另一支球队的教练,说他们在赛程的第 5 周参加比赛,那周不能参加比赛。最后,最后一个电话来自另一位教练。他说他的一名球员的父母在周日下午教 CCD 课程,而他的球队中有一半人在上 CCD 课程,并希望将我们所有的周日比赛转移到周六。足够的!

我的观点是,无论你做什么或日程安排有多完美,最好的解决方案是在将比赛日期和时间段分配给任何日程安排之前,找出尽可能多的球员/教练团队的限制或限制。这些不可预测的变量使完美的时间表变得一团糟。当不受欢迎的时间表被分发时,人们确实会生气和抱怨。当日程安排很糟糕时,一些父母不会签下他们的孩子来年参加比赛。当你有一个有两三个小孩的年轻家庭时,就会发生这种情况,而爸爸的工作限制了他在那里的能力。当有一场清晨的比赛时,我想你可以看到妈妈的困难,当一切都落在她的肩上时。

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

鲍勃·R

于 2013-12-17T17:47:59.407 回答
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));
}

我真的不明白你是如何定义时间表的,所以如果你能解释一下,我会尽力提供帮助。

于 2011-05-03T14:36:12.560 回答
0

给定一个团队表,比如 team ( teamname );

和一个固定装置表

夹具(日期;);

用“玩”分解关系

播放(fixture_date.teamname);

然后,只需遍历每个日期,然后随机选择一个团队,该团队在该日期还没有固定装置,并且没有参加过所选球队(或最近没有参加过所选球队)。

尽管一个更简单的解决方案是让 team[n](其中 n 为 0.... 团队数 -1)为不同的 X 值玩 team[(n+(number of teams)) % X]。

于 2011-05-03T15:20:12.240 回答