# 第四次作业：神经网络与搜索——重力四子棋

作业灵感来源于 AlphaZero，结合神经网络与蒙特卡洛树搜索（MCTS），通过自我对弈训练重力四子棋 AI。按个人喜好选择Python脚本版或 Notebook 版中的一个引导教程完成作业即可，使用方法见 [README](README.md)。

## 游戏规则

棋盘为 6 行、7 列。双方轮流选列，棋子落至该列最下方空位；横、竖或斜向先连成四子者获胜。棋盘填满且无人获胜则平局。列号为 `0～6`。

## 一、实现搜索

补全 `starter/mcts.py`，或 Notebook 第三节的四个步骤：

1. **选择**：根据价值与探索项选择子节点。
2. **扩展**：为合法落子建立子节点。
3. **回传**：累计路径上的访问次数与价值。
4. **搜索循环**：组合上述步骤，返回各列访问次数。

规则、节点和价值视角转换已提供。后续训练与对战须使用自己实现的搜索。

## 二、自我对弈训练

补全 `starter/train.py`，或 Notebook 第四、五节：

1. 将访问次数转为落子分布，采样动作并记录落子前的局面。
2. 对局结束后，生成各局面行棋方视角的胜负标签。
3. 计算策略损失与价值损失。

网络和参数更新循环已提供。从随机初始化开始训练，保存模型，比较训练前后表现；跑通后可调整网络或训练参数，自行优化模型效果。

## 三、对战测试

将模型上传到 [课程对战平台](https://botlab.aiphys.cn/)，与随机策略、入门策略或其他同学对战，测试模型效果。

已为同学们安排对战平台账号，用户名为学号，初始密码为圆周率前15位，大家登录后可以修改自己的密码。

## 提交内容

1. **完整源码**：脚本版提交补全的 `starter/`；Notebook 版提交补全的 `.ipynb`，并将 `notebook_runs/实验名/src/` 复制为同目录下的 `starter/`，无需重复填写模板。
2. **模型**：训练得到的 `model.pt`。


请在服务器上的个人目录下建立一个“homework4”文件夹，然后将提交内容放置在该文件夹下。

只交一个版本，可以保留训练日志，但无需提交训练数据缓存。网站上传的 `code.zip` 缺少训练程序，不能代替完整源码提交到服务器。

同时，在截止前到对战平台指定一个参赛版本，代码和模型应与服务器提交的作业对应。截止后冻结参赛版本，正式评测使用该版本；之后修改日常默认版本不影响参赛版本。

作业截止日期：11月14号 23:59

## 比赛与评分

完成作业要求并提交可运行的代码和模型后，按以下标准评分。未完成、缺交或无法运行的作业另行评定。

助教统一评测参赛模型。对随机策略和入门策略分别使用多组开局测试，每组交换先后手各下一局。每局胜、平、负分别计 1、0.5、0 分，累计得分超过总局数的一半才算通过，打平不通过。具体测试局数看实际情况调整。

通过入门策略测试（资格赛）的模型进入正式比赛。暂定采用 **8 轮瑞士制**，根据当前积分安排对手，每场交换先后手各下一局，使用同一开局。按累计积分排名；同分时比较对手的最终积分总和。助教会根据参赛人数和实际比赛情况调整轮数、每场局数及开局设置。

| 评测结果 | 分数 |
| --- | ---: |
| 排名前 10% | 10 |
| 排名 10%～25% | 9.5 |
| 排名 25%～50% | 9 |
| 排名 50%～70% | 8.5 |
| 通过资格赛的其余同学 | 8 |
| 未通过资格赛，但通过随机策略测试 | 7 |
| 两项测试均未通过 | 6 |

百分比按通过资格赛的人数计算。仍然并列且跨越评分档位时，按较高档计分。

评测采用统一的时间和资源限制，以平台公布的规则为准。超时、非法落子或程序崩溃判该局负；平台故障由助教处理并安排重赛。
