深度强化学习实战: Step by Step创建训练环境(亲测可运行)


前言

本文作为学习ml-agents的开篇,主要是参考ml-agents的官方文档,结合Unity和ml-agents创建一个简单的游戏作为强化学习算法的训练环境。本文中用的是官方最新发布的稳定版ml-agents release_1(Version 1.0.0)。整个DIY过程亲测可运行, 并且经过大约半小时的训练小球就足够“智能”,可以很快地找到Target, 最终效果如下:
在这里插入图片描述

游戏简介

1. 游戏对象

  • Floor:游戏运行的场地, 是一个Plane对象
  • Ball:游戏的玩家(Player), 是一个Sphere对象
  • Target: 玩家(Player)的目标,是一个Cube对象

2. 游戏逻辑

游戏场景如下:

  • 开始:Ball位于Floor中央,Target初始化到Floor上的一个随机位置
  • 操作:玩家可以操作Ball在Floor平面上进行滚动。
  • 结束:Ball碰到Target or Ball掉落Floor,则该轮游戏结束(即完成一个Episode)。

创建场景

1. 新建对象

在Hierarchy窗口中单击鼠标右键-> 3D Object->分别创建Plane、Sphere和Cube对象。分别在三个对象的Inspector中Reset Transform,如下图

2. 更改属性Transform

  1. 在Inspector窗口中把Plane的name改为Floor
  2. 把Sphere的name改为Ball,Position设置为(0,0.5,0)
  3. 把Cube的name改为Target,Position设置为(2,0.5,4)

3. 添加材质Meterial

  1. 在Project窗口选中Assets文件夹后单击鼠标右键 -> Create -> Material
  2. 创建两个Material, 分别命名为Ball Material和Target Material
  3. Ball Material中的Albedo设置为蓝色,Metallic=0.5,Smoothness=0.8; Target Material中的Albedo设置为黄色,Metallic=0,Smoothness=0.5。设置结果如下:
  4. 分别把Ball Material和Target Material拖到对应的对象Ball和Target上。

4. 添加组件Component

单击选中Ball->在Inspector窗口的最下面单击Add Component按钮->搜索Rigidbody并添加
PS: 添加Rigidbody使Object具备物理特性,例如重力、作用力等。

5. 整合训练元素

  1. 新建空Object(Create Empty),重命名为TrainArea, 并Reset。
  2. 把Floor,Ball,Target拖动到TrainArea中进行分组(这一步操作是为了后面方便创建多个环境并行训练)

创建训练环境

1. 安装ml-agents

  1. 下载最新发布的稳定版ml-agents到本地:
git clone --branch release_1 https://github.com/Unity-Technologies/ml-agents.git
  1. 在unity中安装ml-agents包:
    在unity->Window菜单->Package Manager->点击"+", Add package from disk…->定位到下载的ml-agents/com.unity.ml-agents目录,选择package.json打开。安装完成后在Project窗口的Packages目录下出现ML Agents包
  2. 通过PyPi安装Python包mlagents:
pip3 install mlagents

运行完成后可以通过运行"mlagents-learn --help"命令验证是否成功安装。

2. 游戏初始化

  1. 在Ball上增加script

单击选中Ball->在Inspector窗口的最下面单击Add Component按钮->搜索script, 选择New script, 命名为"BallAgent"-> 点击Create and Add按钮

创建完成后可以在Project窗口的Assets目录下找到新建的BallAgent脚本

  1. 导入需要的包

双击BallAgent脚本, 在编辑器中打开, 在首行添加

using Unity.MLAgents; 
using Unity.MLAgents.Sensors;

把基类MonoBehaviour改为Agent。删除Update()方法,保留Start()方法。更新后结果如下:

  1. 编写初始化方法

初始化方法主要是两个:Start(), OnEpisodeBegin()

  • Start: 在整个程序运行前被调用,用来初始化整个游戏程序
  • OnEpisodeBegin: 在一轮游戏运行时被调用,用来初始化本轮的游戏场景

初始化代码如下:

using System.Collections.Generic;
using UnityEngine;
  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值