使用Tensorflow模仿HearthArena炉石卡片排名算法

简介: 使用Tensorflow模仿HearthArena炉石卡片排名算法

在这篇文章中,我将重新创造卡牌游戏《炉石传说》卡组制作工具的卡牌排名算法

什么是《炉石传说》

炉石传说-一个虚拟纸牌游戏

对于那些不知道的人来说,《炉石传说》是一款策略纸牌游戏,其目标是创建一个包含30张纸牌的卡组并与对手对抗,将对手降至0命值的玩家将首先获胜。在竞技场游戏模式中,玩家一次抽30张牌,每次在3张牌中选择。

640.png

在《炉石传说》中有许多获胜策略,玩家在决定选择哪张纸牌时需要考虑许多因素:

魔法值——什么时候可以使用的纸牌是受你有多少魔法值的限制的,所以有一个魔法值是很重要的(让你可以打出每个回合需要打出的纸牌)

卡牌价值——当你用完卡牌时,你很难获胜,所以拥有能够抽取/生成更多卡牌的卡牌很重要

节奏牌——当你打出快节奏的牌时,对比赛的影响就会更大,因为它们可以改变输赢的局面

配合—— 一些卡与其他卡更好的工作,和一些卡是反协同!

HearthArena是一个为玩家提供竞技场工具的网站,玩家可以通过给每一张卡牌分配一个分数来进行选择(分数越高的卡牌越好)。

heartarena算法是如何工作的?

HearthArena 算法内置了人类知识和机器的计算。首先,人们会根据上面提到的一些标准来评估一张卡片的好坏,从而分配标准化分数。牌和胜率的数据也会从玩家每天数据中收集。然后,这些数据被用来训练一个机器学习模型,该模型被应用于对卡片分数进行微小调整。

640.png

大量卡牌数据和胜率的数据可以使模型被训练出来更好的进行模式识别,而不需要我们进行更多的操作(端到端)。例如,如果两张卡牌相互协作并提高了它们所处卡牌的胜率,那么该模型便能够把握这种趋势并进行微调以反映这种协作。

重建HearthArena 算法

我的目标是模仿《HearthArena》的做法——给出到目前为止所选纸牌和当前3个选择的信息,为每个选择分配分数。然而,为了实现这一目标,我也创造了一个模型,即为任何30张纸牌的卡组分配分数。

这个项目有两个主要部分——获取卡组和胜率的数据并重新格式化,以及建立预测分数的模型。首先,获取数据。

640.png

在Python的Requests和BeautifulSoup库的帮助下,我能够从HearthArena的网站上获取胜率的数据。然而,棘手的部分是决定这个监督学习模型需要什么数据。

监督学习是基于标记数据的模型训练。例如,如果我想根据一个人的身高(输入)预测一个人的体重(输出),我将需要关于人的身高和体重的训练数据,因此我训练的数据被标记为——人的体重是已知的。回到HearthArena,我将尝试基于当前选择和关于之前纸牌选择的信息(输入)预测分数(输出),所以我将需要所有这些作为训练数据。

640.png

但是我只能找到关于卡牌的信息和它们的胜率(如Fireheart - 66%胜率),所以我缺少之前挑选的卡牌和相应的分数的数据。因此,我将注意力转向创建一个监督学习模型,以预测给定特定卡组(输入)的总体卡组得分(输出)。对于这个模型,我拥有所有我需要的数据——牌组列表以及相关的胜率,它们可以被规范化以获得牌组分数。

640.png

在提取数据之后,有必要对其进行格式化,以便能够将其输入模型。所以使用《炉石传说》API来提取所有可玩纸牌的列表,卡组列表(deck)被转换成以下格式:

+------------------+-----+-----+-----+-----+-----+|CardName|A|B|C| ... |Z|+------------------+-----+-----+-----+-----+-----+|Deck#1Counts|1|2|0| ... |1||Deck#2Counts|0|1|0| ... |0|| ...             | ... | ... | ... | ... | ... ||Deck#100Counts|1|0|3| ... |1|+------------------+-----+-----+-----+-----+-----+#Countsreferstothenumberofthatcardinthedeck#Sumofcountsacrossallcardsforeachdeck=30

将这些牌数和相应的牌组分数输入线性回归模型,我们可以看到,即使模型被训练了5000轮,也会有相当高的损失(误差)。

640.png

#EvaluationMetrics{'average_loss': 8.609376,
'label/mean': 75.03246,
'loss': 86.09376,
'prediction/mean': 74.83777,
'global_step': 5000}
#PredictionbyLinearRegressorarray([[71.079025]], dtype=float32)
#Actualscorearray([73.3])

相比之下,DNN回归模型即使在更短的时间(1000步)的训练下也优于线性回归模型。

640.png

#EvaluationMetrics{'average_loss': 3.021388e-05,
'label/mean': 75.03246,
'loss': 0.0003021388,
'prediction/mean': 75.031525,
'global_step': 1000}
#PredictionbyDNNRegressor (muchbetterperformance!)
[{'predictions': array([73.30318], dtype=float32)}]
#Actualscorearray([73.3])

完成主要目标

