计分引擎验证

Flying Start 计分引擎与来自 10 个国家 96 个帆船俱乐部的 75,693 条真实 Sailwave 成绩的独立对比。

75,693
对比次数
4,144
比赛
96
俱乐部
0
发现的错误

结论:已准备好投入生产

在 75,693 次逐一对比中,Flying Start 计分引擎与 Sailwave 的匹配率达 99% 匹配率。未发现任何计分错误。所有不匹配均可解释为测试数据质量问题或不影响结果的微小舍入差异。

目录

  1. 方法论
  2. 结果摘要
  3. 测试内容
  4. 数据来源——96 个俱乐部,10 个国家
  5. 不匹配分析
  6. 发现的 Sailwave 特殊行为
  7. 局限性与注意事项
  8. 原始数据与可重现性

1. 方法论

我们编写了一个自动化测试框架,获取 Sailwave 成绩数据,通过 Flying Start 计分引擎处理,并将每个计算值与 Sailwave 的结果进行对比。测试针对每位参赛者每场比赛检查三项内容:

  1. 修正时间 ——我们的差点公式是否产生相同的秒数?
  2. 名次 ——我们是否分配相同的完赛名次?
  3. 积分 ——我们是否计算出相同的分数?

对比使用两种验证模式:

深度验证(含实际用时)

当源数据包含实际用时和差点评级时,我们使用相应公式(PY、IRC、YTC 等)从头重新计算修正时间,并与 Sailwave 的修正时间进行对比。这验证了整个流程:实际用时 → 修正时间 → 名次 → 积分。

积分验证(不含实际用时)

当源数据仅包含名次和积分(常见于系列赛汇总页面)时,我们验证名次到积分的映射是否遵循正确的计分系统规则。这验证了处罚积分分配、奖励积分计算和 SCP 计分。

数据收集方式

我们编写了一个爬虫,系统性地抓取 Sailwave 公开成绩目录,该目录托管了全球帆船俱乐部的已发布成绩。对于每个俱乐部,我们获取最多 40 个成绩页面,提取参赛者数据、比赛成绩和处罚代码,然后转换为结构化格式进行验证。

对于法尔茅斯航行周 2025 的六支船队,我们手动抓取了包含完整实际用时和修正时间的各场比赛页面,以实现深度修正时间验证。

2. 结果摘要

来源 文件数 比赛 对比次数 匹配率 重大不匹配 轻微不匹配
抓取(96 个俱乐部) 655 4,088 74,391 99% 0 1,068
法尔茅斯周(深度验证) 6 56 1,302 99% 3 19
合计 661 4,144 75,693 99% 3 1,087

0 个由引擎逻辑导致的重大不匹配。 3 个重大不匹配均为测试数据的数据质量问题(详见下文)。

3. 测试内容

计分引擎实现了以下 RRS(帆船竞赛规则)功能。所有功能均在测试中得到验证:

功能覆盖范围
PY 差点(英国小型帆船)在 60 多个英国俱乐部中测试
IRC 差点(国际游艇)在法尔茅斯周 IRC1/2/3 船队中测试
YTC 差点(英国巡洋舰)在法尔茅斯周 YTCE/YTCQ 船队中测试
低积分制计分在全部 4,144 场比赛中测试
奖励积分制计分在使用该制度的俱乐部中测试
DNS / DNF / DNC 处罚在所有俱乐部中测试
OCS / DSQ / RET / UFD / BFD在成绩中出现的情况下测试
RRS 规则 A5.3(可选处罚计分)所有测试运行的默认设置——在区域船只数 + 1 与报名总数 + 1
SCP(计分处罚)在俱乐部应用百分比处罚的情况下测试
舍弃规则通过系列赛积分榜对比测试
RRS 附录 A8 平局处理通过平局船队的名次对比测试

4. 数据来源——96 个俱乐部,10 个国家

我们刻意跨越广泛的地域和组织范围进行测试。索伦特的俱乐部竞赛与威尔士水库的周三晚间竞赛或澳大利亚 O'pen Skiff 锦标赛有着不同的特点。计分引擎必须能够处理所有这些情况。

英国(60 多个俱乐部)

Hayling Island SC、Parkstone YC、Poole YC、Warsash SC、Torbay SC、Cardiff Bay YC、Delph SC、Mengeham Rythe SC、Burghfield SC、Oxford SC、Chichester YC、Brancaster Staithe SC、Bexhill SC、Salcombe YC、Paignton SC、Brixham YC、Medway YC、Bartley SC、Northampton SC、Largo Bay SC、RCYC、Ranelagh SC、Twickenham YC、Cambridge YC、Ogston SC、Rutland SC、Bala SC、Maylandsea Bay SC、Royal Lymington YC、Flushing SC、Chase SC、Chipstead SC、Rock SC、BCYC、YDSC,以及众多级别协会(Solo、Osprey、Fireball、29er、ILCA UK、ITCA、UKWA、Redwings)。

新西兰(8 个俱乐部)

New Plymouth YC、Nelson YC、Wakatere Boating Club、Lake Taupo YC、NZ Paper Tiger、Yachting NZ。

澳大利亚(6 个俱乐部)

Manly YC、Perth SC、Maroochy、Hobie WA、Lake Cootharaba SC、Open Skiff 级别(全国和州锦标赛)。

其他国家

南非(Bloemfontein YC)、瑞典(KSSS)、匈牙利(通过 hunresults 获取成绩)、葡萄牙、美国(KHYC — King Harbor YC)、加拿大(Whitby YC)。

法尔茅斯航行周 2025

来自海湾航程的六支船队——IRC 1、IRC 2、IRC 3、YTC 巡洋舰、YTC 四分之一吨级和 Firebird——完整实际用时和修正时间从托管于 sailwave.com/results/FSW.

