de44825e21114893604e5ff37875fb3a8e1cd076
实现基于马尔可夫转移、频率统计和周期检测的融合预测算法,包含主程序、回测评估脚本、README 文档、MIT 许可证及 .gitignore 配置。
猜拳预测辅助系统 (Rock-Paper-Scissors Predictor)
一个基于序列预测的「石头剪刀布」辅助 AI。它通过分析对手的历史出手习惯, 融合多种预测模型,给出下一局克制对手的推荐出手。
⚠️ 说明:若对手完全随机出拳,任何算法胜率都趋近于 33.3%,无法被预测。 本系统的价值在于识别有习惯 / 有模式的对手(如偏好某手、固定循环、受上一手影响)。
原理
系统同时使用三种互补的预测模型,并对它们融合投票:
| 模型 | 思路 | 适用场景 |
|---|---|---|
| 马尔可夫一阶转移 | 统计「上一手 → 这一手」的转移频率,预测下一手 | 对手受上一手影响 |
| 频率统计 | 预测对手最常出的手 | 对手有固定偏好 |
| 周期检测 | 检测对手是否按固定长度循环出拳 | 对手按循环模式 |
融合策略:三模型投票(少数服从多数);平票时按置信度加权选择。
最终根据预测的对手出手,推荐能克制它的一手(win_map)。
转移矩阵使用 拉普拉斯平滑(np.ones((3,3)) 初始化),避免未见过的转移概率为 0。
安装
pip install -r requirements.txt
使用
python rock-paper-scissors.py
按提示输入对手的出手:
1= 拳头2= 剪刀3= 布q= 退出
每局程序会输出:本局胜负、AI 预测的对手下一手、推荐的出手,以及累积统计。
历史记录会持久化到 rps_history.json。
评估 / 回测
evaluate.py 用多种模拟对手(随机、偏好、循环、马尔可夫依赖)对算法做回测,
报告胜率,验证算法在「有模式」的对手上显著优于随机基线(约 33.3% 的随机胜率)。
python evaluate.py
示例输出(seed=42, 各 2000 局):
| 对手类型 | 预测AI胜率 | 随机基线 | 说明 |
|---|---|---|---|
| 完全随机 | ~33.6% | ~33.3% | 无模式,算法不占优(符合预期) |
| 偏好出布(60%) | ~66.8% | ~33.3% | 频率模型生效 |
| 固定循环(拳头→剪刀→布) | ~99.8% | ~33.3% | 周期检测完美工作 |
| 一阶马尔可夫依赖 | ~47.9% | ~33.3% | 转移矩阵学习生效 |
结论:算法只在对手存在可学习模式时显著优于随机;面对完全随机的对手, 胜率收敛到理论值,不会过拟合或作弊。
文件结构
rock-paper-scissors.py 主程序(人机交互 + 预测核心)
evaluate.py 回测/评估脚本
rps_history.json 对局历史记录(自动生成)
requirements.txt 依赖
README.md 说明文档
License
MIT
语言
Python
100%