国科大2022年春季学期强化学习大作业
Game Page: http://www.ice.ci.ritsumei.ac.jp/~ftgaic/index.htm
效果展示:bilibili (感谢队友的配音)
论文报告:Paper-fighting.pdf
PPT汇报:FightingGames.pptx
原始数据:original-data.xlsx
使用角色:
ZEN | GARNET |
---|---|
This demo is based on Ubuntu 18 system.
Add java
sudo apt-get install openjdk-8-jre
If you have multi java:
sudo update-alternatives --config java
Add python
python = 3.8
pip install gym
pip install py4j
pip install port_for
pip install opencv-python
Close the screen in Linux
apt install -y xvfb
Run
Xvfb :2 -screen 0 1024x768x16 &
export DISPLAY=:2
Start the java server (modify the ftg.sh
as Linux) and test.
This is important on Linux
sh ftg.sh
注意,运行代码时候不要跑多个,即使修改端口4242也不行,虽然能运行,但很多指令传达不到,导致效果极差。
标准赛道,对战双方初始血量都是400,1分钟限时情况下,剩余血量高者获胜。
由于状态是离散与连续共存,用$s$表示状态,其中$s \in \mathbb{R}^{144}$。
其中,$\mathcal{T}$为一个线性映射,通过权重$w \in \mathbb{R}^{40 \times 144}$,则
这样,通过线性映射的方式,可以间接表示Q值,则在SARSA的时序差分迭代中可以表示为
$$ w_{a_t} := w_{a_t} + \alpha \cdot (r + \gamma \cdot \mathcal{T}{a{t+1}}(s_{t+1}) - \mathcal{T}{a{t}}(s_{t})) \cdot s_t $$
其中$s$表示状态,$a$表示动作,$r$表示奖励值,$w$代表线性权重。
具体内容请见原文Paper-fighting.pdf。
其中,fightingice_env.py文件被我修改,第40-43行,加入了变量character
,这样可以自由从输入端选择ZEN
,LUD
和GARNET
了。
训练:
python train.py\
--RL-method SARSA\
--player ZEN
测试也是一样,通用了
python test.py\
--CKPT checkpoint/SARSA/ZEN/weight.npy\
--player ZEN\
--Rounds 100
测试DDD:
python test_Dual.py\
--CKPT checkpoint/Duel/GARNET/ckpt.pt\
--player GARNET\
--Rounds 100
我们在人物ZEN和GARNET上进行了测试。
为了消融验证DDD 模型架构的可行性,另给定SARSA 算法作为baseline,它仅仅将Q 函数改为一层线性映射,训练过程保持不变。限定比赛时间60 秒,限制双方HP 上限,测试100 轮后得到结果下表所示:
角色ZEN:
算法 | 胜率 | HP差 | DPS |
---|---|---|---|
DDD | 0.87 | 113.83 | 6.09 |
SARSA | 0.52 | 0.81 | 3.48 |
角色GARNET:
算法 | 胜率 | HP差 | DPS |
---|---|---|---|
DDD | 0.93 | 185.23 | 10.53 |
SARSA | 0.77 | 115.16 | 9.79 |
为了验证DDD 算法在短期内的表现是否稳定,限定格斗过程中HP 上限为100,此时智能体只需8 次左右的有效攻击便可击败对方。1000 轮游戏中双方的游戏结果如下图所示。