MLAgents (1) 球移动到指定立方体目标

2023-09-18 10:47:39

1、ML-Agents库介绍

ML-Agents库,训练用于2D、3D、VR/AR游戏的智能agent,经过训练的agent可用于多种目的,包括:控制NPC行为(采用各种设置,例如多个agent和对抗)、对游戏内部版本进行自动化测试、以及评估不同游戏设计决策的预发布版本

2、Unity中创建立方体、球和地面

球——玩家移动和AI控制

立方体——需要球移动到的位置,当移动到距离达到指定阈值时为移动成功

成功目标:将球移动到立方体位置

失败条件:球出界(落出地面)

3、创建脚本

创建RollerAgent脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 导入ML-Agents库
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;

public class RollerAgent : Agent
{
    // 要移动到目标立方体的位置
    public Transform target;
    // 刚体力的倍数
    public float forceMultiplier = 10.0f;
    private Rigidbody rigidbody;

    // Start is called before the first frame update
    void Start()
    {
        rigidbody = this.GetComponent<Rigidbody>();
    }

    // 每次训练开始时调用,可以用来初始化 AI和环境
    // 调用场景中每个Agent,开始函数
    public override void OnEpisodeBegin()
    {
        //base.OnEpisodeBegin();
        // 当球出界,重置球的位置到原点
        if(this.transform.localPosition.y  < 0.5)
        {
            this.rigidbody.velocity = Vector3.zero;
            this.rigidbody.angularVelocity = Vector3.zero;
            this.transform.localPosition = new Vector3(0.0f, 0.5f, 0.0f);
        }

        // 目标立方体随机出现在场地某个位置
        target.localPosition = new Vector3(Random.value * 8 - 4, 0.5f, Random.value * 8 - 4);  // [-4, 4 之间随机生成立方体]  Random.value值为[0~1]
    }

    // 每走一步收集AI所需要的矢量信息,AI通过这些信息了解现在的环境
    // sensor.AddObservation() 方法收集所需数据
    // 通过调用场景中每个Agent的CollectObservations(VectorSensor sensor)函数,收集有关场景的信息,更新他们的Sensor并收集 观测向量
    public override void CollectObservations(VectorSensor sensor)
    {
        //base.CollectObservations(sensor);

        // sensor.AddObservation() 方法收集所需数据
        // 收集目标正方体 和 球的位置
        sensor.AddObservation(target.localPosition);
        sensor.AddObservation(this.transform.localPosition);

        // 收集球的速度
        sensor.AddObservation(this.rigidbody.velocity.x);
        sensor.AddObservation(this.rigidbody.velocity.z);
    }

    /// <summary>
    /// 指定每一步的AI的行为
    /// ML-Agents支持两种类型的操作:连续和离散。通过actions.ContinuousActions数组来记录所有连续的操作
    /// 需要在BehaviorParameters组件中设置连续型操作个数和离散型操作个数,以及每个离散型操作的可能数
    /// 在ppo算法中数组内的每一个值都在[-1, 1]之间
    /// 
    /// actions.DiscreteActions数组记录所有离散 的操作,每个值时0~x中的整数,x表示该操作的所有可能性的总数(例如 :实现跳跃 0代表不跳 ,1代表跳)
    /// 调用每个Agent的OnActionReceived()函数,传递Agent根据策略选择的动作
    /// </summary>
    /// <param name="actions"></param>
    public override void OnActionReceived(ActionBuffers actions)
    {
        //base.OnActionReceived(actions);

        Vector3 controlSignal = Vector3.zero;
        controlSignal.x = actions.ContinuousActions[0];
        controlSignal.z = actions.ContinuousActions[1];
        // 将当前动作赋值给球
        this.rigidbody.AddForce(controlSignal * forceMultiplier);

        // rewards
        // 判断球和目标立方体之间 的距离
        float distanceToTarget = Vector3.Distance(this.transform.localPosition, target.localPosition);
        // 如果距离靠近
        if (distanceToTarget < 1.42f) 
        {
            // SetReward() 本次决策的奖励值设为多少  AddReward() 本次决策的奖励值加多少
            this.SetReward(1.0f);
            // 结束本次训练,进入初始化状态再次进行训练
            this.EndEpisode();
        }

        // 当掉出场地时,结束本次训练,进入初始化状态再次进行训练
        if(this.transform.localPosition.y < 0)
        {
            // 用EndEpisode()结束这次训练,然后进入初始化状态再次进行训练
            // 已经到达设定的Max Step或Agent将自身标记为EndEpisode(),调用 Agent的OnEpisodeBegin()函数,结束
            this.EndEpisode();
        }
    }
    
    // 启发函数,增加手动测试功能,实现玩家可以通过自己的输入控制AI,方便排查环境中是否有bug,是否可以正常运行
    public override void Heuristic(in ActionBuffers actionsOut)
    {
        //base.Heuristic(actionsOut);
        // 人工操作
        ActionSegment<float> continuousActionsOut = actionsOut.ContinuousActions;
        // 按 a/d 左右 w/s 上下
        continuousActionsOut[0] = Input.GetAxis("Horizontal");
        continuousActionsOut[1] = Input.GetAxis("Vertical");
    }
}

将脚本加入到球体上,此时球体会增加脚本

Behavior Parameters(行为参数)——每个代理必须有一个行为。行为决定了代理如何做出决策

Decision Requester——用于AI从模型申请动作。设置决策间隔太短的话会占很多计算资源,在不影响AI效果的情况下越大越好。

