论文解析-基于 Unity3D 游戏人工智能的研究与应用

news2025/4/9 16:43:00

1.重写 AgentAction 方法

1.1 重写 AgentAction 方法

这段代码是一个重写了 AgentAction 方法的方法。以下是对每行代码解释:

①public override void AgentAction(float[] vectorAction)

这行代码声明了一个公共的、重写了父类的 AgentAction 方法的方法。它接受一个 float 类型的数组作为参数。

float newAction0 = Mathf.Clamp(vectorAction[0], -1, 1);

这行代码将 vectorAction 数组的第一个元素限制在 -1 到 1 的范围内,并将结果赋值给 newAction0 变量。

newAction0 = (newAction0 + 1) / 2;

这行代码将 newAction0 的值加1后除以2,相当于将其从范围 -1 到 1 映射到范围 0 到 1

float newForce = Mathf.Lerp(MinForce, MaxForce, newAction0);

这行代码使用线性插值函数 Mathf.Lerp,根据 newAction0 的值在最小力量值 MinForce 和最大力量值 MaxForce 之间插值,将插值结果赋值给 newForce 变量。

ShootBall(newForce);这行代码调用名为 ShootBall 的方法,并将 newForce 作为参数传递给它。它的作用是使用指定的力量值来发射一个球。

1.2 重写了 AgentAction 方法 是什么意思?

重写(override)是面向对象编程中的一个概念,它指的是在子类中重新实现(覆盖)父类中已存在的方法。

在这段代码中,AgentAction 方法是一个父类中的方法,通过使用 override 关键字,该方法在当前类中进行了重新实现。也就是说,当前类是一个子类,继承了某个父类,而 AgentAction 方法是在父类中定义的。通过重写该方法,子类可以根据自己的需求对方法的行为进行修改或扩展

在代码中的第一行,public override void AgentAction(float[] vectorAction) 表示当前类重写了父类中的 AgentAction 方法,而不是使用父类中原有的实现。重写方法可以提供自定义的功能或行为,以满足子类的特定需求。

2.重写 CollectObservations 方法

2.1 重写 CollectObservations 方法

这段代码也是重写了一个方法,具体来说是重写了 CollectObservations 方法

以下是对每行代码的解释:

public override void CollectObservations()这行代码声明了一个公共的、重写了父类的 CollectObservations 方法的方法。

float distance = Vector2.Distance(mBallVector2, mNetVector2);这行代码计算了一个向量 mBallVector2mNetVector2 之间的距离,并将结果赋值给 distance 变量。

distance = (distance - MinDis) / (MaxDis - MinDis);这行代码将 distance 的值从范围 MinDisMaxDis 映射到范围 0 到 1。它通过减去 MinDis,然后除以 MaxDis - MinDis 来进行映射。

AddVectorObs(distance);这行代码将 distance 添加到观察向量中。这个观察向量用于提供给机器学习模型关于环境状态的信息。

float height = NetTrans.position.y - HeightBaseTrans.position.y;

这行代码计算了一个高度值,即 NetTrans 对象的 y 坐标减去 HeightBaseTrans 对象的 y 坐标,并将结果赋值给 height 变量。

height = (height - MinHeight) / (MaxHeight - MinHeight);这行代码将 height 的值从范围 MinHeightMaxHeight 映射到范围 0 到 1。它通过减去 MinHeight,然后除以 MaxHeight - MinHeight 来进行映射。

AddVectorObs(height);这行代码将 height 添加到观察向量中,用于提供给机器学习模型关于环境状态的更多信息。

这段代码重写了 CollectObservations 方法,以生成两个观察向量:一个是关于机器人与目标的距离,另一个是关于目标距离地面的高度。这些观察向量会在机器学习过程中提供环境状态的信息,以辅助决策和学习。

3.重写 CollectObservations 方法

以下是对提供的代码的逐行解释:

public override void CollectObservations()这行代码声明了一个公共的、重写了父类的 CollectObservations 方法的方法。

