爱美容
当前位置: 首页 美容百科

ai游戏攻略(请查收AI玩游戏大礼包)

时间:2023-07-09 作者: 小编 阅读量: 1 栏目名: 美容百科

玩家每找到一块奶酪得到一分,每次掉进凹坑时减去一分。基本前提是,通过奖励或惩罚,根据先前的经验教算法作出某些行动。q-learning算法的工作原理是通过保存一个所有可能状态的和这些状态下玩家所有可能采取的行动的表。这意味着,为了优化AI可以获得的总奖励,对于一个特定的状态,从表中选择能获得最大潜在奖励的动作。这是必要的,因为q-learning算法需要参考游戏分数来更新Q表。首先,暂停0.05秒,使我们能够为AI玩家跟随游戏的图形。

给各位拜个年!

本文将教你如何使用q-learning强化学习算法,教计算机掌握简单的电子游戏。我们将从头到尾使用Ruby实现该算法,而不使用外部gems。

为了使我们能够说明算法的内部原理,我们将教它玩一个非常简单的一维游戏。然而,这种算法可以很容易地应用于更复杂的游戏。

游戏

这是一个“捕捉奶酪”控制台游戏,玩家P必须移动以获得奶酪C,且不使奶酪掉进坑O中。玩家每找到一块奶酪得到一分,每次掉进凹坑时减去一分。如果玩家得到5分或-5分,则游戏结束。这个gif展示了游戏过程。

注意为了简化游戏,凹坑O和奶酪的位置总是相同的。

Q-learning算法

Q-learning算法是一种增强学习算法。增强学习算法是受行为心理学启发而产生的一套机器学习算法。基本前提是,通过奖励或惩罚,根据先前的经验教算法作出某些行动。类似于教一只狗坐下,当它表现得好时就奖励它。

q-learning算法的工作原理是通过保存一个所有可能状态的和这些状态下玩家所有可能采取的行动的表。对于每一对的游戏状态S和玩家动作A,表中包含一个数值Q,代表在状态S时采取动作A可能获得的奖励。这意味着,为了优化AI可以获得的总奖励,对于一个特定的状态,从表中选择能获得最大潜在奖励的动作。

从上面来看我们的游戏。根据玩家的位置(记住凹坑和奶酪的位置是静止的),游戏共有12种可能的位置,并且每种状态下玩家可以采取两种行动,向左或向右。

这儿给了我们一个这样的Q表-注意这只是一个例子,现实中的Q表中的值可能会有所不同:

正如你所看到的,Q表表明,当靠近凹坑时,采取向左的行动可能会有一个负的奖励,而靠近奶酪时,向右可能会获得一个正的奖励。

Q表初始化为随机值,这样做是因为AI 还不知道关于游戏的任何信息。为了学习如何玩游戏,我们必须根据经验设计一个更新Q表的算法。

做法如下:

步骤1:用随机值初始化Q表

步骤2:玩游戏时执行以下循环

步骤2.a :生成0-1之间的随机数-如果数字大于阈值e,则选择随机动作,否则根据状态和Q表选择可能获得最高奖励的动作。

步骤2.b:从步骤2.a开始执行操作

步骤2.c:采取行动后观察奖励r

步骤2.d:使用公式根据奖励r更新Q表

\[ \displaystyle Q(s_{t},a_{t})\leftarrow\underbrace {Q(s_{t},a_{t})} _{\rm {old~value}} \underbrace {\alpha } _{\rm{learning~rate}}\cdot \left(\overbrace {\underbrace {r_{t}} _{\rm{reward}} \underbrace {\gamma } _{\rm {discount~factor}}\cdot \underbrace {\max_{a}Q(s_{t 1},a)} _{\rm {estimate~of~optimal~future~value}}} ^{\rm{learned~value}}-\underbrace {Q(s_{t},a_{t})} _{\rm {old~value}}\right) \]

如你所见,对Q表的更新将使用当前状态和操作的新学习的奖励信息,以及有关未来操作的信息,而无需遍历所有可能的未来操作,只需使用Q表即可。这使得Q学习成为一个相当快的学习算法,但也意味着它在开始阶段确实有一些随机行为,所以没有几次操作后你的AI不可能完美。

实现Q-LearningAI 玩家课程

我们的游戏通常以人类玩家类的一个实例作为玩家对象。人机类的实现如下所示。玩家类实现两个函数,一个构造函数和一个get_input函数。

在游戏循环的每次迭代中调用一次get_input函数,并根据键盘输入返回玩家的方向,如下所示:

require 'io/console'

class Player

attr_accessor

def initialize

@x = 0

end

def get_input

input = STDIN.getch

if input == 'a'

return :left

elsif input == 'd'

return :right

elsif input == 'q'

exit

end

return :nothing

end

end

为了建立一个Q-Learning AI 玩家类,我们将实现一个含有q表的新玩家类,并基于上述算法实现get_input函数。

