问题:如何用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. 使用ajax和history.pushState无刷新改变页面URL
  2. Java Native Interface 二 JNI中对Java基本类型和引用类型的处理
  3. php中添加分类的界面设计,zblog php新增自定义分类模板和文章模板
  4. 沃森变频器故障12_维修电工浅谈:常见的变频器故障及处理
  5. tensorflow 滑动平均使用和恢复
  6. Nginx的初步安装
  7. mysql1846错误_远程连接MySQL报错ERROR 2003解决办法
  8. 【华为云技术分享】看得见的安心,一手掌握华为云DRS迁移进度
  9. 微服务升级_SpringCloud Alibaba工作笔记0020---Nacos之命名和空间分组以及DataId三者之间的关系
  10. mysql binlog 备份_Mysql数据库的增量备份与还原
  11. Delphi 7 ADO使用
  12. java实现即时通讯软件
  13. 最全哔哩哔哩学习资源大整理,主要分为14大类,包含各个方面的学习资源
  14. 如何求绝对值最小的数
  15. mysql dump 1449_Mysqldump 1449 错误解决 mysqldump: Got error: 1449
  16. 15W无线充电芯片介绍
  17. UltraISO使用和U盘安装原版系统指南
  18. Phonics 自然拼读法 ai, oa,ie, ee,or,j Teacher:Lamb
  19. android 自定义含有滚动选择器的对话框
  20. maven springboot 除去指定的jar包_Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置...

热门文章

  1. 锤子m1 android 7,Smartisan 锤子 M1L 入手两日感受和DIY换背盖经验分享
  2. 网站服务器数据丢失怎么补,服务器数据丢失原因,如何做服务器数据恢复?
  3. Vulkan并非“灵药“
  4. centos中如何重启php-fpm
  5. MQTT协议详解及开发教程(一)MQTT协议概述
  6. python deepcopy
  7. nginx配置搭建单网站/多网站
  8. Android测试工具-Monkey详解
  9. vue组件 - 封装使用
  10. java删除数组中重复元素