插入式ml-agent统一

最近,ml-agents插件已更新。 对于那些不知道的人,这是一个开放源代码插件,是一个用于培训代理商团结的环境。 可以使用强化学习,模仿学习,神经进化或其他使用Python API的机器学习方法对它们进行训练。 它还提供了许多现代算法(基于TensorSlow),使您可以为游戏创建更智能的NPC。

在Unity中实现机器学习需要什么?


在此处下载此插件。 您将需要unity-envonment文件夹。 在此之前,创建一个空项目。 在Assets文件夹中,使用unity-envonment添加Assets文件夹的内容。 使用ProjectSettings执行此操作。 请注意,如果将此插件添加到现有项目中,请先创建一个空项目,然后按照上述步骤创建一个包(Assets-ExportPackage),然后将其导入到现有项目中。 这是必要的,这样您就不会丢失项目中现有的ProjectSettings设置。

我将以足球游戏为例演示机器学习的实现(此场景已在插件中)。 它有两个队,蓝色和红色。 每个团队都有一个前锋和守门员。


让我们回到插件本身。 为了让他在舞台上工作,我们至少需要一个Academy,Brain和Agent对象。 交互方案可以在下面看到。



Academy对象及其子公司GoalieBrain,StrikerBrain位于舞台上。 从图中可以看出,每个学院可能有多个大脑,但是每个大脑都必须有一个学院。

特工-这些是我们要训练的游戏对象。



接下来,转到代码。 从Academy类继承了添加到GameObject Academy的SoccerAcademy类,然后再使用MLAgents添加名称空间。 之后,我们应该重写方法

public override void AcademyReset() { } public override void AcademyStep() { } 

并添加链接到Brain创建的

 public Brain brainStriker; public Brain brainGoalie; 

将脑组件添加到GoalieBrain,StrikerBrain并将它们分配给Academy



AgentSoccer类继承自Soccer。 将其添加到每个玩家,并指示将使用哪个大脑。



在AgentSoccer脚本中,我们描述了玩家的逻辑。 在重写的CollectObservations()方法中,我们添加了一条光线列表,以帮助玩家监视和响应游戏。

 public override void CollectObservations() { float rayDistance = 20f; float[] rayAngles = { 0f, 45f, 90f, 135f, 180f, 110f, 70f }; string[] detectableObjects; if (team == Team.red) { detectableObjects = new string[] { "ball", "redGoal", "blueGoal", "wall", "redAgent", "blueAgent" }; } else { detectableObjects = new string[] { "ball", "blueGoal", "redGoal", "wall", "blueAgent", "redAgent" }; } AddVectorObs(rayPer.Perceive(rayDistance, rayAngles, detectableObjects, 0f, 0f)); AddVectorObs(rayPer.Perceive(rayDistance, rayAngles, detectableObjects, 1f, 0f)); } 

重写的AgentAction方法与Update类似。 在其中,我们调用move方法并分配奖励。

 public override void AgentAction(float[] vectorAction, string textAction) { // Existential penalty for strikers. if (agentRole == AgentRole.striker) { AddReward(-1f / 3000f); } // Existential bonus for goalies. if (agentRole == AgentRole.goalie) { AddReward(1f / 3000f); } MoveAgent(vectorAction); } 

如果我们碰球,将其推入

 void OnCollisionEnter(Collision c) { float force = 2000f * kickPower; if (c.gameObject.tag == "ball") { Vector3 dir = c.contacts[0].point - transform.position; dir = dir.normalized; c.gameObject.GetComponent<Rigidbody>().AddForce(dir * force); } } 

目标完成后重置命令

 public override void AgentReset() { if (academy.randomizePlayersTeamForTraining) { ChooseRandomTeam(); } if (team == Team.red) { JoinRedTeam(agentRole); transform.rotation = Quaternion.Euler(0f, -90f, 0f); } else { JoinBlueTeam(agentRole); transform.rotation = Quaternion.Euler(0f, 90f, 0f); } transform.position = area.GetRandomSpawnPos(team.ToString(), agentRole.ToString()); agentRB.velocity = Vector3.zero; agentRB.angularVelocity = Vector3.zero; area.ResetBall(); } 

培训选择


您可以从统一编辑器以及使用TensorFlow训练代理。 至于团结,您需要为学院中的每个大脑指定惩罚和奖励。



通过将值设置为External,也可以告诉Brain它的TypeBrain。 它们也有以下几种类型:

  • 外部-使用Python API进行决策。 在这里,由Brain生成的观察结果和奖励将通过外部通信器重定向到Python API。 然后,Python API返回代理应采取的适当操作。
  • 内部-使用内置的TensorFlow模型进行决策。 嵌套的TensorFlow模型代表一项科学政策,Brain直接使用此模型来确定每个Agent的动作。
  • 播放器-使用真实的键盘或控制器输入进行决策。 在此,人类玩家控制代理,而大脑收集的观察结果和报酬不用于控制代理。
  • 启发式-使用硬编码的行为制定决策。 这类似于当前定义大多数字符行为的方式,对于调试或比较具有硬编码规则的代理与行为经过训练的代理的比较很有用。

Source: https://habr.com/ru/post/zh-CN416297/


All Articles