大家好, 欢迎学习本教程｡
在上一个教程中, 我们初始化了地图, 现在是时候开始激动人心的工作了｡
我们创建了核心, 然后用类来实现｡
当然, 你会发现这个类非常实用, 可以创建很多属性, 因为正如你所看到的,
我不仅为我的车定义了一些变量, 还定义了一些函数, 当然, 这些函数可以让车向左,
向右, 或者直行.
因此, 我们有几个变量对描述环境非常重要｡
例如, 我们有角度, 它是x轴和汽车方向轴之间的角度｡
然后是旋转, 这是它的最后一次旋转, 它会记住0度, 20度或-20度｡
然后我们有速度, 速度向量的x坐标和速度向量的Y坐标,
然后是速度X和速度y的向量｡
然后我们有传感器和信号, 这非常重要｡
我们正在制造的汽车将有三个传感器, 因为一个传感器2和传感器3｡
一号传感器会探测车前是否有气味｡
然后传感器2是将检测是否有任何气味在汽车的左边的传感器｡
第三个传感器是用来探测车右侧是否有气味的传感器｡
然后从这三个传感器中, 我们得到信号, 即每个传感器接收到的信号｡
因此, 信号1是由传感器1接收的信号｡
信号二是由传感器二接收的信号, 信号三是由传感器三接收的信号｡
那么它是如何工作的呢？
信号1是传感器1周围的发送密度｡
信号二是传感器二周围的气味密度, 信号三是传感器三周围的沙子密度｡
我们如何计算沙子的密度？
这很简单
我们在每个传感器周围画一些大方块｡
这些实际上是200乘200的正方形｡
对于每个正方形, 我们用正方形中1的个数除以正方形中单元格的总数,
即20乘以20等于400｡
这就给出了沙子的密度, 因为这些密度对应着沙子的密度｡
我们对每个传感器都这样做, 这样就得到了每个传感器周围沙子的密度｡
那就是信号｡
好吧, 我会的
所以现在我们有了检测沙子的一切, 然后我们有了移动功能｡
当然, 移动函数允许内核向左､ 直行或向右移动｡
所以让我们快速浏览一下｡
我们这里更新了核心的位置, 它的最后位置, 也就是经过这里的self和速度矢量｡
因此, 由于速度矢量, 位置将在速度矢量的方向上更新｡
然后我们得到了旋转, 我们将在下面的代码中得到它｡
旋转等于动作到旋转动作, 在这里我们将选择动作, 然后获得旋转｡
所以这个自旋转等于旋转｡
这是一个旋转, 我们知道如何旋转, 向左或向右的核心｡
然后我们更新角度, 我提醒你, 这个角度是x轴和核心方向轴之间的角度｡
一旦内核移动, 我们就必须更新传感器和信号,
因为内核刚刚旋转, 而传感器也在旋转, 因此我们需要使用rotate函数旋转传感器,
并将新位置添加到其中｡
为什么我们会有这个矢量300？
这是因为30是核心和传感器之间的距离｡
你知道, 它是核心和核心探测到的东西之间的距离｡
一旦传感器被更新, 那么就该更新信号了｡
所以这里我们完全按照我解释的来计算信号｡
我们得到传感器的X坐标, 然后我们把所有的细胞从负10到正10｡
然后我们对Y坐标做同样的处理, 把所有的单元格从-10取到+10｡
因此, 我们得到了传感器周围20 × 20像素的正方形, 在这个正方形内, 我们将所有的像素相加｡
所以基本上我们把所有的单元格加起来, 因为这些单元格要么包含0, 要么包含1｡
因为在20乘20的平方里有20乘20等于400个细胞｡
我们把它除以400, 得到正方形内一次的密度｡
这就是我们如何获得传感器周围细胞密度的信号｡
我们对第二个传感器和第三个传感器做了同样的操作, 以获得第二个信号和第三个信号｡
好吧, 我会的
所以这就是检测的意义｡
这里的三行代码非常重要｡
这是另一个糟糕的奖励, 我们想给予我们的车时, 它是达到地图的边缘之一｡
我们不想让车撞到墙上, 所以我们想惩罚它, 当它太靠近墙的时候惩罚它.
因此, 这就是我们在这里所做的｡
如果第一个传感器大于longer-10, 它就大于这里因为这里的距离更长｡
再长一点, 负10就在这里｡
所以如果传感器1x大于, -10,
表示所有点都在这里, 也就是说, 如果汽车越来越靠近地图的右边缘, 或者传感器1x小于10.
就是这里｡
如果汽车越来越靠近地图的左边缘, 或者如果传感器Y大于-10, 那就是地图的上边缘｡
和/或如果自传感器y小于10, 则其为地图的下边缘｡
如果第一个传感器到达这四个边缘中的任何一个, 那么, 我们将把传感器的信号｡
信号一是传感器一的信号｡
我们将其设置为1｡
这是什么意思？
这意味着完全发送, 像一个完整的气味密度｡
这是你能得到的最糟糕的东西｡
它会让你的车停下来｡
所以信号是1, 所以车会得到一个非常糟糕的奖励｡
好吧, 我会的
然后我们对来自传感器2和传感器3的信号2和信号3进行了同样的处理｡
好吧, 我会的
然后我们创建游戏类｡
这就是创建游戏的类因为到目前为止我们只创建了汽车.
当然, 现在我们必须创建地图, 我们必须创建游戏本身, 所以我们不会玩游戏｡
是我们的人工智能在玩游戏｡
这个游戏实际上是要避开障碍物, 从机场到市中心, 反之亦然｡
所以在这个博弈类中, 我们需要创建一些像汽车这样的对象, 然后我们需要定义更新函数, 这是最重要的｡
实际上, 我们现在将重点关注这一点, 因为这是在这个更新功能中,
我们将选择汽车在每次完成其目标时必须执行的操作｡
而这个动作正是我们的神经网络的输出, 这个神经网络将是我们人工智能的核心｡
所以这个动作是由汽车的大脑返回的, 我提醒一下, 它是我们当前类的对象,
将在我们的AI文件中生成｡
这个对象有一个叫做update的方法, 它把最后一个奖励和最后一个信号作为输入｡
所以最后的奖励当然是, 最后的奖励是由汽车获得的｡
而最后一个信号当然是三个传感器的最后一个信号｡
来自传感器1的信号1来自传感器2的信号2来自传感器3的信号3｡
然后我添加了另外两个输入, 即汽车相对于目标的方向｡
例如, 如果汽车正朝着目标前进, 那么方向将等于零｡
如果它稍微向右, 则方向将接近45度｡
如果它稍微向左, 方向将接近-45度｡
这是我们输入状态的第四个输入｡
最后一个输入是负方向｡
因此, 通常神经网络的输入是独立的｡
没有线性, 但如果我们加上它也没关系, 因为神经网络会用权重来修正它｡
但我还是注意到, 通过增加这个负方向, 好吧, 这使得汽车, 汽车的训练,
以稳定的探索｡
你知道, 我们这样做是为了让人工智能不总是朝着同一个方向探索｡
通过添加这个负方向, 我们确保它在两个方向上探索, 右或左｡
所以这三个信号, 加上方向和减去方向, 是我们编码向量的五个输入,
它们将进入网络｡
这是我们的输入向量, 将进入网络｡
当它进入网络后, 网络会返回输出, 这就是每次要执行的动作｡
而输出由这个更新函数返回, 它包含网络本身和网络的输出｡
因此, 这就是为什么我们必须输入最后一个信号, 也就是输入状态和较少的奖励,
因为要玩的动作也取决于较少的奖励｡
好吧, 我会的
然后我们更新病房的平均分数, 更新旋转,
我们使用移动功能根据所选的操作旋转汽车｡
我们更新了汽车到目标的距离, 我们更新了传感器的位置｡
一个球､ 二个球和三个球都对应于将在地图上表示传感器的球｡
你很快就会明白的｡
这一部分非常重要, 因为如果车撞上沙地,
我们就惩罚它, 正如你所看到的, 这意味着如果车撞上沙地, 它会减速.
这就是我们降低它的速度的地方｡
你知道, 它的速度通常是6, 就像你在这里看到的｡
如果它落在沙子上, 它就会是一个｡
所以它会被减速到1｡
你会看到汽车一旦进入沙地上是如何减速的｡
所以它慢了下来, 而且, 它得到了一个坏的奖励｡
它得到一个负一的奖励｡
而这实际上是你能得到的最糟糕的奖励｡
最好的奖励是一个｡
最差的奖励是负一, 奖励在负一和正一之间｡
否则, 如果车没有撞到沙子上, 它会保持正常速度, 速度为6.
然后我们再加些别的东西｡
如果它离目标越来越近, 那么它会得到一个稍微积极的奖励｡
如果它离目标越来越远, 那么, 它会得到一个轻微的负奖励, -0｡ 2.
然后是最后一个与奖励有关的条件｡
这是因为核心太靠近其中一个边了, 就像我们之前说的那样｡
还记得我们说过满沙吗？
好吧, 如果核心离地图的左边太近, 它会得到负一的奖励｡
如果它太靠近地图的右边缘, 它得到的奖励是2减1｡
如果它太靠近地图的底部边缘, 它会得到减一的奖励｡
如果它离地图左上角太近, 它的奖励就减一｡
所以这是一个可怕的惩罚｡
所以你会看到它如何快速学会不匆忙进入其他东西｡
好吧, 我会的
然后在目标达到时更新目标｡
所以, 你知道, 当汽车到达机场,
这是第一个目标, 这是地图的左上角, 而目标改变到地图的右下角, 这是市中心,
这正是我们在这里做的｡
我们更新目标的X坐标和Y坐标, 然后更新汽车到目标的距离｡
好吧, 我会的
那就不那么重要了｡
这只是一个类, 它会添加绘画工具, 让我们能够在地图上画出一些道路或障碍物,
这与洞穴更相关｡
你想看的话可以看一下｡
我将提供此代码的推荐版本, 如果您想更深入地了解如何使用Sky V, 我将提供一些参考｡
但我们离人工智能越来越远了, 所以我不打算深入讨论它的细节｡
这与汽车应用类的最后一段代码相同｡
这只是添加API按钮, 清除, 保存和加载｡
这就是我们要做的｡
清除画布保存｡
这一点非常重要｡
这是为了我们能够保存AI, 保存大脑, 这样你以后可以通过取加载功能来重复使用它,
这是我们在地图上添加的另一个工具来加载汽车的大脑, 也就是加载汽车的记忆,
如何在地图中导航｡
最后是最后一段代码, 它运行整个程序, 运行地图和人工智能本身｡
事实上, 这就是我们现在要做的｡
让我们来看看我们在这段代码中创建的所有内容｡
所以现在人工智能还没有实现｡
所以代码会有一个非常随机的运动｡
它看起来就像一只昆虫｡
但别担心, 我们会解决的｡
我们不仅要训练它像真实的汽车一样移动, 还要训练它沿着一些道路导航, 避开一些障碍｡
所以我们开始吧｡
我将选择所有内容并执行｡
这是地图这是车｡
好吧, 我会的
这是一个小东西, 你可以看到它看起来像一只昆虫, 这就是我们的车｡
所以就像我告诉你的, 这些动作完全是随机的｡
所以每次汽车在行动中随机选择是向左直行还是向右直行｡
这就是为什么它在做一些无意义的运动, 这就是为什么它看起来像一只昆虫｡
当然, 我们会解决这个问题｡
当然, 由于人工智能是激活的, 嗯,
它不会去, 这是机场在这里或市中心在地图的右下角｡
我们将通过制作I来解决所有这些问题, 这样我们就可以在这个核心或这个昆虫中实现人工智能｡
你可以看到这三个球, 黄色的, 红色的和白色的｡
这是我们的三个传感器｡
所以它能探测到周围是否有气味｡
说到气味, 好吧, 让我们扔一些｡
因此, 要做到这一点, 我只需要做一个点击左这里和｡
你知道, 画一些发送仍然点击左｡
所以现在我加了一些沙子, 我们可以再加一些｡
所以每次我添加沙子的时候, 正如你所看到的, 这就是在沙子数组中添加1｡
那是沙阵, 那是零零坐标的原点｡
这里有很多｡
如你所见, 这很好｡
汽车刚驶入沙地就减速了｡
正如你现在看到的, 它的速度确实慢了下来因为它正向沙滩前进, 现在它正试图逃跑.
所以我们要做的就是画一些路我们要画一些从机场到市中心的路, 我们要训练汽车保持在路上,
避开障碍物｡
好吧, 我会的
正如你所看到的, 有一个清除按钮来清除沙子｡
还有就是保存扣救车的脑子｡
事实上, 我们所说的分数曲线可以节省眼睛, 节省你的模型, 实际上,
节省你的汽车大脑｡
然后你可以知道, 当你离开你的代码或关闭你的电脑,
你想再回到它, 你可以使用加载按钮来加载你的模型, 这是加载大脑,
这将得到你的车训练有素的眼睛｡
好吧, 我会的
所以现在我等不及要开始做I了｡
这会很有趣的｡
我们将建立神经网络, 一旦汽车不按我们的要求工作, 我们将惩罚它｡
我们从下一个教程开始｡
在那之前, 好好享受吧｡
一､