其他分享
首页 > 其他分享> > Unity 用ml-agents机器学习造个游戏AI吧(DEMO示例)

Unity 用ml-agents机器学习造个游戏AI吧(DEMO示例)

作者:互联网

DEMO入门示例

本次示例以训练一个能追踪小球的游戏AI。

1.新建一个Unity项目

并将之前下载的ml-agents项目UnitySDK目录下的Assets和ProjectSettings导入(复制覆盖)进新建的Unity项目

2.进入Unity项目,先编写好两个脚本

RollerAcademy 是将用于训练环境的组件:

//RollerAcademy.cs
//继承Academy用于重写训练环境,就目前而言无需改动,因此简单的直接继承即可。

using MLAgents;

public class RollerAcademy : Academy { }

RollerAgent 是将用于智能体对象的组件:

//RollerAgent.cs
//继承Agent用于重写智能体的AgentReset,CollectObservations,AgentAction等方法。
using MLAgents;
using UnityEngine;

public class RollerAgent : Agent
{
    Rigidbody rBody;
    void Start()
    {
        rBody = GetComponent<Rigidbody>();
    }


    public Transform Target;
    //Reset时调用
    public override void AgentReset()
    {
        if (this.transform.position.y < 0)
        {
            //如果智能体掉下去,则重置位置+重置速度
            this.rBody.angularVelocity = Vector3.zero;
            this.rBody.velocity = Vector3.zero;
            this.transform.position = new Vector3(0, 0.5f, 0);
        }

        //将目标球重生至一个新的随机位置
        Target.position = new Vector3(Random.value * 8 - 4,0.5f,Random.value * 8 - 4);
    }

    //收集观察结果
    public override void CollectObservations()
    {
        //------ 观测
        //观测到目标球和智能体的位置
        AddVectorObs(Target.position);
        AddVectorObs(this.transform.position);
        //观测到智能体的速度
        AddVectorObs(rBody.velocity.x);
        AddVectorObs(rBody.velocity.z);

        //在这里因为目标球是不会动的,智能体也不会在y轴上又运动,所以没有必要观察这些值的变化。
    }


    public float speed = 10;
    //处理动作,并根据当前动作评估奖励信号值
    public override void AgentAction(float[] vectorAction, string textAction)
    {
        //------ 动作处理
        // 接受两个动作数值
        Vector3 controlSignal = Vector3.zero;
        controlSignal.x = vectorAction[0];
        controlSignal.z = vectorAction[1];
        rBody.AddForce(controlSignal * speed);

        //------ 奖励信号

        float distanceToTarget = Vector3.Distance(this.transform.position,Target.position);
        // 到达目标球
        if (distanceToTarget < 1.42f)
        {
            //奖励值+1.0f
            SetReward(1.0f);
            Done();
        }

        // 掉落场景外
        if (this.transform.position.y < 0)
        {
            Done();
        }

    }
}

3.创建Brain决策体

创建两个Brain文件

更改好名字(本文取了RollerBallBrain和RollerBallPlayer),这样就创建了两个Brain文件。

LearningBrain适用于训练模型的决策体,而PlayerBrain只是映射键盘按键的决策体(即玩家控制)。
之所以创建PlayerBrain,在训练前可让玩家通过真实操控测试当前游戏环境是否正确,然后确认无问题后再切换LearningBrain交给机器去操控(训练)。

对RollerBallPlayer进行配置

从上面写的RollerAgent脚本,我们知道:

对RollerBallBrain进行配置

然后我们让RollerBallBrain直接Copy Brain Parameters from刚刚配置好的RollerBallPlayer:

4.搭建好游戏场景

创建一个地板(Plane)

创建一个小球(Target)

创建要控制的智能体(RollerAgent)

创建训练环境游戏对象(Academy)


目前场景预览

5.开始训练(挂机)

然后现在可以打开开始菜单,直接使用cmd命令窗口,
cd到之前下载ml-agents项目的目录里,

cd  C:\Downloads\ml-agents

再输入激活ml-agents环境:

activate ml-agents

开启训练:

mlagents-learn config/config.yaml --run-id=RollerBall-1 --train

config/config.yaml是训练配置文件,RollerBall-1是你给训练出来的模型取的名字

注意config/config.yaml是不存在的,需要自己仿照于官方的示例配置文件config/trainer_config.yaml并修改配置而新建的。
下面是config.yaml示例:

default:
    trainer: ppo
    batch_size: 10
    beta: 5.0e-3
    buffer_size: 100
    epsilon: 0.2
    gamma: 0.99
    hidden_units: 128
    lambd: 0.95
    learning_rate: 3.0e-4
    max_steps: 3.0e5
    memory_size: 256
    normalize: false
    num_epoch: 3
    num_layers: 2
    time_horizon: 64
    sequence_length: 64
    summary_freq: 1000
    use_recurrent: false
    use_curiosity: false
    curiosity_strength: 0.01
    curiosity_enc_size: 128

当出现如下画面:


你的命令窗口也会时刻告诉你训练阶段的信息。

6.跑训练出来的模型

概念

另外一提,最新的介绍文档资料示例等都在Unity官方机器学习的github项目,感兴趣可以持续保持关注它的更新:
https://github.com/Unity-Technologies/ml-agents

Unity官方博客机器学习概念详解(1):https://blogs.unity3d.com/2017/12/11/using-machine-learning-agents-in-a-real-game-a-beginners-guide/

Unity官方博客机器学习概念详解(2):https://blogs.unity3d.com/2017/06/26/unity-ai-themed-blog-entries/

Unity ml-agents概念详解国内翻译博客:https://blog.csdn.net/u010019717/article/details/80382933

这里只做部分概念简介,懒得写太多了,以多人战争游戏中的 军医AI 为例介绍。

标签:示例,造个,ml,Agent,军医,Brain,Unity,agents
来源: https://www.cnblogs.com/KillerAery/p/10631310.html