feat: 添加石头剪刀布预测辅助系统

实现基于马尔可夫转移、频率统计和周期检测的融合预测算法,包含主程序、回测评估脚本、README 文档、MIT 许可证及 .gitignore 配置。
这个提交包含在:
2026-08-24 10:53:03 +08:00
当前提交 de44825e21
共修改 6 个文件,包含 436 行新增和 0 行删除
+78
查看文件
@@ -0,0 +1,78 @@
# 猜拳预测辅助系统 (Rock-Paper-Scissors Predictor)
一个基于序列预测的「石头剪刀布」辅助 AI。它通过分析对手的历史出手习惯,
融合多种预测模型,给出下一局克制对手的推荐出手。
> ⚠️ 说明:若对手**完全随机**出拳,任何算法胜率都趋近于 33.3%,无法被预测。
> 本系统的价值在于识别**有习惯 / 有模式**的对手(如偏好某手、固定循环、受上一手影响)。
## 原理
系统同时使用三种互补的预测模型,并对它们融合投票:
| 模型 | 思路 | 适用场景 |
| --- | --- | --- |
| 马尔可夫一阶转移 | 统计「上一手 → 这一手」的转移频率,预测下一手 | 对手受上一手影响 |
| 频率统计 | 预测对手最常出的手 | 对手有固定偏好 |
| 周期检测 | 检测对手是否按固定长度循环出拳 | 对手按循环模式 |
融合策略:三模型**投票(少数服从多数)**;平票时按置信度加权选择。
最终根据预测的对手出手,推荐能克制它的一手(`win_map`)。
转移矩阵使用 **拉普拉斯平滑**(`np.ones((3,3))` 初始化),避免未见过的转移概率为 0。
## 安装
```bash
pip install -r requirements.txt
```
## 使用
```bash
python rock-paper-scissors.py
```
按提示输入对手的出手:
- `1` = 拳头
- `2` = 剪刀
- `3` = 布
- `q` = 退出
每局程序会输出:本局胜负、AI 预测的对手下一手、推荐的出手,以及累积统计。
历史记录会持久化到 `rps_history.json`。
## 评估 / 回测
`evaluate.py` 用多种模拟对手(随机、偏好、循环、马尔可夫依赖)对算法做回测,
报告胜率,验证算法在「有模式」的对手上显著优于随机基线(约 33.3% 的随机胜率)。
```bash
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