Unity3D机器学习 - 编写自定义Agent,创建自己的AI Bot ...
机器学习 - 编写自定义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 |
关注CG资源素材