[python]基于蒙特卡罗树搜索的Pokemon对战AI开发之路(0)——项目整体思路与技术思考

在逛北海道大学的大学院官网时,在某个研究室的网站下偶然看到了这个项目,觉得很有意思。
蒙特卡罗树搜索作为阿尔法狗使用到的经典算法之一,对于Pokemon这种对战类游戏也应该适用,所以我萌生了自己尝试去做做这个项目的想法。虽然自己基本都不懂,但凭着自学过一点python,相信总会有头绪,但要做得很好估计难度比较大。

——————————————————————————————————————
关于Pokemon
pokemon作为我童年的回忆,如果能做出来一个能用的模型,即便稍稍比不会玩的人类打得好一点点,我也会非常开心的。

在这里插入图片描述
首先先分析一下Pokemon这款游戏。我所说的AI,最主要的是我们常见的精灵对战的AI。也就是回合制,派出一只或者两只pokemon进行对战,轮流使用pokemon独有的技能直到己方或者对方所有精灵都不能战斗为止。
在这里插入图片描述

国内我们玩的金银、火红、红宝石、钻石珍珠、心金魂银这些往往都是下的盗版资源,所以真人对战的机会少之又少,顶多就是和四天王对战的时候有点难度。
但在2018年我接触了一个盗版平台pokemmo之后,它满足了我大部分对精灵世界的幻想。
里面的对战排位其实想赢除了pokemon队伍配合性要好,还需要玩家的对战经验和熟练度,也就是说即便同样的队伍会打排位的人的确更容易获胜——这是并不是一种随机性的赌博游戏。

如果我们能够通过机器学习之类的方法将未来对方可能的招式或行动预测到,我们再用回报率最高的技能回应,获胜的几率就能大大升高。
蒙特卡洛树搜索,是树搜索算法的一类。和围棋不同,pokemon可能性相对较有限,我们可以由对方的Pokemon以及出的招式等已知信息对搜索树进行范围的修剪,从而大大减少计算的复杂度。

由于本人最喜欢心金魂银系列,所以打算以这个版本进行开发,难度会降低一点。不过考虑到未来升级的可能性,对于数据我还是尽量要弄到最新。
现在已经出到3ds了,什么妖精属性,什么Z招式还不是很熟悉,所以先放一放。

通过分析,我认为对于Pokemon对战能影响结果的主要有以下几个方面
pokemon的属性、Pokemon的战斗数值、Pokemon的招式、pokemon 的特性、Pokemon的携带物。

属性相克有以下规则:
在这里插入图片描述
在这里插入图片描述
当然,这里更多的是靠技能的属性进行克制 以及 尽量不被对方技能克制才是获胜的法宝。我们需要的就是尽可能不被对方属性克制,并且己方有技能能够压制对方,那么优势就会出现。当然,这也并不是绝对的,因为有些技能具有出奇意料的效果,这还需要后续研究。

就本人的游戏经验而言,Pokemon的特性和携带物也能起到一定的辅助作用,但是决定性的还是属性相克。如何平衡它们的作用将是比较重要的课题。

许多相同的pokemon通过前人总结往往会携带相同的道具。比如对战的美纳斯由于拥有神奇鳞片(异常状态防御1.5倍)的特性可能性比较多,所以携带火焰宝珠(第一回合后能产生烧伤异常)的几率会更大。所以在没有真正弄清楚之前,很多时候我们人可以大致猜到(它的特性或者会携带什么道具),但如何让机器也能提前猜到我认为将会是提高算法性能的思路。

——————————————————————————————————————
关于蒙特卡罗

关于蒙特卡罗树搜索知乎上有个例子说是:假如筐里有100个苹果,让我每次闭眼拿1个,挑出最大的。于是我随机拿1个,再随机拿1个跟它比,留下大的,再随机拿1个……我每拿一次,留下的苹果都至少不比上次的小。拿的次数越多,挑出的苹果就越大,但我除非拿100次,否则无法肯定挑出了最大的。这个挑苹果的算法,就属于蒙特卡罗算法——尽量找好的,但不保证是最好的。

在搜索树运行等过程当中,每个节点都要计算一个‘最优’的策略,但是这个‘最优’的策略只是当前回合的最优,也有可能在全局不是最优,因此知道走到最后之前并且回溯结果之前,是不能判断当前策略的优劣性的。当当前分支线走到尽头时,将会使用UCB公式进行计算从而得出当前分支的价值。

可以通过五子棋的案例来理解UCB:https://www.jianshu.com/p/b2c7138e2988
下面我根据这个博客进行本项目的理解。
在这里插入图片描述
咱们首先看一下上面这张图,以我们的Pokemon对战为例的话,图中每一个节点代表某种对战的情况,圈里的斜杠左边的数字代表电脑在该节点下胜利的次数,斜杠右边的数字代表该节点被访问的次数。如12/21表示该节点下胜利了12次,总共访问过21次。
按照流程图,该蒙特卡罗树搜索有4个步骤:

