问题:如何用unity训练一个类吸血鬼幸存者自动躲避AI。

我的想法:

应该抓住问题的根源解决:类吸血鬼幸存者游戏的躲避的目的是使血量维持一个健康值,所以我的逻辑是对训练的AI所有奖励(AddRewards)进行与血量是否健康一个强关联,简而言之是不管怎么加奖励都会乘以一个血量当前的百分比,只要当前血量降低,就会减少全局的奖励,但类吸血鬼幸存者游戏有回血机制,所以我们也要在训练AI原型时简单加入,简化加血的机制,每当一定时间后如果血量还是大于0就加血10-30随机(符合rouguelike游戏回血本质),间接增加全局的奖励和存活时间。当前血量小于0,则给与一个很大的警告(惩罚力度十分大,警告ai不要让此事再次发生)。游戏的表层设计原型就是这样,下面是代码如何实现游戏的表层设计原型。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Sensors;
//挂在玩家身上
public class PlayerAgent : Agent
{float timer = 1f;public float hp = 0;float timer_HP = 20f;private Vector3 lastPosition;
//AI玩家第一次启动此脚本调用一次public override void Initialize(){transform.localPosition = new Vector3(Random.Range(-2f, 2f), Random.Range(-2f, 2f), 0);}
//AI玩家收集环境中自己的血量变化,与全局血量相对应public override void CollectObservations(VectorSensor sensor){sensor.AddObservation(hp);}
//AI玩家第一次启动此脚本和调用EndEpisode()时调用一次public override void OnEpisodeBegin(){hp = 100;transform.localPosition = new Vector3(Random.Range(-2f, 2f), Random.Range(-2f, 2f), 0);}
//AI玩家每决策一次行动调用一次类似有输入参数的fixedupdate,参数为随机决策的离散变量,会根据奖励变化public override void OnActionReceived(ActionBuffers actionBuffers){
//hp>100 回到100if (hp > 100f) hp = 100f;
//当前血量的百分比float a = hp / 100f;var collider2Ds = Physics2D.OverlapCircleAll(transform.position, 0.6f);foreach (var item in collider2Ds){if (item.CompareTag("Enemy")){
//当AI玩家与敌人碰撞挨在一起时进行扣血扣奖励if (Vector2.Distance(item.transform.position, transform.position) <= 0.3f){hp -= 0.1f;AddReward(-1 * (10 - hp/10));}
//当敌人进入ai玩家攻击范围却没挨在一起时进行加血血扣奖励else{AddReward(0.1f * a);}}}timer -= Time.fixedDeltaTime;timer_HP -= Time.fixedDeltaTime;
//当AI玩家每秒移动的距离大于一定值时给与奖励,鼓励ai多运动多活跃多尝试,主要在前期鼓励ai踏出第一步,不然可能遇到各种惩罚减奖励,动与不动都一样甚至不如不动,就一直挂机摆烂,没有了后续if (timer < 0f){var currentPosition = transform.position;if (Vector3.Distance(currentPosition, lastPosition) > 0.8f){AddReward(10f * a);}else{AddReward(10f * Vector3.Distance(currentPosition, lastPosition) * a);}lastPosition = currentPosition;timer = 1f;}
//hp<0 正常游戏中游戏结束信号,应该给与警告大惩罚,然后重新随机环境尝试if (hp <= 0){AddReward(-10000f);EndEpisode();}
//hp>0 正常游戏中游戏继续信号,应该给与奖励回血,延迟游戏时间else if (hp > 0 && timer_HP < 0){hp += Random.Range(10, 30);timer_HP = 60f;AddReward(10f * a);}
//以下是随机移动逻辑处理var dirToGo = Vector3.zero;var rotateDir = Vector3.zero;var forwardAxis = actionBuffers.DiscreteActions[0];var rightAxis = actionBuffers.DiscreteActions[1];switch (forwardAxis){case 1:dirToGo += Vector3.up * 1f;break;case 2:dirToGo += Vector3.up * -1f;break;}switch (rightAxis){case 1:dirToGo += Vector3.right * 1f;break;case 2:dirToGo += Vector3.right * -1f;break;}transform.Translate(dirToGo * Time.fixedDeltaTime * 1f, Space.World);}
//真人操作,启发ai用,需要一个脚本才能记录public override void Heuristic(in ActionBuffers actionsOut){var OutDiscreteActions = actionsOut.DiscreteActions;if (Input.GetAxis("Vertical") > 0){OutDiscreteActions[0] = 1;}else if (Input.GetAxis("Vertical") < 0){OutDiscreteActions[0] = 2;}if (Input.GetAxis("Horizontal") > 0){OutDiscreteActions[1] = 1;}else if (Input.GetAxis("Horizontal") < 0){OutDiscreteActions[1] = 2;}}
//挨着墙就惩罚返回,我的这个项目需要private void OnCollisionEnter2D(Collision2D collision){if (collision.gameObject.CompareTag("Wall")){AddReward(-20f * (100 - hp));hp -= 20f;transform.localPosition = new Vector3(Random.Range(-2f, 2f), Random.Range(-2f, 2f), 0);}}
}

player 上面的组件有

