逃亡游戏
概述
-
本示例主要展示如何修改初始化文件配置中的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演示,展示游戏中的道具功能和特殊通关方式。
智能算法交互
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模型如视频所示: