2048脚本控制器

本文介绍了2048游戏的AI控制器设计,包括使用MinMax和ExpectiMax算法评估棋局,以及C++和Python中多线程和多进程的应用。文章探讨了如何通过权重调整和评估函数来优化棋局状态,并讲解了如何在C/C++中调用Python代码。
摘要由CSDN通过智能技术生成

2048控制器

1.evaluate

要用程序来处理就得对现实的问题进行量化,用数字来表示。在2048游戏中,我们的输入是一个棋局,让我们输出一个移动方向,这样我们需要对棋局进行量化,即我们要评估棋局的好坏,用一个score来表示,score越大棋局越好,score越小棋局就越差。

玩过2048后就会知道,一个好的棋局会与这几个方面有关系:

1、数据块的单调性 :monotonous

2、空格数:emptys

3、可合并数 :merges

 

通过计数单调性monotonous、统计空格数empty和可合并的个数merges我们就能得到我们的评估函数:

score = monotonous*w1 + emtpys * w2 + merges * w3

其中w1、w2、w3是各个要素对评估函数的影响的权重。这个需要手动去调整,也也可以通过演进算法CMA-ES去搜索最优值。

 

2、MinMax算法

有了合理的评估方式我们就可以将当前棋局以四个方向进行移动(up,down,left,right),对移动后的棋局进行评估,得到4个score_left、score_right、score_up、score_down,此时我们会取4个score的最大值score_max = max(score_left,score_right,score_up,score_down)对应的移动方向作为当前棋局的移动方向,但是这样的移动是最优的吗?显然对应当前棋局来说是最优的,但是考虑到未来的可能棋局就不一定是最优的了,因为我们移动后电脑会随机加入一个2或4的块(概率为别为0.9和0.1),电脑的这个操作(棋手对弈也一样)会改变棋局,影响后续的移动。所以,如果只对移动一次后的棋局进行评估就决定移动方向只能得到当前最好的棋局,但是后续的棋局好不好就不能保证了,说不定电脑在某个特殊点放置一个块,后面就game over了。为了到达最高分,我们即要保证当前的移动不坏,同时也要考虑后续的情况,这样才能不断的保持一个好的棋局,使自己不断移动下去,取得最高分,(移动的次数越多分就越高),考虑长远收益

 举例说明当前最优,但长远来看不是最优:

 

上图中,在原棋局的基础上进行4个方向的移动,分别得到4个移动后的棋局,用我们上面的的evaluate方法对移动后的棋局进行评分,我们很容易就能知道up移动后的棋局得分会最高。

如果我们选择up,那么电脑(对手)会随机的放置一个2的块(0.9的概率)或者一个4的块(0.1的概率)会得到如下的棋局

 

 其中出现虚线框中两种棋局的概率是1/5,当出现这个棋局,我们只有一种移动棋局选择,就是down,down以后的棋局单调性就很差了(空格认为是0),可能就是因为我们这一步down就导致后面很快输掉棋局。然而真正导致这种结果的源头却在前几部的移动上,如果起名前一步选择left就完全可避开这种导致满盘皆输的错误移动。这个例子就说明了,当前一步的最好选择可能会导致未来移动的挫折,所以每移动异步需要考虑未来可能出现的棋局,通过大局观的考虑来决定当前怎么移动。

 

在上面这种考虑未来的情况思想下(求期望),有两种博弈算法相对应,一种是MinMax一种是ExpectiMax

MinMax算法在预测未来棋局的时候,对手下棋后得到的总是一个Min棋局(最坏棋局,对手最优棋局),自己下棋后得到一个Max棋局(自己的最优棋局)

如下图所示,对手和我每次下棋只有两种选择,到底当前选择1下法还是选择2下法呢,当然你会说那种下法的赢的概率大就选那个。如何知道那种赢的概率大呢,当然是棋局越来越好赢的概率就大。

假设选择1下法得到b棋局,同时遍历对手可能的选择得到d和c棋局,更进一步遍历我在d和e棋局下的下法得到i、j、k、l棋局。同样的对2下法也进行同样的操作会得到m、n、o、p

对这8个棋局进行评估分数,假设分值如下

 

上面从b到4个棋局和从c到4个棋局是遍历的过程,还不知道b移两步后4个棋局的概率分布,这个时候需要从b树和c树的叶子节点进行逆向反推,反推的依据就是棋手(我和对手)选择棋局的分布

我的分布:选未来好棋局              选未来差棋局

概率                  1                                   0

对手分布:选未来好棋局         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值