完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
`往期回顾: 【每周一练】labview益智游戏 - 撑竹竿过河 https://bbs.elecfans.com/jishu_514770_1_1.html 【每周一练】LabVIEW益智游戏 - 24点 https://bbs.elecfans.com/jishu_517445_1_1.html *************************************************************************************************** 本期练习: 实现一个2048的程序,http://2048game.com/ 基本要求: ①在4*4的方格内随机生成2和4; ②能够使用键盘方向键控制移动; ③显示当前得分,得分规则请参考http://2048game.com/ ④显示历史最高分,通过读写配置文件记录该数据; ⑤实时显示当前已运行时间; ⑥至少两个按键“新游戏”和“停止”,点击“新游戏”运行时间重新开始计时; 拓展功能: ①数字移动时,能够看到移动的特效; ②AI功能,用LabVIEW写个自动运行的程序,不建议使用动态链接库;能自动运行到512就满足要求了; 本次重点是AI的功能,希望大家多想想办法 参考链接 http://blog.jobbole.com/64597/ ****************************************************************************************** 针对目前火爆的2048游戏,有人实现了一个AI程序,可以以较大概率(高于90%)赢得游戏,并且作者在stackoverflow上简要介绍了AI的算法框架和实现思路。但是这个回答主要集中在启发函数的选取上,对AI用到的核心算法并没有仔细说明。这篇文章将主要分为两个部分,第一部分介绍其中用到的基础算法,即Minimax和Alpha-beta剪枝;第二部分分析作者具体的实现。 基础算法2048本质上可以抽象成信息对称双人对弈模型(玩家向四个方向中的一个移动,然后计算机在某个空格中填入2或4)。这里“信息对称”是指在任一时 刻对弈双方对格局的信息完全一致,移动策略仅依赖对接下来格局的推理。作者使用的核心算法为对弈模型中常用的带Alpha-beta剪枝的 Minimax。这个算法也常被用于如国际象棋等信息对称对弈AI中。 Minimax下面先介绍不带剪枝的Minimax。首先本文将通过一个简单的例子说明Minimax算法的思路和决策方式。 问题现在考虑这样一个游戏:有三个盘子A、B和C,每个盘子分别放有三张纸币。A放的是1、20、50;B放的是5、10、100;C放的是1、5、20。单位均为“元”。有甲、乙两人,两人均对三个盘子和上面放置的纸币有可以任意查看。游戏分三步:
下面用Minimax算法解决这个问题。 基本思路一般解决博弈类问题的自然想法是将格局组织成一棵树,树的每一个节点表示一种格局,而父子关系表示由父格局经过一步可以到达子格局。Minimax 也不例外,它通过对以当前格局为根的格局树搜索来确定下一步的选择。而一切格局树搜索算法的核心都是对每个格局价值的评价。Minimax算法基于以下朴 素思想确定格局价值:
解题下图是上述示例问题的格局树: 注意,由于示例问题格局数非常少,我们可以给出完整的格局树。这种情况下我可以找到Minimax算法的全局最优解。而真实情况中,格局树非常庞大,即使是计算机也不可能给出完整的树,因此我们往往只搜索一定深度,这时只能找到局部最优解。 我们从甲的角度考虑。其中正方形节点表示轮到我方(甲),而三角形表示轮到对方(乙)。经过三轮对弈后(我方-对方-我方),将进入终局。黄色叶结 点表示所有可能的结局。从甲方看,由于最终的收益可以通过纸币的面值评价,我们自然可以用结局中甲方拿到的纸币面值表示终格局的价值。 下面考虑倒数第二层节点,在这些节点上,轮到我方选择,所以我们应该引入可选择的最大价值格局,因此每个节点的价值为其子节点的最大值: 这些轮到我方的节点叫做max节点,max节点的值是其子节点最大值。 倒数第三层轮到对方选择,假设对方会尽力将局势引入让我方价值最小的格局,因此这些节点的价值取决于子节点的最小值。这些轮到对方的节点叫做min节点。 最后,根节点是max节点,因此价值取决于叶子节点的最大值。最终完整赋值的格局树如下: 总结一下Minimax算法的步骤:
对于真实问题中的Minimax,再次强调几点:
Alpha-beta剪枝是对Minimax的补充和改进。采用Alpha-beta剪枝后,我们可不必构造和搜索最大深度D内的所有节点,在构造过程中,如果发现当前格局再往下不能找到更好的解,我们就停止在这个格局及以下的搜索,也就是剪枝。 Alpha-beta基于这样一种朴素的思想:时时刻刻记得当前已经知道的最好选择,如果从当前格局搜索下去,不可能找到比已知最优解更好的解,则停止这个格局分支的搜索(剪枝),回溯到父节点继续搜索。 Alpha-beta算法可以看成变种的Minimax,基本方法是从根节点开始采用深度优先的方式构造格局树,在构造每个节点时,都会读取此节点 的alpha和beta两个值,其中alpha表示搜索到当前节点时已知的最好选择的下界,而beta表示从这个节点往下搜索最坏结局的上界。由于我们假 设对手会将局势引入最坏结局之一,因此当beta小于alpha时,表示从此处开始不论最终结局是哪一个,其上限价值也要低于已知的最优解,也就是说已经 不可能此处向下找到更好的解,所以就会剪枝。 下面同样以上述示例介绍Alpha-beta剪枝算法的工作原理。我们从根节点开始,详述使用Alpha-beta的每一个步骤:
此时搜索全部完毕,而我们也得到了这一步的策略:应该走A分支。 可以看到相比普通Minimax要搜索18个叶子节点相比,这里只搜索了9个。采用Alpha-beta剪枝,可以在相同时间内加大Minimax的搜索深度,因此可以获得更好的效果。并且Alpha-beta的解和普通Minimax的解是一致的。 针对2048游戏的实现下面看一下ov3y同学针对2048实现的AI。程序的github在这里,主要程序都在ai.js中。 建模上面说过Minimax和Alpha-beta都是针对信息对称的轮流对弈问题,这里作者是这样抽象游戏的:
格局评价作为算法的核心,如何评价当前格局的价值是重中之重。在2048中,除了终局外,中间格局并无非常明显的价值评价指标,因此需要用一些启发式的指标来评价格局。那些分数高的“好”格局是容易引向胜利的格局,而分低的“坏”格局是容易引向失败的格局。 作者采用了如下几个启发式指标。 单调性单调性指方块从左到右、从上到下均遵从递增或递减。一般来说,越单调的格局越好。下面是一个具有良好单调格局的例子: 平滑性平滑性是指每个方块与其直接相邻方块数值的差,其中差越小越平滑。例如2旁边是4就比2旁边是128平滑。一般认为越平滑的格局越好。下面是一个具有极端平滑性的例子: 空格数这个很好理解,因为一般来说,空格子越少对玩家越不利。所以我们认为空格越多的格局越好。 孤立空格数这个指标评价空格被分开的程度,空格越分散则格局越差。 具体来说,2048-AI在评价格局时,对这些启发指标采用了加权策略。具体代码如下:
有兴趣的同学可以调整一下权重看看有什么效果。 对对方选择的剪枝在这个程序中,除了采用Alpha-beta剪枝外,在min节点还采用了另一种剪枝,即只考虑对方走出让格局最差的那一步(而实际2048中计算 机的选择是随机的),而不是搜索全部对方可能的走法。这是因为对方所有可能的选择为“空格数×2”,如果全部搜索的话会严重限制搜索深度。 相关剪枝代码如下:
搜索深度在2048-AI的实现中,并没有限制搜索的最大深度,而是限制每次“思考”的时间。这里设定了一个超时时间,默认为100ms,在这个时间内,会从1开始,搜索到所能达到的深度。相关代码:
因此这个算法实现的效果实际上依赖于执行javascript引擎机器的性能。当然可以通过增加超时时间来达到更好的效果,但此时每一步行走速度会相应变慢。 算法的改进目前这个实现作者声称成功合成2048的概率超过90%,但是合成4096甚至8192的概率并不高。作者在github项目的REAMDE中同时给出了一些优化建议,这些建议包括:
****************************************************************************************** 本次练习截止时间为2015年11月16日 00:00:00 提交格式为:2048 - LabVIEW版本 - 论坛ID.zip 提交形式:回复本贴,请将阅读权限设置为版主(请按格式提交,便于页面搜索)。举例: --------------------------------------------------------------------------------------------------------- 【评分标准】 1,功能的实现; 2,程序性能,包括运行效率、可扩展性、移植性等。 3,编程风格、编程架构、软件文档等。 4,界面的美观性【评选规则】 由5位Labview每周一练委员会成员根据参与者提交的作品进行评分得出平均值,得分最高者为周冠军,周冠军即可获得奖品。(奖品两期活动颁发一次) 【奖品】 小米手环、小米路由器、小米充电宝、无线鼠标、电风扇……还有年度神秘大奖等你来拿,快来参与吧! ************************************************************************************************************** |
|
相关推荐
139个回答
|
|
|
|
|
|
2048游戏,设置了多个子VI,便于打开
|
|
|
|
本帖最后由 bamenwhj 于 2015-11-12 22:48 编辑
终于弄完了,不容易啊,先上应用程序,源代码发邮件或最后一天上传(没办法设置权限)。 AI比较弱,基本能到512,也有到不了的时候,偶尔能到2048。 |
|
|
|
LabVIEW2048源代码及程序。
|
|
|
|
由于时间有限,AI等功能没有添加,谅解
|
|
|
|
这个题目也挺有意思的
|
|
|
|
看到一个发布的labview。可以自动运行到16384+4096+2048
|
|
|
|
还没有玩过这个游戏呢
|
|
|
|
玩过几次
|
|
|
|
这次要求不能使用动态连接库,由LabVIEW自身去实现智能算法~~ 另外,版主对公式节点、脚本、(构造器应该也不能用了)等的使用有没有要求? 还有就是算法的性能,每走一步的运行时间有没有要求? |
|
|
|
|
|
|
|
|
|
|
|
用的听好的啊!比较高大上啊!
|
|
|
|
|
|
|
|
谢谢分享。。。。。。。。。
|
|
|
|
bamenwhj 发表于 2015-11-2 19:01 不建议使用动态链接库,推荐使用LabVIEW实现,如果用LabVIEW实现很困难,也是可以用的。 对时间没有要求。 |
|
|
|
谢谢分享!谢谢分享!谢谢分享!谢谢分享!
|
|
|
|
还是好好学习去了,众大神加油~~
|
|
|
|
学习学习,没准将来就又用了
|
|
|
|
谢谢分享!谢谢分享!谢谢分享!谢谢分享!
|
|
|
|
thanks for your sharing.
|
|
|
|
好牛!!!!!
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
用udl里的字符串信息在局域网内其他电脑连接sql数据库为什么为出现连接失败拒绝访问?
1352 浏览 1 评论
为什么同一个队列引用的全局变量,运行在两个子vi中发现队列数据丢失了
1174 浏览 0 评论
1388 浏览 0 评论
关于labview2024版本的lvanlys.dll出错的问题
2401 浏览 2 评论
1334 浏览 2 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 14:49 , Processed in 1.070778 second(s), Total 91, Slave 82 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号