Unity人工智能之不断自我进化的五人足球赛

本文基于我前面发的两篇文章,需要对ML-Agents有一定的了解,详情请见:Unity强化学习之ML-Agents的使用、ML-Agents命令及配置大全。

我前面的相关文章有:

ML-Agents案例之Crawler

ML-Agents案例之推箱子游戏

ML-Agents案例之跳墙游戏

ML-Agents案例之食物收集者

ML-Agents案例之双人足球

本案例为本文根据双人足球基础之上尝试改进的五人足球。本案例使用了Unity的ML-Agents组件开发而成,这里使用了多智能体强化学习的算法MA-POCA,双方队伍相互学习相互博弈,促进共同进步,可以不断自我进化,从而成长为更加聪明的AI。

先放上效果:

在这里插入图片描述

在本案例中每一队分为前锋Striker、后卫Guard、守门员Goalie三个职业。其中前锋两人、后卫两人,守门员一人,比起原来的双人足球,需要训练的模型多出来两个,并且人数上多出来三个,训练难度大大提高。

模型输入

对于模型的输出,我这里仍然采取离散输出的形式,对于模型输入,就有大大的讲究了。

首先模型的输入维度不能过高,否则将导致模型的复杂度大大提高,大大降低训练速度,对于电脑性能不太好的炼丹师更是如此。同时过于复杂的输入也会使得模型难以寻找真正有用的信息,导致Overfitting。同时输入要选择容易训练的数据,比如射线传感器,好处是直观,如果直接给位置信息一般是Train不起来的。

我这里尝试了多种输入:

  1. 首先是没有使用任何传感器,全部使用数据输入。

    public override void CollectObservations(VectorSensor sensor)
    {if (useVecObs){sensor.AddObservation(transform.rotation.y);sensor.AddObservation((ball.position - transform.position).x);sensor.AddObservation((ball.position - transform.position).z);sensor.AddObservation(ballRigdbody.velocity.x);sensor.AddObservation(ballRigdbody.velocity.z);if (team == Team.Blue){sensor.AddObservation((GoalBlue.position - transform.position).x);sensor.AddObservation((GoalBlue.position - transform.position).z);sensor.AddObservation((GoalPurple.position - transform.position).x);sensor.AddObservation((GoalPurple.position - transform.position).z);}else{sensor.AddObservation((GoalPurple.position - transform.position).x);sensor.AddObservation((GoalPurple.position - transform.position).z);sensor.AddObservation((GoalBlue.position - transform.position).x);sensor.AddObservation((GoalBlue.position - transform.position).z);}// 添加每个智能体相对自己的位置信息,要求:列表中两队内部的排列顺序须一致// 添加自己队伍的四个foreach (var agentInfo in envController.AgentsList){if(agentInfo.Agent != this){if (team == Team.Blue){if (agentInfo.Agent.team == Team.Blue){sensor.AddObservation((agentInfo.Agent.transform.position - transform.position).x);sensor.AddObservation((agentInfo.Agent.transform.position - transform.position).z);}}else{if (agentInfo.Agent.team == Team.Purple){sensor.AddObservation((agentInfo.Agent.transform.position - transform.position).x);sensor.AddObservation((agentInfo.Agent.transform.position - transform.position).z);}}}}// 添加对手队伍的五个foreach (var agentInfo in envController.AgentsList){             if (team == Team.Blue){if (agentInfo.Agent.team == Team.Purple){sensor.AddObservation((agentInfo.Agent.transform.position - transform.position).x);sensor.AddObservation((agentInfo.Agent.transform.position - transform.position).z);}}else{if (agentInfo.Agent.team == Team.Blue){sensor.AddObservation((agentInfo.Agent.transform.position - transform.position).x);sensor.AddObservation((agentInfo.Agent.transform.position - transform.position).z);}}}}
    }
    

    相比于传感器的输入,这种输入方法的输入维度较少,所以网络规模也较小,缺点是难以训练,过于全面的数据在完全随机的网络参数的情况下反而难以找到重点,导致很长时间都Train不起来,但是一旦随机得好,智能体的上限是最高的。需要注意的点是由于双方使用的是同样的神经网络,所以我们在配置输入的时候需要根据队伍的不同有不同的配置,例如对于蓝方来说先输入蓝方球门位置,后输入紫方球门位置,对于紫方则需要先输入紫方球门位置,后输入蓝方球门位置。

  2. 使用Grid Sensor:

    在这里插入图片描述

    使用网格传感器时要注意:Grid Size的y应设置为1,x和z应当保持一致否则报错。

    由于网格数量至少都有几百,在加上探测的众多标签,因此输入维度有上千之多。这种传感器推荐在电脑配置较高的情况下使用,否则运行一个环境都会掉帧。优点是探测较为全面,基本不会漏过任何关键信息。

  3. 使用Ray Perception Sensor 3D:

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    使用射线传感器的好处是既没有像网格一样有太高维度的输入,行为模式也比单纯的数据输入容易学习。缺点是射线会被阻挡而且在远端较为稀疏,因此往往探测不到较为全面的信息。

    其中阻挡问题可以使用多个射线组件来进行弥补,每个组件探测其中的一层,实际上本案例就是这么处理的,其中第一个传感器探测墙壁球门以及球的位置,第二个传感器则探测敌我双方的智能体。

    本人开了两个环境进行了两天的训练,训练接近一千万个step,其中三个模型的ELO均能到达1400分以上。Guard和Striker的训练结果比较令人满意,Goalie差强人意,主要问题是探测球的传感器射线数目太少,因此本人建议对于守门员应当把球的标签放到拥有更加茂密射线的第二个传感器中。

奖励函数设置

奖励设置也非常有讲究,好的奖励函数设置可以大大加快训练过程:

  1. 首先对于前锋Striker,我们应当鼓励其进行进攻,因此每当球更加接近敌方球门,应当给予其奖励,当相反球接近我方球门时,应当给予惩罚。
  2. 对于守门员这种非常有别于其他智能体的行动模式,应当设立更加特别的奖励函数。我们不鼓励守门员离球门过远,因此当智能体离球门超过一定距离时,给予惩罚,离得越远惩罚越高。并且我们鼓励守门员能很好防守接近球门的每一球,因此当球远离球门时应当给予加分,相反靠近球门给予减分。
void GiveReward()
{switch (position){case Position.Striker:if (team == Team.Blue && Vector3.Distance(GoalPurple.position, ball.position) < halfRewardDistance){AddReward(0.002f);}else if (team == Team.Purple && Vector3.Distance(GoalBlue.position, ball.position) < halfRewardDistance){AddReward(0.002f);}else if (team == Team.Blue && Vector3.Distance(GoalBlue.position, ball.position) < halfRewardDistance){AddReward(-0.002f);}else if (team == Team.Purple && Vector3.Distance(GoalPurple.position, ball.position) < halfRewardDistance){AddReward(-0.002f);}break;case Position.Goalie:if(team == Team.Blue){if (Vector3.Distance(transform.position, GoalBlue.position) >= goalieRewardDstance){AddReward(-(Vector3.Distance(transform.position, GoalBlue.position) - goalieRewardDstance) / 500f);}else if (Vector3.Distance(ball.position, GoalBlue.position) <= goalieRewardDstance * 0.7){Vector3 blueGoalToBall = ball.position - GoalBlue.position;blueGoalToBall.y = 0;var r = Vector3.Dot(ballRigdbody.velocity, blueGoalToBall) / 500;                      AddReward(r);}}else if (team == Team.Purple){if (Vector3.Distance(transform.position, GoalPurple.position) >= goalieRewardDstance){AddReward(-(Vector3.Distance(transform.position, GoalPurple.position) - goalieRewardDstance) / 500f);}else if (Vector3.Distance(ball.position, GoalPurple.position) <= goalieRewardDstance * 0.7){Vector3 blueGoalToBall = ball.position - GoalPurple.position;blueGoalToBall.y = 0;var r = Vector3.Dot(ballRigdbody.velocity, blueGoalToBall) / 500;if (r < 0){r = r * 0.7f;}AddReward(r);}}break;case Position.Generic:break;}
}

对于集体奖励,在原有的进球得分的基础上,我们加上球往敌方球门方向移动得分,往己方球门移动减分的奖励函数,来使奖励变得更加稠密。添加此函数并在FixedUpdate中调用(前面需要获取球的刚体和双方球门的Transform):

void GiveReward()
{var ballVelocity = ballRb.velocity;ballVelocity.y = 0;var ballToBlueGoalDir = GoalBlue.position - ball.transform.position;var ballToPurpleGoalDir = GoalPurple.position - ball.transform.position;ballToBlueGoalDir.y = 0;ballToPurpleGoalDir.y = 0;ballToBlueGoalDir = ballToBlueGoalDir.normalized;ballToPurpleGoalDir = ballToPurpleGoalDir.normalized;m_PurpleAgentGroup.AddGroupReward(Vector3.Dot(ballVelocity, ballToBlueGoalDir) / 1000);m_BlueAgentGroup.AddGroupReward(Vector3.Dot(ballVelocity, ballToPurpleGoalDir) / 1000);
}

训练参数设置

同样的,训练使用了MA-POCA算法,并且在这种对称性博弈的环境中我们使用了self-play,并且我们应当使用课程学习来使训练更加平滑,在训练前期我们可以设置更大的碰球奖励来时智能体积极与球进行互动,在后期减少其奖励来使策略变得更加多元化。

我们需要配置前锋,后卫,守门员三种智能体的训练参数,以及课程各个阶段的参数。

behaviors:Goalie:trainer_type: pocahyperparameters:batch_size: 512buffer_size: 20480learning_rate: 0.0003beta: 0.005epsilon: 0.2lambd: 0.95num_epoch: 3learning_rate_schedule: constantnetwork_settings:normalize: falsehidden_units: 512num_layers: 2vis_encode_type: simplereward_signals:extrinsic:gamma: 0.99strength: 1.0keep_checkpoints: 5max_steps: 30000000time_horizon: 1000summary_freq: 20000threaded: falseself_play:save_steps: 50000team_change: 200000swap_steps: 1000window: 10play_against_latest_model_ratio: 0.5initial_elo: 1200.0Striker:trainer_type: pocahyperparameters:batch_size: 512buffer_size: 20480learning_rate: 0.0003beta: 0.005epsilon: 0.2lambd: 0.95num_epoch: 3learning_rate_schedule: constantnetwork_settings:normalize: falsehidden_units: 512num_layers: 2vis_encode_type: simplereward_signals:extrinsic:gamma: 0.99strength: 1.0keep_checkpoints: 5max_steps: 30000000time_horizon: 1000summary_freq: 20000threaded: falseself_play:save_steps: 50000team_change: 200000swap_steps: 4000window: 10play_against_latest_model_ratio: 0.5initial_elo: 1200.0Guard:trainer_type: pocahyperparameters:batch_size: 512buffer_size: 20480learning_rate: 0.0003beta: 0.005epsilon: 0.2lambd: 0.95num_epoch: 3learning_rate_schedule: constantnetwork_settings:normalize: falsehidden_units: 512num_layers: 2vis_encode_type: simplereward_signals:extrinsic:gamma: 0.99strength: 1.0keep_checkpoints: 5max_steps: 30000000time_horizon: 1000summary_freq: 20000threaded: falseself_play:save_steps: 50000team_change: 200000swap_steps: 4000window: 10play_against_latest_model_ratio: 0.5initial_elo: 1200.0
environment_parameters:ball_touch:curriculum:- name: Lesson0completion_criteria:measure: progressbehavior: Guardsignal_smoothing: truemin_lesson_length: 100threshold: 0.05value: 0.15- name: Lesson1completion_criteria:measure: progressbehavior: Guardsignal_smoothing: truemin_lesson_length: 100threshold: 0.1value: 0.08- name: Lesson3value: 0.005

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

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

相关文章

意甲第33轮尤文图斯VS博洛尼亚前瞻,尤文遇上“送分童子”

北京时间4月17日凌晨0&#xff1a;30&#xff0c;意甲第33轮将迎来一场焦点大战&#xff1a;尤文图斯主场迎战博洛尼亚。 本赛季的尤文&#xff0c;意甲、欧冠双线争雄&#xff0c;却经常让人捉摸不透。致力于打造快速、精准、全面的体育数据接口&#xff0c;提供赛事资讯、比赛…

Dataset之CIFAR-10:CIFAR-10数据集的简介、下载、使用方法之详细攻略

Dataset之CIFAR-10&#xff1a;CIFAR-10数据集的简介、下载、使用方法之详细攻略 目录 CIFAR-10的简介 1、与MNIST 数据集中目比&#xff0c; CIFAR-10 真高以下不同点 2、TensorFlow 官方示例的CIFAR-10 代码文件 3、CIFAR-10 数据集的数据文件名及用途 4、基于CIFAR-10数…

寒假第四天--排序--实况球员综合能力大比拼

实况球员综合能力大比拼 Time Limit: 1000MS Memory limit: 65535K 题目描述 大家都应该听说过实况足球吧&#xff0c;如果这个没听说过的话&#xff0c;大家应该听说过中国足球吧&#xff0c;无人不知无人不晓的神一样的队伍。 其实我们今天要讨论的话题主要是实况足球…

实况十 pes6

玩了两天删了实况九玩了两小时就删了在我看来实况的娱乐性一代不如一代可能是真实了&#xff0c;要真实我还不如自己踢阿不过ps上的实况确实完美&#xff0c;至于pc嘛实在不敢恭维 举几个例子&#xff1a;带球&#xff0c;实况8里的横拉为一大诟病&#xff0c;pes6确实改进不少…

软件测试考试中的环路复杂度、线性无关路径的理解

题目如下&#xff0c;回答问题1至3 int GetMaxDay (int year ,int month){int maxday0; //1if (month>1 && month <12) { //2,3if (month2) { //4if (year %4 0 ) { //5if (year %100 0) { //6if (year %400 0) {//7maxday29; //8else //9maxda…

【java】【项目实战】[外卖六]套餐管理业务开发

目录 一、新增套餐 1 需求分析 2 数据模型 3 代码实现 3.1 实体类SetmealDish 3.2 SetmealDto 3.3 SetmealDishMapper 3.4 SetmealDishService 3.5 SetmealDishServiceImpl 3.6 SetmealController 3.7 DishController 3.8 SetmealService 3.9 SetmealServiceImp…

学习JAVA打卡第四十四天

Scanner类 ⑴Scanner对象 scanner对象可以解析字符序列中的单词。 例如&#xff1a;对于string对象NBA 为了解析出NBA的字符序列中的单词&#xff0c;可以如下构造一个scanner对象。 将正则表达式作为分隔标记&#xff0c;即让scanner对象在解析操作时把与正则表达式匹配的字…

postman-使用Postman的模拟服务来模拟(mock)后端数据,完成前端模拟API调用

最近项目上比较忙&#xff0c;任务多时间紧&#xff0c;导致后端开发任务繁多&#xff0c;无法及时开发完毕&#xff0c;但是前端同学已经把对应功能开发完成&#xff0c;需要进行前后端联调来验证API及一些交互问题&#xff1b;这不能因为后端的进度来影响前端的工作完成情况&…

JAVA修练秘籍第五章《卧薪尝胆》

往期&#xff1a; JAVA 修炼秘籍第一章&#xff1a;《痛苦的折磨》 JAVA 修炼秘籍第二章&#xff1a;《逐渐魔化》 JAVA 修炼秘籍第三章&#xff1a;《绝地反击》 JAVA 修炼秘籍第四章&#xff1a;《闭关修炼》 文章目录 一、类和对象1.类的实例化2.属性3.方法 二、static关键字…

FreeMarker使用

说明&#xff1a;FreeMake可以通过设置一个模板&#xff0c;使用一些语法规则&#xff0c;可根据返回的VO数据填充到这个模板中&#xff0c;生成一个静态。这个技术&#xff0c;在项目中可以实现如预览页面的功能&#xff0c;将查询完成的VO数据按照这个模板填充&#xff0c;生…

网络模型分析

# 用户空间和内核空间 # 阻塞IO # 非阻塞IO # IO多路复用 IO多路复用-select 内核中遍历找到就绪的fd并保留&#xff0c;不匹配的就置为0&#xff0c; 以上的操作重复&#xff0c;知道所有的FD都完成 IO多路复用-poll IO多路复用-epoll IO多路复用-事件通知机制 很多进程都要用…

魔鬼之城

题目描述 在一个被分割为N*M个正方形房间的矩形魔鬼之城中&#xff0c;一个探险者必须遵循下列规则才能跳跃行动。他必须从(1, 1)进入&#xff0c;从(N, M)走出&#xff1b;在每一房间的墙壁上都写了一个魔法数字&#xff0c;是1&#xff5e;13之内的自然数&#xff1b;探险者可…

心灵毒药之CIA篇(二)

2019独角兽企业重金招聘Python工程师标准>>> 工欲善其事,必先利其器,而且最好是最锋利,最合适的器.因为器能成为你身体的延伸部分,同时还可以成为你信心的来源. 磨器的耐心,用器的巧心,藏器的无心. 转载于:https://my.oschina.net/piginwind/blog/713487

啊,万恶的this

一、全局下&#xff0c;this一般都指向window 全局下&#xff0c;ES5非严格模式&#xff0c;下面的this都是window。 console.log(this); function abc(){console.log(this); } abc();二、对象中的this 1、最常见的this情况&#xff1a; var a100;var obj{a:1,b:function()…

关押罪犯

题目&#xff1a; 描述S 城现有两座监狱&#xff0c;一共关押着 NNN 名罪犯&#xff0c;编号分别为 111 ~ NNN。他们之间的关系自然也极不和谐。 很多罪犯之间甚至积怨已久&#xff0c;如果客观条件具备则随时可能爆发冲突。 我们用 “怨气值”&#xff08;一个正整数值&#…

罪恶

&#xff0d;&#xff0d;&#xff0d;&#xff0d; 罪恶 还是属于闲得慌&#xff0c;瞎拍。也许您会帮我想个更棒的标题&#xff0c;或者干脆叫“无题”。 转载于:https://www.cnblogs.com/hzy5901/archive/2010/03/16/5871737.html

游戏开发学什么?四步修炼骨灰级高手

游戏开发学什么&#xff1f;四步修炼骨灰级高手 近日App Store公布了2013年年度最佳游戏奖项&#xff0c;复古风格的捕鱼游戏《奇葩钓鱼》荣获了iPhone平台上年度最佳游戏的殊荣&#xff0c;拥有独特视觉效果的横版冒险游戏《罪恶之地》夺得了iPad平台上年度最佳游戏的桂冠。…

代码随想录打卡—day42—【DP】— 8.27 01背包基础

1 01背包基础 背包概述&#xff1a; 1.1 01背包是什么 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 1.2 01背包二维数组 二维数组还…

3D飞镖游戏源码ios版

一款ios 3D飞镖游戏源码,通过物理引擎和重力感应来控制飞镖向目标物体击中&#xff01;游戏比较简单&#xff0c;可以学习一下3D游戏的基本开发. 源码下载&#xff1a; http://code.662p.com/view/6262.html 开发平台&#xff1a; 在xcode 4.3编译通过&#xff0c;iphone4&am…