公司法
当前位置: 首页 法律大全

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

时间:2023-07-09 作者: 小编 阅读量: 2 栏目名: 法律大全

玩家每找到一块奶酪得到一分,每次掉进凹坑时减去一分。基本前提是,通过奖励或惩罚,根据先前的经验教算法作出某些行动。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游戏。

    推荐阅读
  • 怎样烧红烧肉(家常红烧肉的做法)

    怎样烧红烧肉原料:精品五花肉、炖肉料包、葱、冰糖、茶叶。五花肉切条放入凉水中撇去血沫。焯水定型;捞出后晾凉切一样大的方块。锅中放少许油倒入白砂糖炒糖色。糖色的气泡由大变小迅速关火,倒入开水。加少许绍酒,加开水烧,熟得快,加入茶叶水,可以去腥味。改回炒锅大火,放冰糖,使汁粘稠即可出锅,香葱段点缀。

  • 2022杭州径山茶圣节时间、地点、活动一览

    最终集齐所有铜币的游客可至“大宋钱庄”兑换神秘礼物。今来茶韵生活01、陆羽说论坛为进一步挖掘径山茶宴有关历史文化,本届茶圣节特邀请茶学专家交流讨论如何更好保护和传承国家非物质文化遗产。为打造文化传播年,第二十一届中国茶圣节以春迎、夏凉、秋韵、冬福四大主题贯穿全年。

  • 《重生之门》给罗队发短信的人身份

    但是通过前文,不难推测应该是庄文杰发给罗队的短信,只是没有暴露自己的身份。罗坚来到青檀假日酒店排查,没有发现任何异常,庄文杰和许正清乔装改扮随后赶来,他们一出现就被人盯上,庄文杰和许正清来到地下停车场,庄文杰巧妙引开那些人,混进游客中进入酒店。这件事情把十二年前的洛神案串联起来了。

  • 爱情名著哪个好看(随侃名著佳作第6期)

    言下之意,他主动向周晓白提出分手。钟跃民成为一个军人,上了战场,并且是在战斗中受伤,被送到战地医疗帐篷内救治。而周晓白和钟跃民在时隔十多年后的相遇一刻,也是被编剧以及导演,安排得相当的特别,并不是那种悲情欲绝又或者是感动无比的相遇时刻。

  • 板栗可以保存多久 板栗怎么能保存时间长

    如果是晒干的板栗可以存放3-4个月,生板栗在常温下合理贮存可以存放1-2个月,煮熟的栗子大概可以放一周,熟板栗放冰箱冷冻能保存30天左右,熟板栗放冰箱冷藏保存可以存放5天。

  • 贾宝玉与红楼梦的关系(贾宝玉的春梦到底在暗示什么)

    贾宝玉与红楼梦的关系?要知道,贾琏这个人极其好色,而且好的就是熟女,那么从这个曲折的描述中,我们可以推断出,秦可卿应该是那种熟女中的极品。这个问题在书中得不到直接的答案,因为在后面的文章中,秦可卿一共只出现三个镜头:介绍弟弟秦钟与贾宝玉相见,秦可卿病后王熙凤带贾宝玉去探病,秦可卿临死前在梦里向王熙凤交代后事。

  • 简单又好看的剪纸适合儿童(孩子能学会的幼儿简单剪纸教程)

    接下来我们就一起去研究一下吧!简单又好看的剪纸适合儿童幼儿园的孩子经常要做各种各样的手工,通过做手工,提高孩子的审美能力,锻炼孩子的动手能力,培养孩子的专注力和耐心,让孩子更聪明。用蓝天白云绿色的草地,太阳、小兔子和小蘑菇,可以贴出一幅画,也可以用这个画面编出一个小故事,带孩子度过愉快的亲子时光。欢迎关注,学习更多幼儿小手工。

  • 摩尔庄园钓鲤鱼的最佳方法(摩尔庄园钓鲤鱼的有什么最佳方法)

    以下内容希望对你有帮助!摩尔庄园钓鲤鱼的最佳方法工具/原料:华为手机、安卓系统、摩尔庄园游戏。进入游戏后操纵游戏角色进行移动了。去商店购买钓鱼的诱饵。来到池塘边进行的钓鱼。等待的水面出现波动即可钓到鲤鱼了。

  • 国外的懒人产品(歪国产品咖在用哪些可爱的小工具)

    quotes=trueUsabilityHub我通常使用UsabilityHub来帮助确定设计方案。

  • 一年四季水果时间表(一年四季的时令水果是什么)

    3月(春季):枇杷、红香蕉、樱桃、杨桃、番荔枝、青枣、甘果蔗、草莓、番石榴、牛奶蕉、柑桔、观赏南瓜、果桑、鹤首瓜。12月(冬季):樱桃、番茄、红香蕉、鸡蛋果、木瓜、草莓、百香果、杨桃、无花果、番石榴、牛奶蕉、鹤首瓜、观赏南瓜、果蔗、台湾青枣、黑提子、人心果、柠檬、菠萝、油梨、柑橘、橙子。