88 lines
2.0 KiB
Markdown
88 lines
2.0 KiB
Markdown
# Poker Task 3: EMD Distance Calculation on TURN
|
||
|
||
这是扑克Task 3的实现,专注于计算TURN阶段两手牌力分布的EMD (Earth Mover's Distance) 距离。
|
||
|
||
## 功能特点
|
||
|
||
- **TURN阶段扑克分析**: 基于已知的公共牌和底牌,计算每手牌在所有可能RIVER牌下的牌力分布
|
||
- **EMD距离计算**: 使用scipy的wasserstein_distance函数计算两个牌力分布的EMD距离
|
||
- **专业扑克评估**: 集成poker_task1的专业扑克牌评估系统,支持所有标准扑克手牌类型
|
||
|
||
## 安装和使用
|
||
|
||
### 安装依赖
|
||
|
||
```bash
|
||
# 使用uv管理依赖(推荐)
|
||
uv install
|
||
|
||
# 或使用pip
|
||
pip install scipy
|
||
```
|
||
|
||
### 运行程序
|
||
|
||
```bash
|
||
# 默认示例运行
|
||
python main.py
|
||
|
||
# 或使用uv
|
||
uv run python main.py
|
||
```
|
||
|
||
### 输入格式
|
||
|
||
程序接受以下格式的输入:
|
||
```
|
||
玩家1底牌(两张)
|
||
玩家2底牌(两张)
|
||
公共牌(TURN阶段,4张牌)
|
||
```
|
||
|
||
示例:
|
||
```
|
||
As Ks
|
||
7s 6s
|
||
8h 9d 9c Qh
|
||
```
|
||
|
||
## 运行测试
|
||
|
||
```bash
|
||
# 运行所有测试
|
||
uv run python -m pytest tests/ -v
|
||
|
||
# 或
|
||
python -m pytest tests/ -v
|
||
```
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
poker_task3/
|
||
├── poker_task3/ # 主要代码包
|
||
│ ├── card.py # 扑克牌类定义
|
||
│ ├── hand_evaluator.py # 手牌评估器
|
||
│ ├── hand_ranking.py # 手牌排名系统
|
||
│ ├── emd.py # EMD距离计算
|
||
│ ├── task3.py # Task 3主要实现
|
||
│ └── __init__.py
|
||
├── tests/ # 测试文件
|
||
│ └── test_task3.py # Task 3测试
|
||
├── main.py # 程序入口
|
||
└── README.md # 项目文档
|
||
```
|
||
|
||
## 算法原理
|
||
|
||
1. **牌力评估**: 对于每手底牌,遍历所有可能的RIVER牌(剩余47张牌)
|
||
2. **分布构建**: 统计每种手牌类型(High Card到Royal Flush)的出现次数
|
||
3. **EMD计算**: 使用scipy.stats.wasserstein_distance计算两个分布的EMD距离
|
||
|
||
## 测试覆盖
|
||
|
||
- 输入解析测试
|
||
- 牌力分布计算测试
|
||
- EMD距离计算测试
|
||
- 错误处理测试
|
||
- 不同牌力强度对比测试 |