「五羽轮比」双打接力赛出场顺序优化模型与博弈分析

校内数模练习赛 A 题 — 比赛出场顺序问题。本文构建了基于 Bradley-Terry 模型的得分率预测、马尔可夫链蒙特卡洛仿真与 Maximin 鲁棒优化的完整模型体系,获练习赛三等奖

一、问题背景与规则解析

"五羽轮比"是一种 50 分制双打接力赛,核心规则如下:

对阵双方各派出 5 名选手,出场顺序赛前确定后不可更改

任意一方率先得到 10、20、30、40 分时更换选手

出场组合构成首尾相接的循环序列:若出场顺序为 A1​,A2​,A3​,A4​,A5​,则对阵组合依次为 (A1​,A2​)→(A2​,A3​)→(A3​,A4​)→(A4​,A5​)→(A5​,A1​)

该问题的核心矛盾在于:如何利用局部的历史对战数据,评估任意两人组合的对抗能力,并通过排列组合寻找到在特定博弈环境下的最优出场序列。

本题分为三个子问题:

问题

场景

难度

问题一

对方顺序固定,求我方最优

单边静态优化

问题二

对方针对我方反制,我方需稳健调整

不完全信息博弈

问题三

双方从 6 人中选 5 人,纳什均衡分析

零和博弈均衡

二、基础模型构建

2.1 得分率预测模型

设我方组合为 Aij​=(Ai​,Aj​),对方组合为 Bkl​=(Bk​,Bl​)。定义 E(Aij​,Bkl​) 为我方在单回合中赢下 1 分的期望概率。

对于有历史记录的组合,采用比分加权平均法:

E(Aij​,Bkl​)=SA​+SB​SA​​(1)

例如,(A1​,A2​) 对阵 (B1​,B2​) 的历史比分为 23:21、21:18、21:19,我方总得分 65,对方 58,得分率 E=65/123≈0.528。

对于无历史记录的组合,采用 Bradley-Terry 模型进行个体能力拆解:

E(Aij​,Bkl​)=sigmoid(2αi​+αj​​+γij​−2βk​+βl​​−δkl​)(2)

其中 αi​、βk​ 为选手个体能力参数,γij​、δkl​ 为双打协同度参数。通过交替最小二乘法(ALS)迭代求解,得到选手能力矩阵如下:

选手

A1​

A2​

A3​

A4​

A5​

能力值

0.2683

0.2367

0.2208

-0.1021

-0.2399

选手

B1​

B2​

B3​

B4​

B5​

能力值

0.1953

0.0655

-0.0810

-0.0160

-0.2521

由此可补全所有组合对阵的得分率矩阵 M,为后续仿真提供数据基础。

2.2 马尔可夫链蒙特卡洛赛事仿真

五羽轮比的动态特性在于每对组合的出场时间不固定(取决于比分达到整十分的速度),传统封闭式解析难以处理。我们构建马尔可夫链蒙特卡洛(MCMC)仿真模型:

设我方出场顺序 OA​=[o1​,…,o5​],对方 OB​=[B1​,…,B5​]。第 t 阶段的组合为:

CtA​=(ot​, o(tmod5)+1​),CtB​=(Bt​, B(tmod5)+1​)(3)

每一分的胜负服从伯努利分布:

Xt​∼Bernoulli(pt​),pt​=M(CtA​,CtB​)(4)

仿真终止条件为 SA(n)​≥50 或 SB(n)​≥50。通过 N=3000 次独立仿真消除随机误差,得到任意出场顺序的期望胜率。

三、问题一求解:单边静态优化

已知对方出场顺序固定为 B1​,B2​,B3​,B4​,B5​,求我方最优出场顺序。

3.1 求解方法

我方 5 名选手的全排列共 5!=120 种可行策略,解空间极小,采用全排列遍历 + MCMC 仿真求全局最优解:

OA​∈Ωmax​Pwin​(OA​,OB_fixed​)(5)

3.2 结果分析

经仿真求解,最优出场顺序为 [A4​,A5​,A1​,A2​,A3​],预期胜率 81.30%。

排名

出场顺序

胜率

组合序列

1

A4​→A5​→A1​→A2​→A3​

81.30%

A4​A5​→A1​A5​→A1​A2​→A2​A3​→A3​A4​

2

A5​→A4​→A3​→A2​→A1​

80.20%

A4​A5​→A3​A4​→A2​A3​→A1​A2​→A1​A5​