1.选择(Selection):从根节点走起,由于第二行已经没有可拓展的节点(如有则需要把当前可拓展的点穷尽完,这里就画了两层方便理解),所以根据UCT(上限置信区间算法)如下图,
在这里插入图片描述
其中x是当前结点的胜率估计,N是节点的访问次数,C是一个常数。C大就偏向于BFS,C小就偏向于DFS。此外,由于是子节点的访问次数作分母,所以当该子节点的访问次数较小时,反而会得到更大的score(即访问次数少的更值得探索)
逐步代入公式,得出:
7/10的score为0.7+0.55C
5/8的score为0.625+0.62C
0/3的score为0+1.00C
以此类推,最终选择了第4行的3/3节点,由于该节点已经没有了子节点,但同时五子棋游戏还没结束(即不是终止节点),所以进入步骤2。

2.拓展(Expansion):在Selection步骤中我们已经选择了3/3节点,现在要做的就是在3/3节点下再生成一个子节点,暂且命名为0/0,代表着一个新的,没有试过的操作,或者说一个对战局面。

3.模拟(Simulation):在这步,我们需要判定这个节点是好的还是坏的,可是由于此时还没到终局,所以我们需要一种快速判定的方法,即我们玩家自己随机使出pokemon四个招式中的一个,通过随机使出招式一致到双方有一只pokemon死亡为止(终局)。

4.回溯(Backpropagation):在这步,由于有新的节点信息加入进来,所以需要更新我们现有的博弈树。这里我们假设上步的结果是输,所以0/0更新为0/1,并在该节点的基础上,一步一步向上更新其他节点。

俗话说万事开头难,为了简化,我觉得最开始应该着重几个常见的对战Pokemon的信息进行整理和理解,毕竟很多技能和特性的表述并没有量化(比如攻击大幅下降,到底是下降多少呢?/又比如有一定几率眩晕,那么这个几率又是怎么算的呢?)。
但在做这些之前,我首先需要弄到所有Pokemon的相克属性、最大(最小)战斗数值、可能习得的招式、可能的特性、可能的携带物等等信息。
(或许在最终的结果当中,我们可以稍微更改下算法知道哪只pokemon相对而言最强最适合对战)

我初步的项目思路如下:
1.编写爬虫爬取口袋百科官网的数据(即上述我需要的数据)
2.完善精确对于各个招式、特性的效果等,如果可能的话,寻找规则去量化它们
3.存储这些数据到数据库方便管理
4.建立蒙特卡洛搜索树模型,先进行一对一对战机制的构建(如果可能的话,引入深度学习算法)。之所以先只构建一对一是因为我对于蒙特卡罗还不是很熟悉,所以想先试试水。
5.在一对一对战的基础上拓展到多对多对战(这就需要引入更多的分支了,因为对手可能会更换Pokemon,而我们不知道他将会拿出什么样的pokemon,所以这一步会让整个系统变得非常复杂,但多对多机制是必不可少的,所以在通过一对一了解算法后就要着手添加双方可能中途更换Pokemon的分支构建机制)
6*.引入新的属性和新的技能,可能的话,引入mega进化玩法和Z招式
7.对算法进行优化,尽量减少计算的时间以及尽量提高分支价值计算的准确性

如果有不对的地方请一定要提出来,谢谢
下一篇,我要讲我是如何获取要用到的Pokemon的相关数据的。
我使用python的spyder进行爬取,应该不会犯法吧。

基于高德地图的Pokémon Go开发可提供更丰富和实际的游戏体验。Pokémon Go是一款增强现实游戏,结合了现实世界和虚拟世界。高德地图提供了强大的地理信息服务,可以作为Pokémon Go的核心组件,从而提升其游戏体验。 首先,基于高德地图的Pokémon Go可以更精确地定位和展示游戏中的Pokémon。通过高德地图的定位功能,玩家可以在现实世界中准确找到Pokémon出现的位置。高德地图提供了详细的地图数据,包括建筑物、街道和地点名称等,可以准确地标记Pokémon出现的位置,使得玩家可以更容易地捕捉它们。 其次,高德地图的导航功能可以帮助玩家更方便地探索Pokémon世界。在游戏中,玩家需要移动到各个地点来寻找不同的Pokémon。利用高德地图的导航功能,游戏可以为玩家提供最佳的路径规划,指引他们到达目的地。这不仅使得探索过程更加便捷,也增加了游戏的互动性和乐趣。 此外,高德地图还可以与Pokémon Go的社交功能相结合,促进玩家之间的互动和交流。通过高德地图的位置共享功能,玩家可以方便地分享他们捕捉到的Pokémon或者发现的特殊地点,与其他玩家分享游戏经验。这不仅增加了社区感,也可以促进玩家之间的合作和竞争,提高了游戏的可玩性。 基于高德地图的Pokémon Go开发,可以提供更真实、便捷和互动的游戏体验。高德地图的地理信息服务将能够为玩家提供准确的位置信息和导航功能,使得玩家更容易找到并捕捉到Pokémon。同时,社交功能的加入也将增加玩家之间的互动和乐趣。综上所述,基于高德地图的Pokémon Go开发将极大地提升这款游戏的品质和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值