我们将新类及其构造函数定义如下。注意,我们为这个玩家定义了一个新的属性游戏。这是必要的,因为q-learning算法需要参考游戏分数来更新Q表。此外,在构造函数中,为上面算法中概述的每个学习参数定义属性,并初始化随机生成器。

class QLearningPlayer

attr_accessor :x, :game

def initialize

@x = 0

@actions = [:left, :right]

@first_run = true

@learning_rate = 0.2

@discount = 0.9

@epsilon = 0.9

@r = Random.new

end

接下来,我们定义一个函数来用随机值初始化Q表。状态数是游戏的地图大小,每个状态都只是玩家的位置。

def initialize_q_table

# Initialize q_table states by actions

@q_table = Array.new(@game.map_size){ Array.new(@actions.length) }

# Initialize to random values

@game.map_size.times do |s|

@actions.length.times do |a|

@q_table[s][a] = @r.rand

end

end

end

最后,我们实现了如下的get_input函数。首先,暂停0.05秒,使我们能够为AI玩家跟随游戏的图形。

接下来,我们检查这是否是第一次运行,如果是这样,我们对Q表进行初始化(步骤1)。

如果这不是第一次运行,我们将评估自上次请求输入以来在游戏中发生的事情,以确定Q学习算法的奖励r。如果游戏分数增加,将奖励设为1,如果分数减少,我们将奖励设为-1,如果分数没有改变,奖励为0(步骤2.c)。

然后,将结果状态设置为游戏的当前状态(在例子中是玩家的位置),并按照方程式(步骤2.d)更新Q表:

def get_input

# Pause to make sure humans can follow along

sleep 0.05

if @first_run

# If this is first run initialize the Q-table

initialize_q_table

@first_run = false

else

# If this is not the first run

# Evaluate what happened on last action and update Q table

# Calculate reward

r = 0 # default is 0

if @old_score < @game.score

r = 1 # reward is 1 if our score increased

elsif @old_score > @game.score

r = -1 # reward is -1 if our score decreased

end

# Our new state is equal to the player position

@outcome_state = @x

@q_table[@old_state][@action_taken_index] = @q_table[@old_state][@action_taken_index]@learning_rate * (r@discount * @q_table[@outcome_state].max - @q_table[@old_state][@action_taken_index])

end

根据上一步更新Q表之后,我们现在将以前的分数和状态用于下一次运行。

然后,我们根据epsilon e(步骤2.a)随机或基于q表选择一个新操作,并返回该操作(步骤2.b)。

# Capture current state and score

@old_score = @game.score

@old_state = @x

# Chose action based on Q value estimates for state

if @r.rand > @epsilon

# Select random action

@action_taken_index = @r.rand(@actions.length).round

else

# Select based on Q table

s = @x

@action_taken_index = @q_table[s].each_with_index.max[1]

end

# Take action

return @actions[@action_taken_index]

这就完成了Q-learning算法的实现。

运行算法

有了我们的Q_learning 玩家,我们就可以运行游戏,让我们的游戏运行10个回合。

正如你所看到的,在第一回合中,玩家尝试了各种不同的事情,毫无目标的前进或后退。这是由于Q表的随机初始化造成的。然而,一旦玩家得到了几分,掉入了凹坑中,它很快就会学会避开凹坑,径直地走向奶酪。

在第7次和第8次运行中,AI玩家非常接近完美的解决方案,即在35个动作中直接进入奶酪。然而,在第9和第10个回合中,要赢得比赛需要39步。这是由于epsilon因子e的缘故,它有时会导致算法进行随机移动,而不是最佳移动。这种随机性是确保算法能够正确地探索整个游戏,并且是不会陷入局部最优状态的必要条件。

下一步…

这篇文章展示了如何应用Q-learning来教AI玩一个简单的游戏。正如你所能想象的,随着游戏复杂性的增加,Q表的大小会爆炸。避免这种情况的一种方法是用神经网络代替Q表。

DeepMind Technologies的研究人员在论文 Playing Atari with Deep Reinforcement Learning (https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf)中探索了这个方法。

