File size: 7,205 Bytes
0642513
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# 项目计划:基于Transformer的2048游戏AI

## 技术方案概述

### 硬件约束
- AMD Ryzen 5 PRO 4650U (6核12线程) CPU
- 8GB RAM
- 无NVIDIA GPU,纯CPU训练
- 需要小型高效的模型架构

### 整体架构

```
┌─────────────────────────────────────────────────────────┐
│                    GUI主窗口 (PyQt5)                      │
├─────────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────────────────────────┐ │
│  │  2048游戏面板 │  │         训练状态面板              │ │
│  │   (4x4网格)   │  │  - 当前分数/局面分数              │ │
│  │              │  │  - 训练速度 (games/sec)          │ │
│  │              │  │  - 累积分数变化曲线               │ │
│  │              │  │  - 局面分数变化曲线               │ │
│  └──────────────┘  └──────────────────────────────────┘ │
├─────────────────────────────────────────────────────────┤
│  控制面板: [训练模式] [演示模式] [开始/停止] [AI托管]     │
└─────────────────────────────────────────────────────────┘
```

## 模块设计

### 1. 游戏核心模块 (`game.py`)

```python
class Game2048:
    """2048游戏核心逻辑"""
    
    def __init__(self):
        self.board: np.ndarray  # 4x4棋盘
        self.accumulated_score: int  # 累积分数
        self.situational_score: float  # 局面分数
        
    def reset(self) -> None: ...
    def move(self, direction: int) -> tuple[bool, bool]: ...  # (moved, game_over)
    def get_state(self) -> np.ndarray: ...  # 返回当前局面
    def calculate_situational_score(self) -> float: ...
```

**局面分数计算公式:**
```
situation_score = (
    empty_cells * 10 +                           # 空格越多越好
    max_consecutive_adjacent * 15 +              # 连续相邻数字越多越好
    log2(max_tile) * 5 -                         # 最高数字的对数
    monotonicity_penalty                         # 单调性惩罚(避免混乱)
)
```

### 2. Transformer模型 (`model.py`)

考虑到CPU训练的限制,采用小型Transformer:

```python
class Game2048Transformer(nn.Module):
    """小型Transformer用于2048决策"""
    
    def __init__(self):
        # 输入: 4x4棋盘 + 2个分数特征
        # 将棋盘展平为16个token,每个token代表一个格子的状态
        
        self.embedding = nn.Embedding(16, 64)  # 0-15 表示 log2(value),16表示空
        self.score_embedding = nn.Linear(2, 64)  # 两种分数的embedding
        
        encoder_layer = nn.TransformerEncoderLayer(
            d_model=64,
            nhead=4,
            dim_feedforward=128,
            dropout=0.1,
            batch_first=True
        )
        self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=2)
        
        self.policy_head = nn.Linear(64, 4)   # 输出4个动作的概率
        self.value_head = nn.Linear(64, 1)    # 输出状态价值
```

**模型大小估算:**
- Embedding: 17 * 64 = 1,088 参数
- Transformer (2层): ~50,000 参数
- 输出头: ~300 参数
- **总计: ~52,000 参数** - 非常小,适合CPU训练

### 3. 训练模块 (`trainer.py`)

采用 **Actor-Critic + PPO** 策略:

```python
class PPOTrainer:
    """PPO训练器"""
    
    def __init__(self, model, lr=1e-4):
        self.model = model
        self.optimizer = torch.optim.Adam(model.parameters(), lr=lr)
        
    def compute_advantage(self, rewards, values, dones):
        # 计算GAE (Generalized Advantage Estimation)
        ...
        
    def update(self, trajectories):
        # PPO更新逻辑
        ...
```

**奖励设计:**
```python
reward = (
    accumulated_score_delta * 0.3 +     # 累积分数增量(权重低)
    situational_score * 0.7 +           # 局面分数(权重高)
    game_over_penalty * (-100)          # 游戏结束惩罚
)
```

### 4. 多进程训练 (`parallel.py`)

利用6核CPU,同时运行多个游戏实例:

```python
class ParallelGameEnv:
    """并行游戏环境"""
    
    def __init__(self, num_envs=4):
        self.num_envs = num_envs
        self.envs = [Game2048() for _ in range(num_envs)]
        
    def step(self, actions: list[int]) -> list[Transition]:
        # 并行执行动作,返回状态转移
        ...
```

### 5. GUI模块 (`gui.py`)

使用 PyQt5 构建界面:

```python
class MainWindow(QMainWindow):
    """主窗口"""
    
    def __init__(self):
        self.game_widget = GameBoardWidget()
        self.stats_widget = StatsWidget()
        self.control_widget = ControlWidget()
        
        # 训练线程
        self.training_thread = TrainingThread()
        
    def switch_mode(self, mode: str): ...
    def update_display(self): ...
```

## 文件结构

```
game2048/
├── TASK.md          # 任务描述
├── PLAN.md          # 本文件
├── main.py          # 入口文件
├── game.py          # 游戏核心逻辑
├── model.py         # Transformer模型定义
├── trainer.py       # PPO训练器
├── parallel.py      # 多进程训练
├── gui.py           # GUI界面
├── utils.py         # 工具函数
├── requirements.txt # 依赖
└── checkpoints/     # 模型保存目录
```

## 实现步骤

### 阶段1: 核心游戏逻辑
1. 实现 `game.py` - 2048游戏规则
2. 实现局面分数计算
3. 编写游戏逻辑单元测试

### 阶段2: 模型与训练
4. 实现 `model.py` - Transformer模型
5. 实现 `trainer.py` - PPO训练器
6. 实现 `parallel.py` - 多进程环境
7. 验证训练流程可以运行

### 阶段3: GUI界面
8. 实现 `gui.py` - 主窗口和游戏面板
9. 实现训练状态可视化(分数曲线)
10. 实现模式切换(训练/演示)

### 阶段4: 整合与优化
11. 整合所有模块
12. 性能优化
13. 模型保存/加载功能

## 依赖

```
torch>=2.0.0
numpy>=1.24.0
PyQt5>=5.15.0
matplotlib>=3.7.0
```

## 训练策略细节

### 状态表示
- 棋盘状态:将每个格子的值转换为 log2(value),空格为0
- 分数归一化:累积分数和局面分数归一化到 [0, 1]

### 动作空间
- 0: 上
- 1: 下  
- 2: 左
- 3: 右

### 训练超参数
- Learning rate: 1e-4
- Batch size: 64
- PPO clip ratio: 0.2
- GAE lambda: 0.95
- Discount factor (gamma): 0.99
- 并行环境数: 4 (根据CPU核心数调整)

### 停止条件
- 连续100局游戏平均分数无提升
- 用户手动停止