3

A3​→A4​→A5​→A1​→A2​

79.50%

A3​A4​→A4​A5​→A1​A5​→A1​A2​→A2​A3​

4

A1​→A5​→A4​→A3​→A2​

79.20%

A1​A5​→A4​A5​→A3​A4​→A2​A3​→A1​A2​

5

A2​→A5​→A1​→A4​→A3​

78.00%

A2​A5​→A1​A5​→A1​A4​→A3​A4​→A2​A3​

最优顺序的阶段对位如下:

阶段

分阈值

我方组合

对方组合

得分率

1

10

(A4​,A5​)

(B1​,B2​)

0.3499

2

20

(A1​,A5​)

(B2​,B3​)

0.5505

3

30

(A1​,A2​)

(B3​,B4​)

0.5587

4

40

(A2​,A3​)

(B4​,B5​)

0.6372

5

50

(A3​,A4​)

(B1​,B5​)

0.5473

3.3 策略解读

最优顺序呈现出典型的田忌赛马式阶梯配置:

第一阶段以低得分率组合 (A4​,A5​) "避其锋芒",消耗对方的强势阶段

第二至第四阶段逐步释放 (A1​,A2​)、(A2​,A3​) 等高能力组合

第四阶段得分率高达 0.6372,在比赛后期关键分上最大化胜率

胜率排名前十的出场组合均呈现"高能力组合向中后阶段集中"的排布特征,印证了阶段权重与组合能力匹配是提升静态胜率的核心逻辑。

四、问题二求解:不完全信息博弈

我方原计划顺序 [A1​,A2​,A3​,A4​,A5​],对方将从针对该顺序胜率最高的三种反制策略中择一。我方应如何调整?

4.1 对方反制策略识别

在零和博弈框架下,对方的决策目标为最小化我方胜率。对对方 120 种全排列逐一仿真,得到针对我方原定顺序胜率最低的 TOP3 反制策略:

编号

对方出场顺序

对方胜率

我方胜率

反制 1

B2​→B5​→B4​→B3​→B1​

47.17%

52.83%

反制 2

B3​→B4​→B5​→B2​→B1​

46.77%

53.23%

反制 3

B4​→B5​→B2​→B1​→B3​

45.97%

54.03%

我方原定顺序在对方最狠的反制下,最坏胜率仅 52.83%,暴露了固定阵型易被针对性克制的脆弱性。

4.2 Maximin 鲁棒优化模型

采用博弈论中的 Maximin 极大极小准则构建鲁棒优化模型:

OA∗​=argOA​∈ΩA​max​[OB​∈Badv​min​Pwin​(OA​,OB​)](6)

内层 min :求解给定顺序在对方所有反制策略下的最坏场景胜率

外层 max :在所有可行顺序中,找到最坏胜率最高的鲁棒最优解

4.3 结果分析

经全排列遍历求解,鲁棒性排名前十的出场顺序如下:

排名

出场顺序

最坏胜率

平均胜率

1

A4​→A5​→A1​→A2​→A3​

67.00%

69.11%

2

A1​→A5​→A4​→A3​→A2​

65.83%

67.21%

3

A3​→A4​→A5​→A1​→A2​

65.27%

66.52%

4

A1​→A5​→A3​→A4​→A2​

65.17%

65.28%

5

A2​→A5​→A1​→A4​→A3​

65.07%

66.59%

与初始顺序的对比:

评价指标

原定顺序

鲁棒最优顺序

提升

最坏场景胜率

52.83%

67.00%

+14.17 pp

平均胜率

53.36%

69.11%

+15.75 pp

4.4 策略解读

有趣的是,鲁棒最优顺序 [A4​,A5​,A1​,A2​,A3​] 与问题一的静态最优顺序完全一致。这说明该顺序兼具:

静态最优性:在确定性对阵下胜率最高(81.30%)

鲁棒最优性:在敌方最佳反制下底线最高(67.00%)

该策略的核心逻辑是:将最强组合 (A2​,A3​) 放在第四阶段(分阈值 30→40),既可规避对方在前期的针对性压制,又能在比赛后半段的"决胜阶段"获得最大化得分优势。

五、模型性能验证

5.1 关键假设

假设

内容

合理性

A1

每分胜负独立同分布

常规统计假设

A2

历史数据能反映真实能力

数据量有限但覆盖主要组合

A3