本文成功地用神经网络Q表训练了Q-learning,使其能够玩Space Invaders,Pong,Q*bert和其它Atari 2600游戏。

    推荐阅读
  • 怎么样让眼睛变大的最有效的方法(5种方法让你的眼睛变大)

    使用时先轻刷一层睫毛膏,趁睫毛膏尚未干掉时,将增长纤维的刷头转出,并将刷头上的白色细致纤维轻轻以滚动方式附着每根睫毛的尖端部位。再重复刷上黑头睫毛膏,电眼效果max。

  • 双减带给老师的挑战和机遇(双减之后教师面临的)

    7月24日,中共中央办公厅、国务院办公厅印发了《关于进一步减轻义务教育阶段学生作业负担和校外培训负担的意见》。面对教师陡然增加的负担,教育部相关负责人回应,将继续督促指导各地将教师减负工作同优化教师资源配置、深化教育教学改革等有机结合起来,健全教师减负长效机制,推动教师减负工作取得实效。“双减”政策明确提出,要构建教育良好生态,有效缓解家长焦虑情绪,促进学生全面发展、健康成长。

  • 我的世界橡胶甘蔗怎么杂交 我的世界粘性甘蔗种子

    杂交前需要合成作物架,用4个木棍合成,摆放成左右两列,合成2个作物架,由于杂交的几率比较低,所以需要准备多点作物架。拿着作物架在,每两个种了甘蔗的耕地的中间,放上两个作物架,作物架成十字交叉,代表此时在进行杂交。进行一段长时间的等待,等待甘蔗长大,等待杂交成功,注意杂交的地方很容易长杂草,如果长了杂草请尽快打掉,否则整个耕地都会蔓延杂草,需要重新杂交。

  • 娃哈哈新媒体营销策划(第13届娃哈哈营销策划大赛重磅来袭)

    为了丰富大学生的课余生活,引导和培养大学生创新精神和实践能力,4月23日18时30分,第十三届娃哈哈全国大学生营销策划大赛启动仪式于南宁职业技术学院大礼堂顺利举行。娃哈哈营销大赛为大学生提供了一个广阔的实践平台,推动教育与实践相结合,使同学们的创新意识得到激发。在此预祝娃哈哈营销策划大赛取得圆满成功,也祝本次参赛的团队都能够在比赛中取得佳绩!

  • 狮鹫怎么驯服(方舟生存进化手游狮鹫驯服技巧攻略)

    接下来我们就一起去研究一下吧!狮鹫怎么驯服方舟生存进化中狮鹫是高傲的守护兽,想要驯服狮鹫并不容易,必须获得狮鹫的尊重,这并不算容易的事,下面就来介绍一下怎么驯服狮鹫的方法吧。第一种方法:人物等级85级以上,并且不是可以获得全部尊重的!比如85级的,可能只能获取低等级狮鹫的尊重!

  • tabata间歇性训练的方法(什么是Tabata锻炼)

    各种研究得出结论,Tabata锻炼对健康有很多好处。有时您可能会达到最大强度,这可能会因肌肉松懈而导致受伤每周最多进行3-4次Tabata训练。Tabata锻炼以多种方式改善健康。此外,心脏病患者在开始Tabata锻炼之前还应听取医生的建议。在没有科学证据的情况下,对原始Tabata版本的修改可能弊大于利。人们可能会选择Tabata只是为了减肥,这不是它的实际用途。与传统HIIT相比,Tabata的强度水平更高,恢复时间更短。

  • s10和s9有什么区别(s10和s9有什么区别瑞思迈)

    vivoS9电池容量4000mAh,配置33W闪充。vivo官方宣布vivoS10系列于2021年7月15日正式发布,该手机代言人有Lisa、蔡徐坤、刘昊然。2021年7月15日,vivo召开了S10系列发布会,会上发布了新一代自拍旗舰vivoS10系列,其vivoS10系列依然采用了前置4400万像素AF双摄设计,仍然支持105度超广角,还有前置微缝式双柔光灯。

  • 专业版微博怎么设置(其实很简单)

    接下来我们就一起去了解一下吧!专业版微博怎么设置需要认证过才能成为专业版。专业版微博是为企业和机构定制的微博。新浪微博企业版是我们为企业、机构用户量身打造的服务平台。它具有更丰富的个性化页面展示功能设置,更精准的数据分析服务,以及更高效的沟通管理后台。我们期待新浪微博企业版能够帮助企业更便捷地与目标用户进行互动沟通,提升营销效果转化,挖掘更多商业机会。

  • 变速箱油到底多久换一次呢(变速箱油多久更换一次)

    如果需要更换变速箱油,查看用户的保养手册上如果有明确的更换周期,按照规定换油。如果变速箱油是终身免维护的,也一样要引起重视,终身免维护并不意味着变速箱油一直不用换。其实变速箱油不像机油那么黑,相比于机油甚至更为干净一点。所以车主千万不要忽略变速箱油,如果过长时间不更换,也会对变速箱造成一定的损伤,而且一些汽车的变速箱比发动机还要昂贵,修一次可能得要好几万元。

  • 恐惧症会遗传吗 幽闭恐惧症会遗传吗

    恐惧症是发病率非常高的一种心理疾病,而有许多患者并没有得到有效的治疗。导致恐惧症的因素恐惧症是各种因素的共同作用。恐惧症的典型症状是恐怖发作,并伴有强烈的生理反应。尽管患者知道这种恐惧是不合理的,但是没法控制。研究表明,在100名患者中40名患者可以彻底治疗,基本上没有什么后遗症。所以一定要及早治疗,效果好,造成的危害也小。