这是一个我已经断断续续地研究了很长一段时间的项目。在此项目之前我从未尝试过修改游戏,也从未成功训练过“真正的”强化学习代理(智能体)。所以这个项目挑战是:解决钓鱼这个问题的“状态空间”是什么。当使用一些简单的 RL 框架进行编码时,框架本身可以为我们提供代理、环境和奖励,我们不必考虑问题的建模部分。但是在游戏中,必须考虑模型将读取每一帧的状态以及模型将提供给游戏的输入,然后相应地收集合适的奖励,此外还必须确保模型在游戏中具有正确的视角(它只能看到玩家看到的东西),否则它可能只是学会利用错误或者根本不收敛。

我的目标是编写一个能读取钓鱼小游戏状态并完美玩游戏的代理。目标的结果是使用官方 Stardew Valley 的 modding API 用 C# 编写一个自动钓鱼的mod。该模块加载了一个用 Python 训练的序列化 DQN 模型。所以首先要从游戏中收集数据,然后用这些数据用 Pytorch 训练一个简单的 DQN。经过一些迭代后,可以使用 ONNX 生成一个序列化模型,然后从 C# 端加载模型,并在每一帧中接收钓鱼小游戏的状态作为输入,并(希望)在每一帧上输出正确的动作。

钓鱼迷你游戏

这个代理是在SMAPI的帮助下编写的,SMAPI是Stardew Valley官方的mod API。API允许我在运行时访问游戏内存,并提供我所需要的一切去创造一个与游戏状态进行交互并实时向游戏提供输入的代理。

在钓鱼小游戏中,我们必须通过点击鼠标左键让“鱼钩”(一个绿色条)与移动的鱼对齐。鱼在这条竖线上无规律地移动,鱼钩条与鱼对齐时,绿色条就会填满一些,如果鱼成功逃离绿色条就会开始变空。当你填满绿色的条形图时,你会钓到鱼,当它绿条没有时鱼就跑了。

强化学习问题定义

所以这里只需要每帧从游戏内存中读取这些特定属性并将它们保存为在第 t 帧的状态。通过API我们可以查看并从游戏内存中读取特定属性的代码,对于自动钓鱼,需要在钓鱼小游戏期间跟踪的 4 个变量。 “钩子”中心的位置、鱼的位置、钩子的速度和绿色条的填充量(这是奖励!)。 游戏内部使用的名称有点奇怪,以下是读取它们的代码。

/ Update State
// hook position
bobberBarPos = Helper.Reflection.GetField<float>(bar, "bobberBarPos").GetValue();
// fish position
bobberPosition = Helper.Reflection.GetField<float>(bar, "bobberPosition").GetValue();
// hook speed
bobberBarSpeed = Helper.Reflection.GetField<float>(bar, "bobberBarSpeed").GetValue();
// amount of green bar filled
distanceFromCatching = Helper.Reflection.GetField<float>(bar, "distanceFromCatching").GetValue();

前三个定义了我们的状态:

这是模型可以在每一帧上可以获取的状态,要将其设置为强化学习问题还需要使用奖励来指导训练。 奖励将是绿色条的填充量,这是里的变量名称为 distanceFromCatching。 这个值的范围从 0 到 1,正好非常适合作为奖励。

Replay Memory

Replay Memory是 Q-learning 中使用的一种技术,用于将训练与特定的“时间”去关联。 所以需要将状态转换存储在缓存中并通过缓存中随机抽取批次来训练模型而不是直接使用最新数据进行训练。 为了训练模型,我们需要 4 个数据,分别是当前状态、下一个状态、采取的行动和奖励:

Q-learning 中关键问题是要获取曾经处于哪个状态和采取了哪些行动、到达哪个新的状态,以及执行这个行动中得到的奖励。有了这些数据,我们可以使用像价值迭代 (Value Iteration 一种动态规划算法)这样的简单算法将奖励从最终状态(获胜状态)开始分析,逐渐往回推直至推至所有状态。因此对于每个可能的状态,模型都会知道最大化其未来回报的方向。 但是我不会使用价值迭代来训练模型,因为真正的问题往往有太多的状态并且动态规划需要很长时间。

上面的价值迭代只是为了说明在 C# 中保存每个条目的方式。 这里使用缓存从最后一帧获取状态和动作,并将所有这些与当前帧的状态和奖励一起存储。

replayMemory[updateCounter,0] = OldState[0];
replayMemory[updateCounter,1] = OldState[1];
replayMemory[updateCounter,2] = OldState[2];
replayMemory[updateCounter,3] = NewState[0];
replayMemory[updateCounter,4] = NewState[1];
replayMemory[updateCounter,5] = NewState[2];
replayMemory[updateCounter,6] = reward;
replayMemory[updateCounter,7] = actionBuffer? 1 : 0;

所有这些数据都变成了一个巨大的 csv 文件,这样可以通过 Python 加载并用于训练 DQN 模型。

DQN 模型

使用神经网络估计 Q-table的 Q-Learning称为Deep Q-Learning。这个方法在很多个 Pytorch 教程中都有很好的解释,我从里面复制了很多代码并为我们的问题对其进行了一些修改。主要思想是使用两个神经网络。一个将估计 Q(s,a) 的值(Policy Net),另一个将估计未来 Q-values的值(Target Net)。然后我们对这两个网络的差异进行反向传播。

这是 Q-Learning算法的基本方程。我们将使用一个网络来估计当前状态 Q(s,a) 的正确值,另一个将估计下一个状态的最大可能值。两个网络都使用随机值进行初始化,并且每隔几次迭代将Policy Net权重复制到Target Net。Policy Net则通过反向传播更新权重 ,通过反向传播这种,Policy Net 最终将学会估计这两个值。

