这是一个针对特定战局进行训练的强化学习项目
主要目的是弄出一个框架,对于楼主这种不善于脑补战斗的,以后遇到不会的大英雄战又不方便抄作业(属性多一丁点就抄不成的情况好像很常见),可以稍稍借助一点外力
目前项目状态:非常不完善,没有任何图形化界面,开局一个命令行,战斗全靠脑补,还没打一半就出 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