Flying Start 计分引擎与来自 10 个国家 96 个帆船俱乐部的 75,693 条真实 Sailwave 成绩的独立对比。
在 75,693 次逐一对比中,Flying Start 计分引擎与 Sailwave 的匹配率达 99% 匹配率。未发现任何计分错误。所有不匹配均可解释为测试数据质量问题或不影响结果的微小舍入差异。
我们编写了一个自动化测试框架,获取 Sailwave 成绩数据,通过 Flying Start 计分引擎处理,并将每个计算值与 Sailwave 的结果进行对比。测试针对每位参赛者每场比赛检查三项内容:
对比使用两种验证模式:
当源数据包含实际用时和差点评级时,我们使用相应公式(PY、IRC、YTC 等)从头重新计算修正时间,并与 Sailwave 的修正时间进行对比。这验证了整个流程:实际用时 → 修正时间 → 名次 → 积分。
当源数据仅包含名次和积分(常见于系列赛汇总页面)时,我们验证名次到积分的映射是否遵循正确的计分系统规则。这验证了处罚积分分配、奖励积分计算和 SCP 计分。
我们编写了一个爬虫,系统性地抓取 Sailwave 公开成绩目录,该目录托管了全球帆船俱乐部的已发布成绩。对于每个俱乐部,我们获取最多 40 个成绩页面,提取参赛者数据、比赛成绩和处罚代码,然后转换为结构化格式进行验证。
对于法尔茅斯航行周 2025 的六支船队,我们手动抓取了包含完整实际用时和修正时间的各场比赛页面,以实现深度修正时间验证。
| 来源 | 文件数 | 比赛 | 对比次数 | 匹配率 | 重大不匹配 | 轻微不匹配 |
|---|---|---|---|---|---|---|
| 抓取(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 个重大不匹配均为测试数据的数据质量问题(详见下文)。
计分引擎实现了以下 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 平局处理 | 通过平局船队的名次对比测试 |
我们刻意跨越广泛的地域和组织范围进行测试。索伦特的俱乐部竞赛与威尔士水库的周三晚间竞赛或澳大利亚 O'pen Skiff 锦标赛有着不同的特点。计分引擎必须能够处理所有这些情况。
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)。
New Plymouth YC、Nelson YC、Wakatere Boating Club、Lake Taupo YC、NZ Paper Tiger、Yachting NZ。
Manly YC、Perth SC、Maroochy、Hobie WA、Lake Cootharaba SC、Open Skiff 级别(全国和州锦标赛)。
南非(Bloemfontein YC)、瑞典(KSSS)、匈牙利(通过 hunresults 获取成绩)、葡萄牙、美国(KHYC — King Harbor YC)、加拿大(Whitby YC)。
来自海湾航程的六支船队——IRC 1、IRC 2、IRC 3、YTC 巡洋舰、YTC 四分之一吨级和 Firebird——完整实际用时和修正时间从托管于 sailwave.com/results/FSW.
在 75,693 次对比中,1,090 次未完全匹配。以下是每类不匹配的情况、原因及其影响。
三项均为测试数据中的数据质量问题,而非计分引擎错误。
不匹配: 积分——Sailwave 显示 11,Flying Start 显示 8。
根本原因: 周三香槟赛有 3 艘非常规系列赛来宾船(Autarky、Infinity、Passion)。我们抓取的 XML 未包含它们,因此船队规模为 10 而非 13。Percy 在我们的数据中以 10 艘中第 8 名完赛,而在 Sailwave 数据中以 13 艘中第 11 名完赛。
结论: 两个计分引擎均正确。差异在于输入数据,而非计算过程。
不匹配: 积分——Sailwave 显示 12,Flying Start 显示 9。
根本原因: 与上述情况相同。来宾船只在 Sailwave 数据中虚增了船队规模。
不匹配: 修正时间——Sailwave 显示 1:10:13,Flying Start 显示 1:08:32。
根本原因: Tahini 在周三使用了与系列赛其余场次(1080)不同的 YTC 评级(1054)。我们的 XML 对所有比赛使用了 1080。修正时间公式为 elapsed × 1000 ÷ rating,因此不同评级 = 不同修正时间。
结论: 两个公式均正确。差异在于差点数据,而非计算过程。
全部 1,087 项轻微不匹配分为两类:
Sailwave 与 Flying Start 之间存在 1-3 秒的差异,由 Sailwave 计算链中的中间舍入引起。例如,IRC 修正时间 = 实际用时 × TCC。如果实际用时 = 3,428 秒,TCC = 1.072:
3428 × 1.072 = 3674.816 → 3675s影响: 无影响。修正时间 1-3 秒的差异从不改变完赛名次——船只之间通常相差数分钟。
0.1-0.3 分的差异,其中 Sailwave 的奖励积分小数分数或 SCP 百分比计算略有不同。例如,奖励积分制中第三名应为恰好 5.7 分,但某些 Sailwave 版本内部似乎使用略有不同的浮点精度。
影响: 可忽略不计。这些小数差异从不改变积分榜,因为它们小于任意两个完赛名次之间的差距。
在测试过程中,我们发现了 Sailwave 在不同俱乐部之间行为不一致的一个领域。我们并非声称这是一个错误——它可能是一个有意为之的配置选项——但值得为从 Sailwave 迁移的竞赛裁判记录在案。
Sailwave 使用 TLE 作为未在时限内完赛船只的处罚代码。该代码未出现在帆船竞赛规则(RRS)中。RRS 中的对应代码为 DNF(未完赛)。
我们发现 Sailwave 在不同俱乐部中对 TLE 的处理不一致:
starters + 1 (与 DNF 相同)last finisher's position + 1Flying Start 将 TLE 视为等同于 DNF(starters + 1),这与最常见的 Sailwave 行为一致,并符合 RRS 原则:起航但未完赛的船只获得 starters + 1 分。
这种不一致性导致了部分轻微不匹配。如果您的俱乐部使用具有特定计分规则的 TLE,请 告知我们 我们将确保 Flying Start 与您的做法一致。
尽管测试了 4,144 场比赛,我们未发现任何 Sailwave 根据 RRS 规则产生错误结果的情况。所有不匹配均可通过舍入、数据质量或上述 TLE 歧义来解释。Sailwave 成为行业标准超过 20 年是有充分理由的——它的数学计算是正确的。
我们还注意到,大多数对比(75,693 次中的 74,391 次)是来自系列赛汇总页面的仅积分对比。深度修正时间验证涵盖来自法尔茅斯周的 1,302 次对比。我们欢迎获取更多已发布实际用时和修正时间的赛事,以加强本验证。
测试框架、抓取数据和完整结果发布于专用开源仓库:
github.com/IDSTUK/SW-FS-Scoring-Engine-Verification
计分引擎源码 • 验证器 • 测试框架 • 1,266 个抓取数据来源
| 路径 | 描述 |
|---|---|
| scripts/soak-test.ts | CLI 测试运行器——解析 XML,运行验证,生成报告 |
| scripts/scrape-sailwave.ts | Sailwave HTML 成绩页面的网页爬虫 |
| verifier/sailwaveVerifier.ts | 对比引擎——重新计算修正时间、名次、积分 |
| scoring-engine/ | 计分引擎本体——raceScorer、seriesScorer、handicapCalculator、tieBreaker |
| data/sources.json | 全部 1,266 个抓取来源 URL 的完整日志 |
| data/soak-results.json | 完整测试结果,含每个文件的匹配率和不匹配详情 |
| REPORT.md | 详细发现报告 |
爬虫会跳过之前已抓取的 URL(记录于 sources.json),仅抓取新页面。整个测试套件在抓取的数据上运行时间不到 60 秒。
所有 Sailwave 成绩数据均来源于公开发布的成绩,位于 sailwave.com/results。Sailwave 是 Jon Mayall 的商标。Flying Start 与 Sailwave 无关联。