AddVectorObs(HasMedicineState);这行代码将名为 HasMedicineState 的变量添加到观察向量中。HasMedicineState 可能是一个布尔值,用于表示是否持有药物。观察向量在机器学习过程中用于提供环境状态的信息。

AddVectorObs(transform.InverseTransformDirection(mAgentRig.velocity));这行代码将 mAgentRig 物体(代理体)的速度转换为局部坐标系中的方向,并将其添加到观察向量中。transform.InverseTransformDirection 用于将世界坐标系中的方向转换为相对于物体的局部坐标系中的方向。

通过以上代码,CollectObservations 方法重写了父类中的方法,生成了两个观察向量。第一个观察向量包含了一个代表是否持有药物的状态信息。第二个观察向量包含了物体运动的速度信息,该速度信息已转换为局部坐标系中的方向。这些观察向量将为机器学习模型提供有关环境状态的信息。

3.1 我们常用的 PPO 算法,其输出动作向量值域在-1 到 1 之间 ?

常用的 PPO(Proximal Policy Optimization)算法的输出动作向量通常被限制在-1到1的值域范围内。这种限制是为了确保输出的动作在合理的范围内,以避免过大或过小的动作值。将输出动作值域限制在-1到1之间有助于稳定训练过程,并使得学习到的策略更容易在实际环境中执行。

在代码中,你可能会看到一些对输出动作向量进行范围映射的操作,例如使用 Mathf.Clamp 函数将动作向量的元素限制在-1到1之间。这样的映射操作可以确保输出动作在合理范围内,并符合使用 PPO 算法的通常约定。

注意:从官方的使用说明文档中可以了解到,不适合过度设计奖励方式,代理可能会在训练过程中找到奖励的“漏洞”,最终导致训练失败。

参考文献:

[1]朱杰. 基于Unity3D游戏人工智能的研究与应用[D].广东工业大学,2020.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/499016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【力扣-225】用队列实现栈

🖊作者 : D. Star. 📘专栏 : 数据结构 😆今日小tips : 有些家里可能会有两个同样名字的 WiFi,而其中一个名字的最后有个 5G,那么,这个 5G 和常说的 5G 信号是一回事吗?并不是,无线路…

研报精选230507

目录 【行业230507山西证券】煤炭行业周报:港口煤价趋稳,静待经济信心恢复与迎峰度夏双至 【行业230507山西证券】农业行业周报:建议逢低布局经营稳健和低PB的养殖股 【行业230507头豹研究院】2023年中国无源物联网行业词条报告 【个股230507…

运算放大器 - 笔记 02 -恒流源

恒流源 / 电流源 一、方案一二、方案二三、方案三四、方案四 前言:最近在学习运放,三极管,二极管,场效应管等器件的组合电路。捡起了以前的模电知识,写下笔记,以防再度忘记。 本文使用Multisim仿真软件进行…

MySQL---约束(主键约束,自增长约束,非空约束,唯一约束,默认约束、零填充约束)

1. 主键约束 MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中 尽快的找到某一行。 主键约束相当于 唯一约束 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。 每个表最多只允许一个主键 …

Linux 挂载磁盘教程,Linux系统分区及磁盘挂载

Linux 挂载磁盘教程,Linux系统分区及磁盘挂载 说明:以下教程是以未安装任何程序及无数据的数据盘基础上编写 如已安装程序或数据盘含有数据切勿使用此教程 本文中的磁盘/dev/sdb为笔者测试服务器上的命名,在您的服务器中可能是/dev/xdb、/dev…

【C++入门】引用

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

npm私有库(nexus)-安装nexus

注:安装 nexus(需要先安装 Java jdk) 1、上传软件包到服务器并解压 链接:https://pan.baidu.com/s/1NgpIbTaH4xV-HceyTUuxVA 提取码:vs51 tar -xvf nexus-3.19.1-01-unix.tar.gz 2、修改默认端口,并开启端口 firewall-cmd --pe…

windows和Linux系统配置静态ip方法

为什么要配置静态IP 配置静态IP地址可以确保设备始终具有相同的IP地址,这对于需要远程访问、网络管理和安全性很重要。与动态IP地址不同,静态IP地址不会随着时间而改变,因此它允许管理员轻松地识别特定设备并在网络上进行更精细的控制。另外…

