这页写的是引擎实际在做的事,不是功能清单。给出方法和公式,你要愿意的话可以拿笔自己核对输出。
这里没有任何数字是大模型生成的。每个数都来自对你输入值的算术运算。同样的输入永远得到同样的方案,输出里任何一个数字都能追回到下面某一步。 这件事在你要向委员会解释报名费为什么定这个数、或者向教练解释为什么他的队周日早上 9 点开赛时,是有用的。
赛制决定场次,场次决定后面的一切 —— 场地小时数、裁判场次、预算科目。所以这个先算。
| 单循环 | N × (N−1) / 2 场,分 N−1 轮(N 为奇数时 N 轮,每轮一支队轮空) |
| 单败淘汰 | N−1 场。每场淘汰恰好一支队,所以无论怎么轮空都是这个数 |
| 小组 + 淘汰 | 各小组场次求和,加上每一层的淘汰赛与排位赛场次 |
队数为奇数时会补一个虚拟轮空位把对阵表凑成偶数,这就是奇数队单循环的轮数等于队数的原因。
这一步是多数表格会跳过的,也正是赛事当天拖堂的原因。容量在排任何一场比赛之前就先算。
| 一个时段多长 | 比赛时长 + 换场时间 |
| 每块场地每天几场 | floor(每天可用分钟数 / 时段长度) |
| 总容量 | 每块场地每天场次 × 场地数 × 天数 |
| 需要几块场地 | ceil(总场次 / (每块场地每天场次 × 天数)) |
| 需要几天 | ceil(总场次 / (每块场地每天场次 × 场地数)) |
容量不足时,会在排程之前就告诉你差几块场地或几天,而不是等赛程画了一半才发现。余量不足约一轮时会标为紧张,不会当作通过悄悄放行。
比赛一场一场放,每次找最早可行的时段。一个时段可行,当且仅当它不违反下面任何一条。这些是约束不是偏好 —— 排程宁可往后排一天,也不会为了凑数破坏其中一条。
| 同队休息 | 一支队打完到下一场之间必须满足最短休息时间(青少年通常设 60 分钟) |
| 每队每天场次上限 | 你设定的上限;某队当天打满后,当天不再给它排任何比赛 |
| 场地占用 | 一块场地同一时间只能进行一场,换场时间计入占用 |
| 开放时段 | 比赛只排进场地的开放时段内,且必须在同一时段内结束 |
| 场地规格匹配 | 11 人制只排进能容纳的场地;大场地可以承办小规格比赛 |
| 阶段隔离 | 同一组别的小组赛全部结束之前,不开始任何淘汰赛 |
| 轮次顺序 | 同一层内,上一轮未结束不开始下一轮 |
一块场地一天可以有多个时段(比如 9–12 和 14–18,中午空出来),时段也可以只对某一天生效。场地还可以整天关闭。
赛程落位之后再排裁判,按时间顺序从前往后走。
| 不重叠 | 已经接了时间重叠场次的裁判,不再被视为可用 |
| 回避本俱乐部 | 名单里记录了俱乐部的(写作 姓名@俱乐部),永远不会被派到自己俱乐部的比赛 |
| 负荷均衡 | 在可用裁判里,优先派目前场次最少的 |
| 每场几名 | 按赛制来:7 人制通常 1 名,11 人制 1 主裁 + 2 助理 |
裁判名单不够覆盖全部场次时,会告诉你还差多少人次,而不是给你一份有场次没裁判、你自己发现不了的赛程。
预算是从赛程长出来的,不是另外估的。场次和场地小时数直接来自第 1 到 3 步,所以两边的数字不会各说各话。
| 场地租金 | 日单价 × 场地数 × 天数(按场次或按小时计价的,按你场地的实际计价方式算) |
| 裁判费 | 每场裁判人数 × 场次 × 单价 |
| 工作人员、医疗 | 人数 × 天数 × 日单价 |
| 物资、奖品 | 按场地数和组别数分摊 |
| 预备费 | 直接成本小计的一个百分比 |
| 保本报名费 | 总支出 / 参赛队数 |
单价按市场分别取值,不是拿一个币种换算出来的。英国的场地租金、裁判费和保险结构跟国内、跟美国都不一样 —— 比如英国注册俱乐部通过郡级注册已经自带公众责任险,而美国主办方是按场次单独买当日保险。
排赛程不是\“看起来合理就行\”的活。一份看着没问题、但让某支队二十分钟内连打两场的赛程, 比没有赛程更糟 —— 因为一份看起来已经做完的文件,没有人会再去核对。
所以引擎是按\“算术 + 显式约束\”造的,不是让模型生成一份像模像样的赛程。 容量不够时它把排不下的比赛单独列出来告诉你差几场,而不是为了凑数把它们挤掉; 裁判名单不够时它报出缺口,而不是留下一批没人吹的比赛。出问题就大声说出来,这是有意为之。
在你依赖它之前,这几件事值得先知道:
场馆之间的路程时间。多场馆赛事是按场地分别排的,引擎不知道两个场馆之间开车要多久。 你的场馆离得远,就自己把路程加进休息时间设置里。
天气和顺延。没有改期引擎。丢了一天就拿剩下的天数重新生成一份 —— 很快,但那是一份新方案,不是在旧方案上打补丁。
保证你当地的价格。默认单价是分市场调研出来的参考值,是起点,不是报价。场地租金尤其离谱,同一个国家内能差三倍。 拿到本地实际价格就立刻替换掉。
球队的个别诉求。「我们只能周日上午打」这类要求可以通过到场时间约束表达,但引擎不会在互相冲突的诉求之间做权衡。 它只执行你给它的约束。