南京大学/NJU AI导论 Alien 游戏
目的:使用多种模型比较效果优劣。
目前使用了 随机森林,逻辑回归,SVC,MLP 模型,收集了 44 局游戏数据。
特征矩阵 X 形状: (5195, 4032)
标签分布: {向左走: np.int64(1419), 向右走: np.int64(1017), 发射子弹: np.int64(2759)}
随机森林效果很差,一直往左走。猜测是数据不够,以及训练数据中左右标签不均匀对投票影响较大。训练集准确率:99.65%。严重过拟合,泛化能力极差。
逻辑回归会有左右摆头,但是闪避和打击效果都很差,更像是随机的。训练集准确率: 66.22%。
由于特征质量差,无法理解何时需要闪避(移动)或打击(射击),所以表现像随机的。
SVC 的训练时间很长,而且效果很差,只会一直发射子弹,不会动。训练集准确率: 59.35%。
多数类偏见的经典表现。SVC 在高维特征空间中训练困难,最终找到的决策边界最安全的选择就是预测“发射子弹”(53% 的样本),从而牺牲了少数类的准确性。
MLP 的训练时间较长,似乎存在一定的闪避效果,但是闪避次数太少。时间太长了就不计算准确率了。
目的:调整随机森林的参数以期解决过拟合问题。
特征矩阵 X 形状: (5195, 4032)
标签分布: {向左走: np.int64(1419), 向右走: np.int64(1017), 发射子弹: np.int64(2759)}
调整随机森林参数为 max_depth=10, min_samples_split=5,训练集准确率: 55.82%。
调整随机森林参数为 max_depth=15, min_samples_split=5,训练集准确率: 69.62%。
都有非常薄弱的闪避意识,但是表现出来更像是面对一个炸弹时会随机向左向右。
目的:改进特征质量
现有问题:
- 维度灾难: 将特征维度从 \(4032\) 维(原始像素独热编码)大幅降低。
- 语义缺失: 提取更有意义的相对位置和威胁紧急程度信息,从而解决模型在测试时无法泛化和躲避子弹的问题。
新的提取策略:
飞船与目标定位: 提取飞船当前的精确 \(X\) 坐标作为自身定位特征;同时,提取怪物所在行的列级独热编码(每列 \(1/0\))作为射击目标特征。
威胁量化与闪避决策: 放弃原始像素,转而提取飞船周围三列(当前列和左右相邻列)中,最靠近飞船的炸弹的 \(Y\) 坐标。这个 \(Y\) 坐标值直接量化了威胁的紧急程度,有效指导模型进行精准闪避。
边界处理: 对超出游戏边界的列,赋予最大的 \(Y\) 坐标威胁值,将墙边编码为极度危险,鼓励模型远离边缘。
解决了训练速度问题: 维度从 \(4032\) 降至几十维,SVC 和 MLP 的训练时间得到数量级的提升。
解决了“紧急程度”问题: “炸弹的 Y 坐标”(即离飞船有多近)。模型现在可以学习:“如果左右侧的 Y 坐标值很高(距离近),则需要紧急向另一侧移动。”
解决了“边界处理”问题: 对于边界外的列,特征默认返回最大值 (len(grid)-1)。这个设计相当于告诉模型墙是不能走的。
特征矩阵 X 形状: (5195, 36)
四个模型的躲避能力都有显著提升,总体排序大致为:
逻辑回归= SVC(完美躲过所有炸弹) > MLP(投弹率0.2, lvl4下400步) > 随机森林(投弹率0.2, lvl4下300步)
但是,射击的精准度都很差,推测为训练数据设计准度太低导致的。
目的:提高设计精准度
问题:原来的特征提取函数都不包含射击时机的显式信息。
新的提取策略:
记录相对距离 (新增关键特征): 计算飞船与怪物在 \(X\) 轴上的相对距离(\(\Delta X = X_{\text{alien}} - X_{\text{avatar}}\))。
效果:SR 和 MLP 原本闪避就不行,所以先不管了。而 LR 闪避能力降低,设计精度提高;而 SVC 闪避能力还是很强,但是设计精度还是不行
通过改变 LR 的动作权重,闪避能力重新提高。
但是当只剩 1/2 个敌人时,两者的射击能力都不行。可以轻松度过前期,但很难终结游戏。问题在于目前的射击特征是所有怪物的相对距离。推测是当怪物稀疏时,大量的 \(0\) 向量淹没了有效信息。

浙公网安备 33010602011771号