但我并不满足于预测给定卡组的得分。所以在深入探索《HearthArena》后,我惊讶地发现了不同卡组的数据。

640.png

现在我有了关于几十张纸牌的数据,以及之前挑选的纸牌。需要明确的是,我所构建的模型并没有遵循hearttharena的算法,即让玩家手动分配每张卡片的分数,并让算法对分数进行微调,而是尝试着在没有玩家干预的情况下模仿hearttharena的算法。

作为一个简短的说明,有检索数据约392卡组,各有30中挑选3卡,我有392 x 30 x 3 = 35280数据用来进行计算,这大样本量还帮助在训练中更精确的模型。

再次,我重新格式化了数据,然后在此数据上训练线性回归模型和DNN回归模型。这次的线性回归模型表现很差。

#EvaluationMetrics{'average_loss': 1083.2366,
'label/mean': 61.46461,
'loss': 10832.366,
'prediction/mean': 45.357845,
'global_step': 2000}
#PredictionbyLinearRegressor (ratherpoorperformance)
[{'predictions': array([79.04803], dtype=float32)},
{'predictions': array([82.29574], dtype=float32)},
{'predictions': array([77.59356], dtype=float32)}]
#Actualscores['Air Raid', 'Guardian Augmerchant', 'Holy Light']
[64.56, 64.69, 15.85]

DNN回归模型在预测卡片得分方面表现出色。640.png

#EvaluationMetrics{'average_loss': 315.33557,
'label/mean': 61.46461,
'loss': 3153.3557,
'prediction/mean': 57.02432,
'global_step': 1000}
#PredictionbyDNNRegressor (muchbetterperformance!)
[{'predictions': array([67.01109], dtype=float32)},
{'predictions': array([82.476265], dtype=float32)},
{'predictions': array([17.470245], dtype=float32)}]
#Actualscores['Air Raid', 'Guardian Augmerchant', 'Holy Light']
[64.56, 64.69, 15.85]

这样我们得到了一个可以在竞技场中绘制牌组时应用的模型。在使用这个模型运行了几次之后,我可以说它在分配分数方面相当准确,我基本上同意这个算法所做的选择。

最后总结

作为一名狂热的竞技场玩家,我一直想要深入挖掘HearthArena算法的内部工作原理,而随着我在Tensorflow中新学到的技能,这成为了现实。我仍然感到惊讶的是,虽然优秀的竞技场玩家在做出节奏、价值和协同效应等选择时会考虑许多因素,但使用Tensorflow构建的深度学习模型并不依赖于你指定它所寻找的趋势。

对于那些希望自己着手这样一个项目的人,我从这次经历中获得了一些更重要的收获:

  1. 使用Tensorflow提供的预估器,模型训练、评估和预测相对容易;困难的部分是处理数据和维度
  2. 在任何类似的项目中,确定你需要什么数据,并且可以合理获得什么数据,无疑是最大的挑战。准备好理解如何使用提供的api
  3. 最重要的是,相信自己,愿意尝试。当我第一次开始这个项目的时候,我很难想象能够达到我的目标,但是我的信念有了飞跃,并且对结果感到惊喜!

最后给出这个项目的代码:https://github.com/Jareltey/Hearthstone-Deckbuilder

目录
相关文章
|
6月前
|
机器学习/深度学习 算法 TensorFlow
文本分类识别Python+卷积神经网络算法+TensorFlow模型训练+Django可视化界面
文本分类识别Python+卷积神经网络算法+TensorFlow模型训练+Django可视化界面
119 0
文本分类识别Python+卷积神经网络算法+TensorFlow模型训练+Django可视化界面
|
机器学习/深度学习 算法 TensorFlow
树叶识别系统python+Django网页界面+TensorFlow+算法模型+数据集+图像识别分类
树叶识别系统python+Django网页界面+TensorFlow+算法模型+数据集+图像识别分类
200 1
|
2月前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
90 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
5月前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
182 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
15天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
56 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
104 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
28天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
50 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
2月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
97 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
3月前
|
机器学习/深度学习 人工智能 算法
【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow
眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练('白内障', '糖尿病性视网膜病变', '青光眼', '正常'),最终得到一个识别精确度较高的模型。然后使用Django框架开发Web网页端可视化操作界面,实现用户上传一张眼疾图片识别其名称。
81 9
【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow
|
3月前
|
测试技术 数据库
探索JSF单元测试秘籍!如何让您的应用更稳固、更高效?揭秘成功背后的测试之道!
【8月更文挑战第31天】在 JavaServer Faces(JSF)应用开发中,确保代码质量和可维护性至关重要。本文详细介绍了如何通过单元测试实现这一目标。首先,阐述了单元测试的重要性及其对应用稳定性的影响;其次,提出了提高 JSF 应用可测试性的设计建议,如避免直接访问外部资源和使用依赖注入;最后,通过一个具体的 `UserBean` 示例,展示了如何利用 JUnit 和 Mockito 框架编写有效的单元测试。通过这些方法,不仅能够确保代码质量,还能提高开发效率和降低维护成本。
49 0
下一篇
无影云桌面