enemy的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class EnemyController : MonoBehaviour
{public Transform transformPlayer;public Transform PlayerGen;public float timer = 0f;// Start is called before the first frame updatevoid Start(){}public void Enable(){PlayerGen = transform.parent.parent.Find("PlayerGen");transformPlayer = PlayerGen.GetChild(Random.Range(0, PlayerGen.childCount));timer = 0f;}// Update is called once per framevoid FixedUpdate(){transform.position = Vector2.MoveTowards(transform.position, transformPlayer.position, 0.3f * Time.fixedDeltaTime);var collider2Ds = Physics2D.OverlapCircleAll(transform.position, 0.75f, 1 << LayerMask.NameToLayer("Player"));for (int i = 0; i < collider2Ds.Length; i++){if (collider2Ds[i].gameObject.CompareTag("Player")){timer += Time.deltaTime / collider2Ds.Length;if (timer > 3f){EnemyGEN.instance.pool.Release(gameObject);timer = 0f;}}}}
}

场景:

结果训练中未出,结果和代码调整后续更新

有疑问 加QQ:1048835575

ML-Agents与训练达不到目的AI的斗争史-如何用unity训练一个类吸血鬼幸存者自动躲避AI(探讨,暂时非成功经验)1.0相关推荐

  1. ML之nyoka:基于nyoka库利用LGBMClassifier模型实现对iris数据集训练、保存为pmml模型并重新载入pmml模型进而实现推理

    ML之nyoka:基于nyoka库利用LGBMClassifier模型实现对iris数据集训练.保存为pmml模型并重新载入pmml模型进而实现推理 目录 基于nyoka库利用LGBMClassifi ...

  2. ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略

    ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略 目录 三.模型训练 ...

  3. 使用Amazon SageMaker RL 和Unity训练强化学习智能体

    [更新记录] 2022年3月25日 更新原始内容 本文目录结构 1. Overview of solution 2. Building a Docker container 3. Unity envi ...

  4. 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练

    在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...

  5. 训练数据也外包?这家公司“承包”了不少注释训练数据,原来是这样做的……...

    作者 |  Lionbridge AI 译者 | 天道酬勤 责编 | 徐威龙 封图| CSDN│下载于视觉中国 出品 |  AI科技大本营(ID:rgznai100) 在机器学习领域,训练数据准备是最 ...

  6. 英伟达开源自动驾驶AI算法,升级芯片性能7倍于Xavier

    2019-12-18 13:24:27 乾明 编辑整理  量子位 报道 | 公众号 QbitAI 一年一度,英伟达GTC China如期举办. 今年的英伟达创始人黄仁勋,对自动驾驶极为关注. 不仅发布 ...

  7. ztree局部刷新节点_神经网络训练的世界记录是怎样被刷新的 -- 总结分布式训练的计算场景...

    还是在今年(2018年)11月美国感恩节放假期间,我无意点开我的新论文搜索关注,假期的懈怠顿时被一扫而空.一篇谷歌的新论文跳入眼帘,声称打破了几天前刚建立的分布式训练速度的记录.各大公司训练速度记录上 ...

  8. 自动驾驶“稳打地基”,小鹏汽车基于阿里云建自动驾驶AI智算中心算力可达600PFLOPS

    数据驱动是自动驾驶发展的公认方向,也让自动驾驶模型训练成为一头"吃算力"的巨兽.自动驾驶的视觉检测.轨迹预测与行车规划等算法模型,有赖于机器学习海量数据集,但算力的不足让研发速度仍 ...

  9. MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA)、实现包括二次预训练、有监督微调、奖励建模、强化学习训练[LLM:含Ziya-LLaMA]。

    项目设计集合(人工智能方向):助力新人快速实战掌握技能.自主完成项目设计升级,提升自身的硬实力(不仅限NLP.知识图谱.计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户 ...

最新文章

  1. 《互联网理财一册通》一一第12章 移动互联网“指尖上的理财”
  2. postgresql 10.1 分区表之 list 分区
  3. VS中的 MD/MT设置
  4. Kafka 配置说明
  5. springCloud - 第10篇 - 服务间调用追踪 (zipkin 的使用)
  6. git 初始化git存储库_什么不保存到Git存储库中
  7. 如何更新Node.js?
  8. [转载] python中字典中追加_python 中字典中的删除,pop 方法与 popitem 方法
  9. 二流学校的计算机博士,“二流大学”的博士,值得读吗?想的尴尬症都犯了
  10. Atitit 图像指纹识别匹配sift算法 atlks总结
  11. C\C++中函数后面加const
  12. 整理编程语言列表大全,你最熟悉哪些?
  13. 数字后端基本技能之:绕线Congestion怎么解?
  14. php yii2 ddd,Xunsearch SDK for PHP/yii2
  15. 苹果公布 2022 Apple 设计大奖入围作品
  16. python中的相对导入//__name__和__package__的作用//以及相对导入的两个经典错误
  17. 【Android--项目构建失败原因及解决】
  18. pip使用豆瓣的镜像源
  19. 熵为什么使用log?
  20. C语言之简单版本银行储蓄系统4(结构体版本)

热门文章

  1. 创建型设计模式学习笔记
  2. $nextTick 跟 setTimeout的使用
  3. 【Python笔记】正则表达式基础和应用
  4. css前缀匹配,CSS选择器子串
  5. String 类型三元表达式
  6. 安全防御体系建设过程中常见的盲区
  7. Python:中文分词库jieba安装使用
  8. 宏函数和函数的区别及其优缺点
  9. 如何避免群发短信内容被屏蔽
  10. Python基础——a, b = b, a+b和a = b,b = a + b的区别