02- 目标检测基础知识及优化思路汇总 (目标检测)

要点: 参考综述:深度学习目标检测最全综述 - 爱码网参考表达:https://www.cnblogs.com/xjxy/p/13588772.html 一 发展历程 分类网络是目标检测的基础,必须熟练掌握。 1.1 传统算法 V.J Detector 19年前,P. Viola 和 …

操作系统——文件管理

0.关注博主有更多知识 操作系统入门知识合集 目录 9.1文件系统概念 思考题: 9.2文件的物理结构 思考题: 9.3文件存储和目录 9.1文件系统概念 文件的定义: 文件是计算机信息存取的一种重要组织形式,文件由若干信息项有序构…

多项式时间验证与NP完全性

多项式时间的验证 对语言的“验证”算法: 验证与求解花费时间一样长:最短路径问题的一个实例的证书很容易能在多项式时间内被验证。实际上最短路径问题本身可以在多项式时间内求解。因此,根据指定的证书来验证与从头开始求解这个问题的时间…

Docker安装常用软件-Nacos

一、单机部署 官方网站:什么是 Nacos 1、下载最新nacos镜像 docker pull nacos/nacos-server 2、新建映射文件夹 --nacos/conf/application.properties --nacos/logs --nacos/sql ①application文件 # # Copyright 1999-2021 Alibaba Group Holding Ltd. #…

Ajax -- from表单与模板引擎

1. from表单的基本使用 1.1 什么是表单 表单在网页中主要负责数据采集功能。HTML中的标签,就是用于采集用户输入的信息,并通过标签的提交操作,把采集到的信息提交到服务器端进行处理。 1.2 表单的组成部分 表单由三个基本部分组成&#…

MySQL基础(七)单行函数

1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。在 SQL 中我们也可以使用函数对检…

GUN C编译器拓展语法学习笔记(一)GNU C特殊语法部分详解

GNU C特殊语法部分详解 一、指定初始化1、数组初始化2、指定初始化结构体成员3、指定初始化的好处 二、宏构造利器:语句表达式1、表达式、语句和代码块2、语句表达式3、宏定义中的语句表达式 三、typeof 与container_of 宏1、typeof 关键字宏2、Linux内核中的contai…

提示词的天花板来了- ChatGPT 指导学习知识点

https://github.com/JushBJJ/Mr.-Ranedeer-AI-Tutor/ 访问 ChatGPT网站选择 GPT-4(或更高版本)模型将 Mr_Ranedeer.json 的内容复制粘贴到 ChatGPT让 Mr. Ranedeer 带领您完成配置过程 开始学习吧! 支持以下命令: /feedback&…

Golang每日一练(leetDay0055) 最长子串、相交链表

目录 159.至多包含两个不同字符的最长子串 Longest-substring-with-at-most-two-distinct-characters 🌟🌟 160. 相交链表 Intersection-of-two-linked-lists 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 …

【C++初阶】类与对象(中)

目录 一.类的6个默认成员函数二、构造函数特性 三、析构函数概念特性 四、拷贝构造函数概念特性 五、赋值运算符重载5.1 运算符重载5.2 赋值运算符重载 一.类的6个默认成员函数 在C中,一个类中并没有实现任何属性和方法,被叫做空类,但是一个…

《Linux 内核设计与实现》05. 系统调用

文章目录 内核通信API、POSIX、C库 系统调用系统调用号系统调用的性能 系统调用处理程序指定恰当的系统调用参数传递 系统调用的实现实现系统调用参数验证 系统调用上下文绑定一个系统调用的最后步骤从用户空间绯闻系统调用 内核通信 系统调用在用户空间进程和硬件设备之间添加…

【疯狂造轮子-iOS】JSON转Model系列之一

1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗忘。这段时间准备自己造一些轮子,主要目的还是为了提升自身实力,总不能一遇到问题就Google 。 之前写i博客园客户端的时候&#xff0…