个体能力可加性

Bradley-Terry 模型已验证有效

5.2 模型评价

计算效率:120 种排列 × 3000 次仿真 = 36 万次模拟,代码在单机上可在数分钟内完成

稳定性:3000 次独立仿真有效消除随机误差,重复实验胜率波动 < 1%

可推广性:模型框架可适配同类多人制、分阶段接力类团体赛事的出场策略优化

六、结论

静态最优:对方固定顺序下,最优出场顺序为 [A4​,A5​,A1​,A2​,A3​],胜率 81.30%

鲁棒最优:不完全信息博弈下,同一顺序将最坏场景胜率从 52.83% 提升至 67.00%,实现抗克制与高胜率的统一

方法论:Bradley-Terry 个体能力拆解 + 马尔可夫链蒙特卡洛仿真 + Maximin 鲁棒优化的组合方法,有效解决了历史数据不完整、赛制动态性强、对抗信息不对称三大难题

附录:核心代码

得分率计算与 Bradley-Terry 模型

12345678910111213141516import numpy as npfrom itertools import permutationsdef calculate_score_rate(scores): """根据历史比分计算得分率""" my_total = sum(s[0] for s in scores) opp_total = sum(s[1] for s in scores) if my_total + opp_total == 0: return 0.5 return my_total / (my_total + opp_total)def sigmoid(x): return 1 / (1 + np.exp(-x))# Bradley-Terry 模型:个体能力 + 协同度拆解# E(A_ij, B_kl) = sigmoid((α_i+α_j)/2 + γ_ij - (β_k+β_l)/2 - δ_kl)

五羽轮比 MCMC 仿真

1234567891011121314151617181920212223242526272829303132333435363738394041class BadmintonRelaySimulator: def __init__(self, score_matrix): self.score_matrix = score_matrix def get_combinations(self, order): """根据出场顺序生成循环组合序列""" n = len(order) return [(order[i], order[(i + 1) % n]) for i in range(n)] def simulate_match(self, my_order, opp_order, num_simulations=3000): """蒙特卡洛仿真单场比赛""" my_combos = self.get_combinations(my_order) opp_combos = self.get_combinations(opp_order) wins = 0 for _ in range(num_simulations): my_score, opp_score = 0, 0 stage = 0 while my_score < 50 and opp_score < 50: my_pair = my_combos[stage] opp_pair = opp_combos[stage] p_win = self.score_matrix.get((my_pair, opp_pair), 0.5) # 模拟该阶段内的每一分 while my_score < 50 and opp_score < 50: if np.random.random() < p_win: my_score += 1 else: opp_score += 1 # 检查阶段切换 threshold = (stage + 1) * 10 if my_score >= threshold or opp_score >= threshold: stage = min(stage + 1, 4) break if my_score >= 50: wins += 1 return wins / num_simulations

全排列寻优与 Maximin 鲁棒优化

12345678910111213141516171819202122232425262728293031323334353637# 问题一:静态寻优my_players = ['A1', 'A2', 'A3', 'A4', 'A5']opp_order_fixed = ['B1', 'B2', 'B3', 'B4', 'B5']all_permutations = list(permutations(my_players))results = []for perm in all_permutations: win_rate = simulator.simulate_match(list(perm), opp_order_fixed) results.append((list(perm), win_rate))results.sort(key=lambda x: x[1], reverse=True)best_order, best_rate = results[0]print(f"最优顺序: {best_order}, 胜率: {best_rate*100:.2f}%")# 问题二:Maximin 鲁棒优化# 先识别对方的 TOP3 反制策略opp_results = []for opp_perm in all_permutations: my_win_rate = simulator.simulate_match( ['A1','A2','A3','A4','A5'], list(opp_perm) ) opp_results.append((list(opp_perm), my_win_rate))opp_results.sort(key=lambda x: x[1]) # 我方胜率最低 = 对方最优adv_strategies = [s[0] for s in opp_results[:3]]# Maximin:最大化最坏场景胜率robust_results = []for perm in all_permutations: my_order = list(perm) worst_win_rate = min( simulator.simulate_match(my_order, opp) for opp in adv_strategies ) robust_results.append((my_order, worst_win_rate))robust_results.sort(key=lambda x: x[1], reverse=True)

声明:本文的部分代码和结论分析由 kimi-2.5pro 辅助完成。题目来源为 2026 数模培优营数模练习赛 A 题。