4、对整体流程的总结

OnEpisodeBegin——训练初始化AI和环境,训练开始时调用

CollectObservations——收集每一步AI的矢量信息

        使用 sensor.AddObservation,收集所需数据

OnActionReceived——行为有连续和离散之分,将行为赋值给AI,并判断结束本次训练的条件,

        设置奖励值SetReward()

EndEpisode——结束本次训练,进入初始化后再次进行训练

Heuristic——实现玩家通过自己的输入控制AI,方便排查环境是否有bug

更多推荐

Ubuntu安装深度学习环境相关(yolov8-python部署)

Ubuntu安装深度学习环境相关(yolov8-python部署)本文将从如下几个方面总结相关的工作过程:1.Ubuntu系统安装(联想小新pro16)2.显卡驱动安装3.测试深度学习模型1.Ubunut系统安装之前在台式机上安装过Ubuntu,以为再在笔记本上安装会是小菜一碟,但没想还是废了一些功夫。安装所需要的步骤

linux下使用crontab定时器,并且设置定时不执行的情况,附:项目启动遇到的一些问题和命令

打开终端,以root用户身份登录。运行以下命令打开cron任务编辑器:crontab-e如果首次编辑cron任务,会提示选择编辑器。选择你熟悉的编辑器,比如nano或vi,并打开相应的配置文件。在编辑器中,添加一行类似以下的命令来设置定时任务:关机00***shutdown-hnow重启4018***sudoshutd

《UnityShader 入门精要》 笔记01

UnityShader入门精要笔记01第二章渲染流水线2.1综述2.1.1什么是流水线2.1.2什么是渲染流水线2.2CPU和GPU之间的通信2.2.1把数据加载到显存中2.2.2设置渲染状态2.2.3调用DrawCall2.3GPU流水线2.3.1概述2.3.2顶点着色器2.3.3裁剪2.3.4屏幕映射2.3.5三角

释放创造力:生成式 AI 和 Amazon SageMaker 如何帮助企业为营销活动制作广告素材...

广告公司可以使用生成式AI和文字转图像根基模型,制作创新的广告素材和内容。在这篇文章中,我们将演示如何使用AmazonSageMaker从现有的基本图像生成新图像。这是一项完全托管式服务,用于大规模构建、训练和部署机器学习模型。采用此解决方案,企业无论规模如何,都可以比以往更快地制作新的广告素材,而且大幅降低成本。这样

全国职业技能大赛云计算--高职组赛题卷①(容器云)

全国职业技能大赛云计算--高职组赛题卷①(容器云)第二场次题目:容器云平台部署与运维任务1DockerCE及私有仓库安装任务(5分)任务2基于容器的web应用系统部署任务(15分)任务3基于容器的持续集成部署任务(15分)任务4Kubernetes容器云平台部署与运维(15分,本任务只公布考试范围,不公布赛题)需要环境

leetcode&lintcode分类刷题:图论(三、多源最小距离问题)

1、本次总结的题目通常是多个源头节点分别求解到达目标节点的最小距离,目标节点可能为多个,也可能为一个;要采用广度优先搜索的方法,但先提前入队的不是源头节点了,而是目标节点,由目标节点为基准一圈一圈的更新能够达到的“新目标”位置,每一圈更新能够达到的位置最多只会访问一次2、常见的题型会设置障碍物,在一些细节的特殊情况上,

KubeSphere 在互联网医疗行业的应用实践

作者:宇轩辞白,运维研发工程师,目前专注于云原生、Kubernetes、容器、Linux、运维自动化等领域。前言2020年我国互联网医疗企业迎来了“爆发元年”,越来越多居民在家隔离期间不方便去医院看诊,只好采取在线诊疗的手段。互联网医疗企业的迅速发展的同时,也暴露出更多的不足。互联网医疗作为医疗行业发展的趋势,对于解决

《研发效能(DevOps)工程师国家职业技术认证》工信部教考中心认证证书:塑造研发效能的黄金标准丨IDCF

随着科技的飞速发展和市场竞争的日益激烈,高素质的技术管理人才在当今社会中扮演着越来越重要的角色。特别是在信息技术领域,企业对于拥有专业技能和丰富知识的研发效能管理与技术人才的需求愈发旺盛。工业和信息化部教育与考试中心(以下简称工信部教考中心)颁发的认证证书,作为专业技能和知识水平的官方认可,其含金量在业界有着极高的认可

Spring MVC 七 - Locale 本地化

Spring各模块都支持国际化,SpringMVC也同样支持。DispatcherServlet通过LocaleResovler自动根据客户端的Locale支持国际化。request请求上来后,DispatcherServlet查找并设置LocaleResovler,我们可以通过RequestContext.getLo

【pytest】 参数化@pytest.mark.parametrize

1.创建test_parametrize.py通过@pytest.mark.parametrize方法设置参数importpytestimportmath#pytest参数化@pytest.mark.parametrize("base,exponent,expected",#参数变量名称#每个元组都是一条测试用例测试数

【计算机网络】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)

TCP协议1.连接管理机制2.再谈WAIT_TIME状态2.1理解WAIT_TIME状态2.2解决TIME_WAIT状态引起的bind失败的方法2.3监听套接字listen第二个参数介绍3.滑动窗口3.1介绍3.2丢包情况分析4.流量控制5.拥塞控制5.1介绍5.2慢启动6.捎带应答、延时应答1.连接管理机制正常情况下

热文推荐