编写gym wrapper实现观测空间、动作空间裁剪,与算法对接:
(1)observation包含:原始obs,包括agent坐标,属性,能观测到的地图信息,背包信息。
(2)action为一维离散值,范围是0 ~ 13,0 ~12表示范围2以内的坐标格子。13表示消耗。当选定坐标格以后,根据坐标上的物品进行动作,由于坐标上的物品类型是互斥的,因此动作也是互斥的,并不会造成自由度下降。
reward设计为:
(1)攻击猪的reward为2,杀死猪的reward为4
(2)当agentNA死亡时,所有agent获得-10的reward,游戏结束
(3)当agent捡起meat时,reward为4
(4)当agent消耗肉时,检查获得的饥饿度增益是否大于18,大于18时,增加等同于饥饿度增量的奖励。无论是否大于18,都获得(20-饥饿度增量)的惩罚,这代表溢出所浪费的饥饿度。
训练过程为:
(1)固定种子生成地图,然后让agent进行训练,总共训练了大约1M步
(2)随机种子生成地图,然后让agent进行训练,总共训练了300episode,但是这时由于之前训练过,一个episode大约有400步,所以大约相当于150k步(step与reward曲线如下)
算法运行demo:
此游戏将在地图中生成3个agent和一头牛,由于牛会对agent进行反击,需要3个agent合力将牛击杀,并将掉落的一块肉捡起,以此完成游戏。
配置general.csv如下。地图大小10x10,设定白天长度和一天长度相同,因此没有夜晚。由于有3个agent,因此也将agentCount设为3。
地图属性 | 值 |
---|---|
MapSizeX | 10 |
MapSizeY | 10 |
DaytimeLength | 200 |
DayLength | 200 |
AgentCount | 3 |
配置landform.csv如下。只设置了一项,因此地形只有草原。
地形 | 比例 |
---|---|
Grassland | (any) |
将resource.csv中清空,让环境中不生成其他资源
配置Agent.csv如下所示
agent属性 | 血量 | 攻击力 | 防御力 | 攻击距离 | 视野 | 移速 |
---|---|---|---|---|---|---|
数值 | 100 | 10 | 0 | 1 | 20(全图) | 2 |
通过设置actable一项为'm : a : p',只允许进行move、attack、pickup三个动作
通过设置Distribution一项为'Grassland:3',表示在grassland随机生成3个该agent
配置being.csv如下所示
牛的属性 | 血量 | 攻击力 | 防御力 | 攻击距离 | 移速 |
---|---|---|---|---|---|
数值 | 400 | 10 | 0 | 1 | 2 |
通过设置DropTable一项为Meat:1,表示牛被击杀后掉落1个meat
通过设置Distribution一项为Grassland:1,表示在grassland随机生成1个Ox
通过设置Temper一项为1,表示牛受到攻击后会进行反击,反击的伤害根据牛的攻击力和agent的防御力计算,因此agent无法单独击倒牛
通过设置game_done.json,使得如果某个agent的属性值(血量、饱食度、口渴度)降至0或者捡到肉后,该agent的done=True
类别 | 属性 | 判断值 |
---|---|---|
attrbute | Hunger or Thirst, HP | 0 |
backpack | Meat | 1 |
编写gym wrapper实现观测空间、动作空间裁剪,与算法对接:
(1)observation包含:自身位置、自身血量、背包、其他agent位置、牛的位置、掉落的肉的位置
(2)action为一维离散值,范围是0 ~ 19,0 ~3表示向四个方向攻击、4 ~ 7表示拾取、 8~19表示移动(移动速度为2,可能的选择有12个位置)
reward设计为:
(1)攻击牛的reward为2,杀死牛的reward为5
(2)按照距离牛的远近附加一个负的reward,值为-0.1*Distance
(3)有agent被牛击杀时,所有agent获得-10的reward,游戏结束
(4)当agent捡起肉,游戏结束,捡起肉的agent给20reward,其他agent的reward为5
训练过程为:
(1)使用multi-agent dqn在牛的血量为200,攻击力为5的环境下训练约200k step(下图中的橙线)
(2)接着在牛的血量为400,攻击力为5下再训练了约200k step(下图中的蓝线,有重新探索的过程)。
算法运行结果如下,此时牛的数值为原本设计中的血量400,攻击力10,能够完成合力击杀牛的任务,不过存在泛化能力不足的问题。