Unity3D机器学习 - 编写自定义Agent,创建自己的AI Bot ...

『技巧 | 经验』 版权:禁止匿名转载;禁止商业使用。

1678 0 0 2019-04-16 举报

CG素材

未设置职业

机器学习 - 编写自定义Agent - 创建自己的AI Bot


我最近一直在玩新的Unity3D机器学习系统,取得了一点进展。我想分享我发现的步骤,以获得一个新创建的Agent设置,并经过训练完成一项基本任务。 在这篇文章中,您将看到如何设置基本Agent,目的是使用增强机器学习来完成随机选择的数字。 我们将使用新的Unity ML Agent系统和tensorflow来创建和训练Agent完成任务,并讨论将其扩展到真实游戏AI的方法。




设置 Tensorflow和UnityML


如果您尚未安装 并设置tensorflow ,你需要按照下属链接设置:

https://unity3d.college/2017/10/25/machine-learning-in-unity3d-setting-up-the-environment-tensorflow-for-agentml-on-windows-10/


AgentML场景设置


一旦你完成了这个过程,打开Unity项目并创建一个新的场景。


我们需要的第一件事就是academy。 创建一个新的gameobject,将其命名为“NumberAcademy”。


将“TemplateAcademy”组件添加到“NumberAcademy”中。 我们的设置不需要Academy做任何特别的事情,所以我们可以从模板中提供的基础空白学院开始。








在Academy下,创建另一个子游戏对象。 将其命名为“NumberBrain”。


添加一个大脑组件。


将State&Action大小变量设置为2。


将动作空间类型设置为离散。 我们将在我们的项目中使用2个离散的动作(向上或向下)。 我们使用离散量因为它们被表示为整数。


将状态空间类型设置为连续。 我们将跟踪两个浮点数状态,所以我们使用连续变量。







将大脑类型设置为“玩家”


添加2个动作。 选择你想要的任何2个键(我和A&B一起去),但是将值设置为0和1.绑定到值0的键递减#,绑定到1的键将增加它。







NumberDemoAgent脚本


创建一个名为NumberDemoAgent.cs的新脚本


将基类设置为代理(将:MonoBehaviour替换为:代理)


添加以下字段:

[C#] 纯文本查看 复制代码
public class NumberDemoAgent : Agent{ [SerializeField] private float currentNumber; [SerializeField] private float targetNumber; [SerializeField] private Text text; [SerializeField] private Transform cube; [SerializeField] private Transform sphere; int solved;view rawNumberDemoAgent-Fields.cs hosted with ❤ by GitHub




currentNumber和targetNumber字段在这里是最重要的。 一切都只是为了调试和可视化。


我们的代理将选择一个随机目标数,并尝试使用我们的递增和递减命令获取currentNumber到我们的目标。


接下来我们需要重写这个CollectState方法:


[C#] 纯文本查看 复制代码
public override List CollectState() { List state = new List(); state.Add(currentNumber); state.Add(targetNumber); return state; }view rawNumberDemoAgent-CollectState.cs hosted with ❤ by GitHub




在这里,我们正在将我们的两个浮点数作为我们Agent状态返回当前和目标号。 请注意,如何与大脑上的2个状态变量相匹配,并且它们都是浮点数,这就是为什么我们将其设置为连续状态而不是离散的。


对于我们的Agent来说,我们需要选择随机的目标号码。 为此,我们将覆盖AgentReset()方法,如下所示:

[C#] 纯文本查看 复制代码
public override void AgentReset() { targetNumber = UnityEngine.Random.RandomRange(-1f, 1f); sphere.position = new Vector3(targetNumber * 5, 0, 0); currentNumber = 0f; }view rawNumberDemoAgent-AgentReset.cs hosted with ❤ by GitHub



我们需要的最后和最重要的部分是AgentStep()方法。 这是我们要采取的行动(又称输入),执行一些任务(响应行动)的地方,并引导我们的Agent做出成功的选择。

<div align="left"><div style="padding:15px 0;">[C#] 纯文本查看 复制代码
public override void AgentStep(float[] action) { if (text != null) text.text = string.Format("C:{0} / T:{1} [{2}]", currentNumber, targetNumber, solved); switch ((int)action[0]) { case 0: currentNumber -= 0.01f; break; case 1: currentNumber += 0.01f; break; default: return; } cube.position = new Vector3(currentNumber * 5f, 0f, 0f); if (currentNumber < -1.2f || currentNumber > 1.2f) { reward = -1f; done = true; return; } float difference = Mathf.Abs(targetNumber - currentNumber); if (difference  1.2f) { reward = -1f; done = true; return; } float difference = Mathf.Abs(targetNumber - currentNumber); if (difference

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

让资源更有价值

  • Archiver|
  • 手机版|
  • 小黑屋|
  • CG素材网
  • 蜀ICP备18003526号-3
  • Powered by Discuz! X3.4
  • © 2001-2017 Comsenz Inc.
  • GMT+8, 2024-4-26 11:18 , Processed in 0.292594 second(s), 34 queries .

 关注CG资源素材

快速回复 返回顶部 返回列表