基于游戏的强化学习库

mazebase的Python项目详细描述


#mazebase:一个用于从游戏中学习的沙盒
此代码用于一个简单的2d游戏环境,可用于开发强化学习模型。它设计紧凑但灵活,能够实现多种游戏集。此外,它还提供精确的游戏难度调整,有助于课程建设,以协助培训。代码在lua+torch中,它提供了游戏的快速原型,并且很容易连接到控制代理行为的模型。有关更多详细信息,请参见我们的[论文](http://arxiv.org/abs/1511.07401)。


网格中的每个位置都可以是空的,也可以包含一个或多个项目,例如:
-**块:**不允许代理移动到该网格位置的不可通过的障碍物
-**水:**代理可以移动到有水的网格位置,但这样做会产生额外的成本。
-**开关:*开关可以处于m种状态之一,我们称之为颜色。当代理位于开关位置时,它可以通过切换操作循环切换状态。
-**门:**门具有与特定开关匹配的颜色。只有当开关的状态与门的状态匹配时,代理才能移动到门的网格位置。
-**可推块:**此块无法通过,但可以通过单独的"推"操作移动。块朝着推动的方向移动,代理必须位于与推动方向相反的块相邻的位置。
-**角:**此项仅标记板的一个角。
-**目标:**根据游戏,可能存在一个或多个目标,每个单独命名。
-**信息:**这些项目没有网格位置,但可以指定或提供完成该项目所需的信息。

环境以句子列表的形式呈现给代理,每个句子描述游戏中的一个项目。例如,代理可能会看到"block at[-1,4]。切换到蓝色的[+3,0]。信息:将开关切换到红色"但是,请注意,我们使用以自我为中心的空间坐标,这意味着环境在一个动作后更新每个对象的位置。环境是随机生成的,在不同的项目上有一定的分布。例如,我们通常指定高度和宽度的均匀分布,以及墙块和水块的百分比。

现有的游戏是:
-**多目标:**向代理提供一个目标的有序列表作为"信息",并需要按此顺序访问目标。
-**有条件的目标:**代理必须访问一个目标,该目标取决于交换机的状态。"信息"的格式为"进入目标4如果开关为红色,则进入目标2"。
-**排除:**此游戏中的"信息"指定了要避免的目标列表。代理应访问所有其他未提及的目标。
-**开关:**板上有多个开关,代理必须将所有开关切换为同一颜色。
-**轻键:**块墙中有一个开关和一扇门。代理应该导航到一个目标,该目标可能位于块墙的错误一侧,在该目标中,代理需要移动到并拨动开关才能打开门。
-**转到:**代理作为目标在网格上有一个绝对位置。当代理访问此位置时,游戏结束。解决此任务需要代理将其自身的以自我为中心的坐标表示转换为绝对坐标。
-**转到隐藏位置:**将为代理提供一个具有绝对坐标的目标列表,然后告诉代理按目标名称转到其中一个目标。代理没有直接给定目标的位置,它必须从目标位置列表中读取此信息。
-**推块:**代理需要推一个可推块,以便它位于对于开关。
-**推块基数:**代理需要推一个可推块,使其位于迷宫的指定边缘,例如左侧边缘。沿边缘的任何位置都是可以接受的。
-**封锁的门:**代理应该导航到一个可能位于障碍墙对面的目标,如在轻键游戏中。但是,一个可推块会挡住墙上的空隙,而不是一扇门。

本[视频]中显示了每个游戏的示例(https://youtu.be/kwnp8jfri5e)。游戏的内部参数被写入一个[配置文件](https://github.com/facebook/mazebase/blob/master/lua/mazebase/config/game_u config.lua),可以很容易地修改。使用"luarocks make*.rockspec"安装mazebase或添加适当的路径:
``lua
package.path=package.path..'Lua/?/init.lua'
```
要在torch中将游戏环境作为独立环境使用,请首先使用
```
$th-ldisplay.start 8000 0.0.0
````
启动本地"显示"服务器,该服务器将启动远程桌面,以在"http://0.0.0.0:8000"处查看mazebase图形。有关详细信息,请参阅[完整回购](https://github.com/szym/display)。接下来,使用
``lua
g廑mazebase=require('mazebase')
```
包含init文件,然后我们必须设置要使用的配置文件。在这里,我们使用[论文]中使用的配置文件(http://arxiv.org/abs/1511.07401)
``lua
g撸opts={games撸config撸path='mazebase/config/game撸config.lua'}
```
我们调用这个函数来创建一个字典,其中包含游戏中使用的所有必需单词=g廑mazebase.new廑game()
```
如果有多个游戏,它将随机选择一个。现在,可以通过调用
``lua
s=g:to_sentence()
```
来检索当前的游戏状态,它将返回一个包含描述游戏中每个项目的单词(由"g_vocab"字典编码)的张量。如果您启动了显示服务器,您可以在浏览器上通过执行
``lua
g撸disp=require('display')
g撸disp.image(g.map:to撸image())
```

[示例输出](readme-images/demo-api.png"显示示例")

可能的操作列表在"g.agent.action\u names"中。当游戏中有多个代理时,我们可以在调用"g:act()"之前通过执行
``lua
g.agent=g.agents[i]
````
来选择要执行操作的代理。操作完成后,必须调用"g:update()",以便游戏更新其内部状态。
最后,我们可以通过调用"g:is_active()"来检查游戏是否完成。您可以运行"demo_api.lua"来查看使用随机操作的游戏。


让我们创造一个非常简单的游戏,一个经纪人必须达到目标。首先,我们创建一个名为"singlegoal.lua"的文件。其中,必须创建一个游戏类
``lua
local singlegoal,parent=torch.class('singlegoal','mazebase')
```
接下来,我们必须构造游戏项。在这种情况下,我们只需要在随机位置放置一个目标项:
``lua
函数singlegoal:\u init(opts,vocab)
parent.\u init(self,opts,vocab)
self:add_default_items()
self.goal=self:place_item_rand({type='goal'})
end
````
place_item_rand'函数将项目放置在空的随机位置。但是可以使用"place_item"函数指定位置。此函数的参数是包含项的属性(如类型和名称)的表。在这里,我们只将项目的类型设置为goal,但是可以包含任何n属性的数量(例如颜色、名称等)。

这可以通过将"update"函数更改为
``lua
函数singlegoal:update()
parent.update(self)
如果不是self.finished,则
如果self.goal.loc.y==self.agent.loc.y和self.goal.loc.x==self.agent.loc.x,则
self.finished=true
end
end
end
```
这将检查代理的位置是否与目标相同,并在其为真时设置标志。最后,当目标达到时,我们必须给予适当的奖励:
``lua
函数singlegoal:get_reward()
如果self.finished,则
返回-self.costs.goal--这将在配置文件中设置
否则
返回父级。get_reward(self)
结束
end
```
,我们将游戏文件包含在"mazebase/init.lua"中,方法是添加以下行
``lua
paths.dofile('singlegoal.lua')
````
,必须在"init_game_opts"函数中添加以下行:
``lua
games.singlegoal=singlegoal
helpers.singlegoal=optshelper
```
最后,我们需要一个新游戏的配置文件。让我们在"mazebase/config"中创建"singlegoal.lua"文件。游戏的主要参数是网格大小:
``lua
local maph=torch.tensor{5,5,5,10,1}
local mapw=torch.tensor{5,5,5,10,1}
```
前两个数字定义了参数的上下界。实际网格大小将从该范围均匀采样。其余三个数字用于课程培训。在最简单(最困难)的情况下,上限将设置为第3(4)个数字。第五个数字是改变上限的步长。同样,我们定义了一个包含块或水的网格单元百分比:
``lua
local blockspct=torch.tensor{0,.05,0,.2,.01}
local waterpct=torch.tensor{0,.05,0,.2,.01}
``
还设置了其他通用参数,但请参见实际的[config文件](https://github.com/facebook/mazebase/blob/master/lua/mazebase/config/singlegoal.lua)了解详细信息。现在我们准备好使用游戏了!


训练使用多线程CPU加速。
实现的模型是

1。多层神经网络
2。卷积神经网络
3。[端到端内存网络](http://arxiv.org/abs/1503.08895)。


命令行选项,运行
```
th main.lua-h
--hidsz内部状态向量的大小[20]
--非线性类型:tanh relu none[tanh]
--模型类型:mlp conv memnn[memnn]
--初始权重的初始标准值[0.2]
--max_attributes每个项的最大属性数[6]
--nlayers mlp中的层数[2]
--convdim卷积层中的特征映射数[20]
--conv_sz convnet和mlp的输入的空间范围[19]
--memsizememnn中的内存大小[20]
--nhop memnn中的跃点数[3]
--管理代理数[1]
--操作代理操作数[11]
--在此多个步骤[20]之后,最大步数强制结束游戏[20]
--游戏的games_config_路径配置文件[mazebase/config/game_config.lua]
--游戏可以指定单个游戏[]
--优化方法:rmsprop sgd[rmsprop]
--lRate学习率[0.001]
--最大梯度ent clip value[0]
--成本函数中基线项的α系数[0.03]
--epochs训练期数[100]
--nbatches一个epoch中的小批量数[100]
--小批量的批量大小(小批量的数量并行游戏)在每个线程中[32]
--nWorker用于训练的线程数[16]
--rmsprop的beta参数[0.97]
--rmsprop的eps参数[1e-06]
--保存文件名以保存模型[]
--加载加载模型的文件名[]
```
有关培训的详细信息,请参阅[论文](http://arxiv.org/abs/1511.07401)。

但你必须有展示包才能看比赛。例如,如果使用``--save/tmp/model.t7``选项保存一个经过训练的模型,则可以使用```--load/tmp/model.t7--epochs 0```选项加载该模型,然后运行``test()``命令查看它是否正在播放。

需要[torch7](http://torch.ch/)和[nngraph](http://github.com/torch/nngraph)包。
培训使用多线程加速。显示包是可视化游戏所必需的,可以通过
```
luarocks install display
```

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java能否使用OpenJPA将一个实体持久化到多个持久化单元?   java如何访问当前按下的键   java singleton是否意味着哈希代码总是返回相同的值?   inputstream无法在Java中同时使用STDIN和STDERR读取程序输出   java运行时有多贵。getRuntime()与获取内存度量相结合   java AndroidStudio ListView适配器更新   java小程序请求未扩展实时会话   java是设置布尔值所必需的关键部分?   java比较两个字符串,并突出显示发现的不匹配项   java带抽屉布局,无论哪个屏幕处于活动状态,如何在按下后退键时关闭应用程序?   爪哇:颜色有什么区别。黑色和彩色。黑色   Velocity模板中子类的java访问方法   java如何快速学习Drools或其他规则引擎   从Java应用程序访问时缓存数据库查询结果   java cassandra nodetool JPLISAgent。c错误   java我正在解析一个没有pubDate的RSS提要,有没有其他方法可以确定一个项目是何时发布的?