逃亡游戏

概述

  • 本示例主要展示如何修改初始化文件配置中的8_preset.csv文件配置一个Pacman逃亡游戏。

  • 该游戏定义一个NxM的地图,该地图上存在一个迷宫。agent需要在迷宫中找到出口,同时躲避怪物的追踪。迷宫中有若干buff类地形/物品/道具,agent与之互动后可提高自身部分属性;同时迷宫中有若干neff类物品,agent与之互动后会降低自身部分属性。

具体设计

迷宫设计

由于eden不支持即时随机生成,因此迷宫的地图应该是确定的,用【石头】的素材做为迷宫的框架,墙壁和障碍物都由该素材构成。迷宫应具有一个入口和至少一个出口;迷宫中道路的宽度应设计为1或n,n为迷宫中buff和neff类交互的个数的和。

地形 素材 属性
A 障碍物 Stone.png agent无法通行
B 地面 Border.png 地面
C 道路 由B组成 宽度为2或3

agent与怪物设计

agent与怪物之间具有一定的初始距离,二者速度相同。当agent进行buff类交互时,agent的速度-1,怪物的速度保持不变,持续1回合。当agent的进行neff类交互时,agent的速度+1,怪物的速度保持不变,持续一回合。怪物的攻击距离为1,攻击力为100,当agent与怪物的距离为1时,怪物将攻击agent使agent死亡。

属性 agent/range monster/range
A 速度 (0,1 ) (0,1)
B 攻击距离 0 1
C 血量 100 100
D 攻击力 0 100
素材 pys.png(粉色可爱捏) OX.png

buff类交互设计

名称 属性/功能 素材/asset文件夹 交互方式 复用次数
A 加速肉 agent速度加1,怪物速度不变,持续n回合 Meat.png 拾取 1,n回合后恢复1
B 盔甲 agent防御属性增强,可抵挡怪物一起攻击 WoodArmor.png 拾取 1
C 剑 agent可破坏障碍物 Sword.png 拾取 2
D 传送树枝 agent可传送到范围为n的某个位置,在之后的m回合内,速度-1 Branch.png 拾取 1
E 圣水 使用后改变天气,使天气变为雨天(需要设计一定的天气效果) ColdStone.png 拾取 1
F 圣火 使用后改变天气,使天气变为晴天(需要设计一定的天气效果) WarmSton.png 拾取 1
G 颂昭之恩赐 当同时拥有ABCDEFG buff类物品时可合成,agent变为无敌,攻击力加999,可破坏任何物品 Bow.png 拾取 无限次数

neff类交互设计

名称 属性/功能 素材/asset文件夹 交互方式 复用次数
A 减速块 agent速度-1,持续n回合 pool.png 经过 无限
B 陷阱块 agent无法移动,持续n回合 background.Png 经过 1
C 我超,草! agent经过后,怪物进入狂暴状态,攻击距离增加,速度增加 GrassLand.png 经过 1
D 颂昭之湮灭 在若干步后,仍未逃脱迷宫,将天气转换为黑夜,视野范围0,陷入无尽的湮灭。   时间流逝 1

天气类设计

天气 属性 Config值
晴天 agent 怪物都加速  
雨天 怪物减速  
黑夜 颂昭之湮灭  

Demo演示

本节提供四个Demo演示,展示游戏中的道具功能和特殊通关方式。

视频1 长矛(Spear):agent走地图下方路径拾取长矛,装备后短时间增加攻击力,可以破坏墙壁走捷径通关。agent还可以通过拾取(pickup)并消耗(consume)肉来短时间获得额外加速,拉开与怪物的距离
视频2 盔甲(WoodArmor):agent走地图上方路径拾取盔甲,装备后可以抵抗怪物几次攻击,帮助agent坚持走出迷宫。
视频3 改变天气(Weather):agent拾取天气宝石,可以在合适的时候使用以改变天气获得不同天气buff。蓝色宝石可以将天气变为雪天,永久增加100点HP;黄色宝石可以将天气变为晴天,在该天气下获得额外移动速度。
视频4 终极武器-弓箭(FinalBow):agent合成游戏中的隐藏武器-弓箭变为无敌。根据目前设定,弓箭由肉、盔甲、长矛、蓝宝石、黄宝石各一个合成,合成并装备弓箭后agent的防御和攻击达到无穷,可以杀死怪物,任意破坏墙壁以通关。

智能算法交互

Eden中提供可供强化学习智能算法使用的gym接口,便于不同模型在Eden中训练。Demo采用Stable_baseline3中的PPO算法进行测试,其中策略采用"MlpPolicy",其余参数为默认。

Wrapper

Demo采用如下Wrapper,由于Eden支持多智能体模式,本样例中为单智能体,所以添加如下wrapper以确保环境的Observation和Action可以被ppo算法接收。Wrapper中额外添加与距离相关的reward函数。

class OneAgent(Wrapper):
    def __init__(self,env: Eden):
        super().__init__(env)
        self.env = env
        self.action_space = self.action_space[0]
        shape = self.observation_space.shape[1:3]
        low = self.observation_space.low.min()
        high = self.observation_space.high.max()
        self.observation_space = spaces.Box(low,high,shape)

    def reset(self):
        return self.env.reset()[0]
    
    def add_dis_reward(self, org_r):
        self.read()
        if len(self.obs_dict['Brave']) != 0:
            dis = self.obs_dict['Brave'][0]['being']['Ox'][0][2]
            dis_r = 0.5 * (dis - 2) 
            new_r = [org_r[0] + dis_r]
        else:
            new_r = org_r
        return new_r
    
    def step(self, action):
        action = [action]
        obs, reward, done, info = self.env.step(action)
        reward = self.add_dis_reward(reward)
        return obs[0],reward[0],done[0],{}

训练和reward

受算力和时间限制,该模型的训练计划分多阶段进行,每个阶段给予agent不同的reward分布。 第一阶段希望agent学会合理的移动,即不向无法移动的地方移动浪费回合。因此给move动作附加了较高的reward,但move失败会有惩罚 第二阶段希望agent学会远离怪物,因此根据agent和怪物的距离给予一定的reward,距离越远reward越大。 第三阶段希望agent学会与环境中的道具交互,因此将移动的reward降为0转而增加拾取(pickup),装备(equip),消耗(consume)等动作的reward。

算法运行结果

由于环境尺寸较大,自由度较高,训练难度大、效率低,PPO算法较难应对像该样例一样复杂的环境 根据目前PPO的训练结果,第一阶段目标基本完成,在给agent较多生命值时候,agent可以向迷宫出口逼近,完成80%的路径并合理规避带有debuff的地形。但agent二三阶段目标仍需继续训练,agent有时会主动向怪物靠近而且无法与环境中的道具合理交互。 目前训练出的ppo模型如视频所示: