之前因为一直没有实现Weighted QMIX,感觉公开的意义不大,所以就没写博客介绍。现在已基本复现了效果,受制于计算资源,没有完整运行论文中的实验。
仓库链接:https://github.com/jingranburangyongzhongwen/torchMARL,欢迎star和给issue
在每个时间步,agent都会收到在其视野内的局部观察。这包括关于每个单位周围圆形区域内的地图信息,半径等于视野范围。从每个agent的角度来看,视野范围使环境部分可观察。agent只能观察都活着并且位于视线范围内的其他agent。因此,agent无法确定他们的队友是走远了,还是死了。
每个agent观察到的特征向量包含视野范围内友军和敌军单位的以下属性:distance, relative x, relative y, health, shield, and unit_type。agent控制单位的health, shield and unit_type也包含在观察里。shield作为额外的保护源,需要在对单位的health造成任何损害之前移除。所有 Protos 单位都有shield,如果没有造成新的伤害,shield可以再生(其他两个种族的单位没有这个属性)。此外,agent可以访问视野中的盟军单位的上一个动作。最后,agent可以观察他们周围的地形特征;具体点,固定半径处的八个点的值表示高度和可步行性。
全局状态仅在集中训练期间对agent可得到,包含有关地图上所有单元的信息。具体来说,状态向量包括所有agent相对于地图中心的坐标,以及观察中存在的单元特征。此外,状态存储 Medivacs 的 energy 和其余友军单位的 cooldown,这代表了两次攻击之间的最小延迟。最后,所有agent的上一个动作都附加到全局状态。
所有特征,无论是在状态中还是在个体agent的观察中,都通过它们的最大值进行归一化。所有agent的视线范围都设置为 9。
smac允许agent采取的离散动作集包括move[direction] (four directions: north, south, east, or west), attack[enemy_id], stop and no-op,所以至少7个动作,跟环境中enemy数目有关。死agent只能采取no-op,而活agent则不能。对于治疗单位,医疗运输机必须使用 heal[agent_id] 动作而不是 attack[enemy_id]。agent可以执行的最大动作数介于 7 到 70 之间,具体取决于场景。
为了确保任务的分散化,agent被限制只能对他们射击范围内的敌人使用 attack[enemy_id] 动作。这另外限制了单位对远处敌人使用内置 attack-move 宏动作的能力。射击范围为 6。比射击范围更大的视野迫使agent在开始射击之前使用move命令。
总体目标是在每个战斗场景中获得最高的胜率。除了对应的 +1 和 -1 的奖赏,还有杀死敌方(盟军)单位后的一些正(负)奖励和/或正(负)奖励 赢得(输掉)战斗。作者强烈反对对奖赏函数进行不诚实的工程(例如,针对不同场景调整不同的奖赏函数)。
主要是一些MARL算法的pytorch实现,目前包括:
VDN, QMIX, Weighted QMIX(CW-QMIX, OW-QMIX)
该项目基于 https://github.com/starry-sky6688/StarCraft 改进得到,简化了模块与算法流程,改进可视化,方便建立自己的算法库。
网络参数设置与“The StarCraft Multi-Agent Challenge”(SMAC)中保持一致。
目前在StarCraft II上进行测试,但可以方便地迁移到任意封装好的环境使用。
相关资料:Pymarl
对于SMAC,这里简单介绍一下linux下的安装,Windows等系统可以查看他们的仓库。
通过下列命令安装SMAC
pip install git+https://github.com/oxwhirl/smac.git
安装StarCraft II,这里给出 4.6.2 的下载链接,因为SMAC用的就是这个,并且他说不同版本之间不能比较,其余版本可以查看暴雪的仓库,解压时需要密码iagreetotheeula
。解压后文件默认路径为~/StarCraftII/
,如果放在别的路径,需要更改环境变量SC2PATH
下载SMAC MAPS,解压后将文件夹直接放在$SC2PATH/Maps
下即可
运行python -m smac.bin.map_list
测试地图是否放置成功,运行python -m smac.examples.random_agents
测试安装是否成功。如果是centos的话可能会出现因为缺少对应版本依赖/home/user/SMAC/StarCraftII/Versions/Base75689/SC2_x64: /lib64/libc.so.6: version 'GLIBC_2.18' not found (required by /home/user/SMAC/StarCraftII/Libs/libstdc++.so.6)
而导致pysc2.lib.remote_controller.ConnectError: Failed to connect to the SC2 websocket. Is it up?
,这时候就要根据情况安装依赖或者使用docker了。
$ python main.py --map=3m --alg=qmix
或者直接pycharm打开项目,run main.py即可,也可以使用run.sh复现QMIX、CW-QMIX、OW-QMIX在5m_vs_6m上的实验。
SMAC的各种地图描述在这里:https://github.com/oxwhirl/smac/blob/master/docs/smac.md
暂时只贴一部分,因为我目前主要实现值分解的算法。所有地图的环境设置均与SMAC相同,难度为7(VeryHard)
VDN | QMIX |
QMIX | CW-QMIX | OW-QMIX |