5. 不匹配分析

在 75,693 次对比中,1,090 次未完全匹配。以下是每类不匹配的情况、原因及其影响。

重大不匹配(共 3 项)

三项均为测试数据中的数据质量问题,而非计分引擎错误。

YTCE 法尔茅斯 R4 — Percy(John & Julie Roberts)

不匹配: 积分——Sailwave 显示 11,Flying Start 显示 8。

根本原因: 周三香槟赛有 3 艘非常规系列赛来宾船(Autarky、Infinity、Passion)。我们抓取的 XML 未包含它们,因此船队规模为 10 而非 13。Percy 在我们的数据中以 10 艘中第 8 名完赛,而在 Sailwave 数据中以 13 艘中第 11 名完赛。

结论: 两个计分引擎均正确。差异在于输入数据,而非计算过程。

YTCE 法尔茅斯 R4 — Aardvarc(Philip Cook)

不匹配: 积分——Sailwave 显示 12,Flying Start 显示 9。

根本原因: 与上述情况相同。来宾船只在 Sailwave 数据中虚增了船队规模。

YTCQ 法尔茅斯 R4 — Tahini(Guy English)

不匹配: 修正时间——Sailwave 显示 1:10:13,Flying Start 显示 1:08:32。

根本原因: Tahini 在周三使用了与系列赛其余场次(1080)不同的 YTC 评级(1054)。我们的 XML 对所有比赛使用了 1080。修正时间公式为 elapsed × 1000 ÷ rating,因此不同评级 = 不同修正时间。

结论: 两个公式均正确。差异在于差点数据,而非计算过程。

轻微不匹配(共 1,087 项)

全部 1,087 项轻微不匹配分为两类:

修正时间舍入(19 项不匹配)

Sailwave 与 Flying Start 之间存在 1-3 秒的差异,由 Sailwave 计算链中的中间舍入引起。例如,IRC 修正时间 = 实际用时 × TCC。如果实际用时 = 3,428 秒,TCC = 1.072:

影响: 无影响。修正时间 1-3 秒的差异从不改变完赛名次——船只之间通常相差数分钟。

奖励积分/SCP 计分中的积分舍入(1,068 项不匹配)

0.1-0.3 分的差异,其中 Sailwave 的奖励积分小数分数或 SCP 百分比计算略有不同。例如,奖励积分制中第三名应为恰好 5.7 分,但某些 Sailwave 版本内部似乎使用略有不同的浮点精度。

影响: 可忽略不计。这些小数差异从不改变积分榜,因为它们小于任意两个完赛名次之间的差距。

6. 发现的 Sailwave 特殊行为

在测试过程中,我们发现了 Sailwave 在不同俱乐部之间行为不一致的一个领域。我们并非声称这是一个错误——它可能是一个有意为之的配置选项——但值得为从 Sailwave 迁移的竞赛裁判记录在案。

TLE(超出时限)——不一致的计分

Sailwave 使用 TLE 作为未在时限内完赛船只的处罚代码。该代码未出现在帆船竞赛规则(RRS)中。RRS 中的对应代码为 DNF(未完赛)。

我们发现 Sailwave 在不同俱乐部中对 TLE 的处理不一致:

Flying Start 将 TLE 视为等同于 DNF(starters + 1),这与最常见的 Sailwave 行为一致,并符合 RRS 原则:起航但未完赛的船只获得 starters + 1 分。

这种不一致性导致了部分轻微不匹配。如果您的俱乐部使用具有特定计分规则的 TLE,请 告知我们 我们将确保 Flying Start 与您的做法一致。

未发现 Sailwave 错误

尽管测试了 4,144 场比赛,我们未发现任何 Sailwave 根据 RRS 规则产生错误结果的情况。所有不匹配均可通过舍入、数据质量或上述 TLE 歧义来解释。Sailwave 成为行业标准超过 20 年是有充分理由的——它的数学计算是正确的。

7. 局限性与注意事项

本测试不涵盖的内容

我们还注意到,大多数对比(75,693 次中的 74,391 次)是来自系列赛汇总页面的仅积分对比。深度修正时间验证涵盖来自法尔茅斯周的 1,302 次对比。我们欢迎获取更多已发布实际用时和修正时间的赛事,以加强本验证。

8. 原始数据与可重现性

测试框架、抓取数据和完整结果发布于专用开源仓库:

github.com/IDSTUK/SW-FS-Scoring-Engine-Verification
计分引擎源码 • 验证器 • 测试框架 • 1,266 个抓取数据来源

路径描述
scripts/soak-test.tsCLI 测试运行器——解析 XML,运行验证,生成报告
scripts/scrape-sailwave.tsSailwave HTML 成绩页面的网页爬虫
verifier/sailwaveVerifier.ts对比引擎——重新计算修正时间、名次、积分
scoring-engine/计分引擎本体——raceScorer、seriesScorer、handicapCalculator、tieBreaker
data/sources.json全部 1,266 个抓取来源 URL 的完整日志
data/soak-results.json完整测试结果,含每个文件的匹配率和不匹配详情
REPORT.md详细发现报告

重现测试

cd rc-admin npm install npx tsx scripts/scrape-sailwave.ts # 抓取新鲜数据 npx tsx scripts/soak-test.ts <directory> # 运行验证

爬虫会跳过之前已抓取的 URL(记录于 sources.json),仅抓取新页面。整个测试套件在抓取的数据上运行时间不到 60 秒。

所有 Sailwave 成绩数据均来源于公开发布的成绩,位于 sailwave.com/results。Sailwave 是 Jon Mayall 的商标。Flying Start 与 Sailwave 无关联。