α 是学习率,

通过强化学习和官方API制作《星露谷物语》的自动钓鱼mod相关推荐

  1. 星露谷物语json_《星露谷物语》MAC版MOD使用教程

    导 读 <星露谷物语>MAC版MOD怎么安装使用,不少MAC版玩家为此很苦恼,MAC要怎么才能使用MOD呢,今天小编就为大家带来了星露谷物语MAC版MOD使用教程,还不会的小伙伴赶紧来瞧瞧 ...

  2. 【游戏设计】从星露谷物语中学习游戏制作

    毫无疑问,星露谷物语(Stardew Valley)是一款成功的独立游戏.它由ConcernedApe单人开发,在两周内卖出了40多万份.实现了所有独立游戏制作人的梦想,简直是业界标杆. 如果对以一人 ...

  3. 星露谷物语json_星露谷物语 NPC地图显示MOD 怎么让地图显示NPC

    星露谷物语 NPC地图显示MOD 怎么让地图显示NPC MOD说明: 地图上实时显示npc的位置. 使用方法: 通过游戏菜单或者按快捷键"M"打开地图界面.使用TAB按键来打开Mo ...

  4. 星露谷物语json_《星露谷物语》1.5版本更新细节公开 已上线PC

    目前,<星露谷物语>官方公开了1.5版本更新细节,目前1.5版本已经在PC平台上线,以下为此次公开的主要更新要点. 主要更新要点: 此次更新加入了全新区域"Ginger岛&quo ...

  5. 星露谷物语(Stardew Valley)Mod Farmtronics 机器人自动浇水代码

    模组介绍:[星露谷物语]你想要一群可爱可编程的工作机器人吗?Farmtronics模组介绍_哔哩哔哩_bilibili 参考文档 Farmtronics使用的编程语言语法 MiniScript-Qui ...

  6. html怎么安装整合包,星露谷物语|SMAPI安装教程,MOD推荐!

    星露谷物语在steam上面没有创意工坊,所以如果在游戏的游玩中需要使用MOD的话,我们只能去NEXUSMODS第三方网站下载安装MODS.而在安装MODS之前,需要先安装SMAPI才可以正常使用MOD ...

  7. 星露谷物语联机服务器没有空闲位置6,星露谷物语多人联机教程 联机MOD怎么用...

    MOD功能: sapcechase0大神提供的这个MOD允许玩家和朋友在线上创建单独的游戏,然后一起愉快的玩耍. MOD可以实现玩家之间经济.关系进度等内容的共享,美中不足的是,储存.技能和农舍内饰是 ...

  8. 星露谷物语服务器没有空闲位置什么意思,星露谷物语没有按照任务去找巫师 | 手游网游页游攻略大全...

    发布时间:2016-04-10 星露谷物语孤单之石怎么去?在星露谷物语里,会有着各种各样的玩法,其中就有玩家问孤单之石怎么去呢?下面就给各位玩家介绍一下. 我玩到第四年试了些方法去不了,理论上不应该是 ...

  9. 星露谷物语联机开服务器的人不在线,《星露谷物语》多人联机模式细节公布 竟可与NPC结婚!...

    <星露谷物语>多人联机模式细节公布 竟可与NPC结婚! 2017-08-02 12:34:28来源:游戏下载编辑:评论(0) 今天,Chucklefish宣布,旗下模拟经营游戏<星露 ...

最新文章

  1. Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受
  2. 一张小票看透支付清结算架构
  3. no acceptable C compiler found in $PATH
  4. Linux 中yum的配置
  5. Anaconda创建跟别人环境配置一样的虚拟环境(coda env creat -f environment.yml)
  6. Json转化的三种方式
  7. YTU 3003: 括号匹配(栈和队列)
  8. Thread.Sleep太久,界面卡死
  9. 微信小程序上线,后台接口失效问题
  10. 服务器lsass系统错误,电脑开机提示lsass.exe系统错误,安全帐户管理器初始化失败该怎么办?...
  11. 《SpringCloud Alibaba 微服务架构》专题(二十三)-Seat工作原理
  12. 台式计算机麦说不了话,耳机有声音麦克风没声音怎么办?解决电脑耳机有声音麦不能说话...
  13. n1装哪个版本的linux,斐讯t1/N1是装Ubuntu,还是LinuxDeploy,哪个更好?
  14. 40家全球知名MCU生产厂商及其详细介绍
  15. npm --save和--save-dev区别
  16. 快速识别无效数据(数据有效性/数据验证)
  17. 树莓派新手入门:烧录系统、换源、基础配置、putty或vnc远程连接
  18. Mongodb(三)Mongodb复制
  19. 原生js操作input文本框注册获取焦点、失去焦点事件,设置文本框默认值
  20. Ventoy制作PE启动盘 和 使用VMware测试启动盘 - alittlemc - 博客园

热门文章

  1. [转]iPhone 港版和美版,有锁版和无锁版的区别?
  2. 网课Php代码,php - PHP网络课程 - php中文网博客
  3. ca机构将会被区块链取代
  4. 个人记账软件(团队成员介绍和软件介绍)
  5. (修改gho文件办法)做属于自己个性的gho系统
  6. 【2020 ACM Fellow 华人学者】 吕晨阳 圣路易斯华盛顿大学
  7. 我与朗科不得不说的那些事儿
  8. 计算机考试怎么另存为,Word2007另存为.doc的更快捷方法
  9. [转帖]奋斗5年 从月薪3500到700万!
  10. Win10玩dnf输入法图标消失怎么办?