V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linthieda
V2EX  ›  游戏

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

  •  
  •   linthieda · 2018-03-30 09:30:31 +08:00 · 2152 次点击
    这是一个创建于 2430 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    目前项目状态:非常不完善,没有任何图形化界面,开局一个命令行,战斗全靠脑补,还没打一半就出 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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2312 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:03 · PVG 08:03 · LAX 16:03 · JFK 19:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.