[DeepFEH] 基于强化学习的 Fire Emblem Heroes AI 寻求合作 + 骗星

2018-03-30 09:30:31 +08:00
 linthieda

这是一个针对特定战局进行训练的强化学习项目

主要目的是弄出一个框架,对于楼主这种不善于脑补战斗的,以后遇到不会的大英雄战又不方便抄作业(属性多一丁点就抄不成的情况好像很常见),可以稍稍借助一点外力

目前项目状态:非常不完善,没有任何图形化界面,开局一个命令行,战斗全靠脑补,还没打一半就出 bug 了

这个项目其实是由一个 FEH 模拟器+一个深度强化学习的神经网络组成, 模拟器输出当前战局状态和所有可以执行的操作,因为开发组成员们认为直接以游戏图像作为输入还是太难了。

其中 FEH 模拟器参考了一些 OpenAI Gym 的环境规范 Github 地址: https://github.com/linthieda/DeepFEH

而神经网络目前采用的模型是 DQN,(这个暂时仅由我和同学们开发) 在另一个 Github Repo 里,地址 https://github.com/linthieda/deepqn

由于楼主和其他几个开发成员都只是低端(学生级)码农, 所以码风比较野兽派,希望有心贡献代码的大大门谅解一些。

现在开发遇到了相当大的困难,主要是武器 /技能实在是太难实现,几乎每实现一个技能都要在很多地方加上 if else 这样的东西, 连相性克制的计算的复杂度也远远超出的楼主的预期 而楼主不知道怎么降低技能和模拟器框架的耦合度,使得开发难度 /工作量随技能数量指数爆炸

弄这个 AI 的原因一部分出于个人对这个游戏的爱好, 一部分出于课业的自由 Project 的完成度要求[主要是 DQN 部分,而模拟器的部分工作量远远超出了预期,因此寻求开源合作], 还有一部分出于私心(当然是骗星啦,希望大家能加个星)

希望有同样爱好这个游戏并且擅长 Python 的码农一同贡献代码。 目前 DQN 部分 楼猪和几个同学在拼命 Debug 中, 用三层网络已经可以训练出一些初步的结果(基于这个简化得不像样子的模拟器)

目前的模拟器可以简单的模拟一些战斗,数据文件还很稀缺,如果有爬虫大师直接从 wiki 上爬数据就简单多了。用于训练的模块正在重构中, 模拟器简单的中文 Demo,如果你实在闲得蛋疼可以试一试:

环境要求 Py 3.6+,numpy

from feh_simulator.session import Session    # 导入战局包
mf = "./feh_simulator/map_data/map_01.txt"   # 地图数据的相对路径
ut = [1, 1, 1, 1, 2, 2, 2, 2]  # 8 个单位的队伍编号,1 我 / 2 敌 (不过在模拟器环境下我方单位全部行动完即开始操作对方单位)
uf = []
uf.append("./feh_simulator/unit_data/unit_default.txt")   # 8 个单位的路径, 偷懒都用同一个单位
uf.append("./feh_simulator/unit_data/unit_default.txt")
uf.append("./feh_simulator/unit_data/unit_default.txt")
uf.append("./feh_simulator/unit_data/unit_default.txt")
uf.append("./feh_simulator/unit_data/unit_default.txt")
uf.append("./feh_simulator/unit_data/unit_default.txt")
uf.append("./feh_simulator/unit_data/unit_default.txt")
uf.append("./feh_simulator/unit_data/unit_default.txt")
sess = Session(mf, uf, ut)
sess.map.render()     #  显示当前地图  每一组数据:前表示地形,:后表示单位 ID,比如第五行第一列 0:5 表示 地形 0 (平原)存在一个 5 号单位
1:_  0:_  0:1  0:2  0:3  2:_  
0:_  2:_  0:4  0:_  1:_  0:_  
0:_  0:_  2:_  0:_  0:_  0:_  
0:_  0:_  2:_  0:_  2:_  0:_  
0:5  0:_  2:_  0:_  2:_  0:_  
0:_  2:_  0:_  0:_  2:_  0:6  
0:_  2:_  0:_  0:_  0:_  2:_  
0:_  0:_  0:7  1:8  0:_  2:_  
action_space = sess.get_available_actions()   #  获取当前动作空间, 动作空间的规范暂时还没有时间写文档 QAQ
action = action_space[10]  # 如果要采取动作,选择动作空间中的一个动作
sess.operate(action)  # 进行动作

然后可以再用 sess.map.render() 看看现在地图长什么样

以上就是目前模拟器部分能干的事情了,非常简陋

地图的地形数据在 ./feh_simulator/map_data 里,有一个地图文件的规范

同样,单位数据在 ./feh_simulator/unit_data 里, 同样有相应的规范

目前模拟器部分和相应文档都很不完善

先把坑挖出来,以后慢慢填。

楼主需要鼓励 QAQ

2099 次点击
所在节点    游戏
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/442723

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX