Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【参赛经验分享】鹅罗斯方块内部赛道Rank5——硬搜

【参赛经验分享】鹅罗斯方块内部赛道Rank5——硬搜

原创
作者头像
用户5556120
修改于 2021-08-20 03:27:05
修改于 2021-08-20 03:27:05
7960
举报
文章被收录于专栏:BotBot

前言

  • 首先简要概括一下题目,是一个序列完全固定为10000个的俄罗斯方块游戏,需要给出一个操作序列来最大化得分,得分的多少与单次消除的行数和场上已有方块数有关
  • 主要使用到的算法有:
    1. 贪心
    2. 单步dfs搜索
    3. 蒙特卡罗搜索
    • 除了搜索我还能会点啥嘛,就硬搜
  • 先上代码仓库:https://github.com/Suikasxt/tetris
    • 内容主要在以下两个文件中:
      • GameController.cpp:游戏主体逻辑
      • tetris.cpp:策略算法
    • 因为代码本来也不是奔着分享写出来的,就不要指望有多好看。

贪心

  • 这里其实就是要做一个局面的估价函数,然后枚举当前可以进行的所有操作,选取一个使得局面估价最高的操作即可,先写这个算法主要是先调整一下这个估价函数,这是后面所有算法的基石。
  • 由于以前参加过botzone上的tetris比赛,当时写的估价函数是完全可以作为参考的(当然由于游戏环境和计分方式变了需要做一些调整),主要包含以下几个方面:
    • 各列的最大高度、平均高度
    • 相邻格子占领与否状态的异或值之和(即空白区域和方块区域尽量分开)
    • 被完全挡住的空洞数量、长条形空洞的数量(防止程序陷入长条形空洞过多一直等待I型导致暴毙的情况)
  • 使用了这么一个贪心,在再配合枚举(其实就是只有一层的搜索),已经可以有一定的智能表现,大约能够坚持100左右个方块。

搜索

  • 在上述贪心的基础上,多搜索几步,就能得到十分优秀的算法。
  • 具体来说,每一步的可行操作数量是很多的,可以只挑选其中估价最高的三个操作进行扩展,搜索10层左右,计算量是10000*3^10,前面乘上一个10000是因为我们每一步操作都是模拟之后10步,得到操作之后这次搜索得到的信息全部舍弃掉,在新的局面进一步搜索10步。这种操作实际上在本问题中很浪费,因为我们整个过程是单人且完全确定的,没有对手或者其他因素带来的随机性,不过直到最后我也没有优化掉这一点。
  • 此时我们的算法已经能够安稳跑完10000个方块,为了得到更高的分数还要记得在估价函数中加入当前方块的数量,让算法有意识地屯方块。
  • 最初使用这个方法搜索层数不深,能够达到70w左右的分数,后来使用MCTS不顺利,又转回搜索,改进到搜索11层,得分117w,但事实上搜索13层能得到122w左右,只是需要的时间比较长大约12小时,就没能在比赛结束前跑完。

蒙特卡洛搜索

  • 我理解中MCTS的主要思路是,在搜索过程中每一步都分叉出3个左右状态,导致搜索并不能够很深,于是我们不做这个固定的分叉,而是每次搜索都一路走到底,但是多搜索几次,同时在策略中引入随机性,期望这个随机性能够替我们实现分叉的采样效果。这种做法因为能够做到较深的搜索层数,且一定程度上兼顾了策略的选择,往往能够得到较好的效果。
  • 在我以往的游戏AI编写经验中,MCTS是能够比普通搜索带来很大提升的,但这次似乎不同,刚刚使用MCTS时,能够得到111w的得分,看起来比最初的逐步搜索70w要好很多,但只能说70w并不是逐步搜索的上限。后来尝试使用双层的MCTS也没有得到改进。

整体分数变化:

  1. 贪心:不能跑完10000个方块。
  2. 搜索:
    • 不屯方块:38w
    • 屯方块:68w
  3. 蒙特卡洛:
    • 贪心作为单步策略:79w
    • 3层搜索作为单步策略:最终卷到111w
  4. 回去调搜索
    • 11层:117w,跑2小时左右
    • 12层(结束前4小时跑出来但是暴毙了没拿到操作序列):119w,跑5小时左右
    • 13层(跑不完):预计122w,跑12小时左右

一些trick

  1. 多线程:本来我的搜索13层是要跑一天多的,比赛结束前一天我就挂着跑,结束当天意识到跑不完了,才开始着手写多线程,但是为时已晚。以前没有c++上用过多线程,所以才一直没敢动手,写了才发现原来很简单嘛
  2. 状态压缩:20行10列,一共200个bit的信息,其实可以压缩为10个int,每列一个,方便操作,不过因为觉得提升不会非常大(而且懒)就没写这个改进。

一点收获

  • 赛后看dalao们的笔记还是很有收获的,见识到了集束搜索(解决我上面关于信息浪费的问题),见识到了动态规划的奇技淫巧,见识到jemalloc等优化技巧。
  • 感谢主办方,让我跟dalao们有一次交流的机会,感谢让我这个鹅厂小白秀一秀coding,还有梦寐以求的机械键盘

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQLi_Labs通关文档【1-65关】
为了不干扰自己本机环境,sql-lab我就用的docker跑起来的,搭建也非常简单,也就两条命令
HACK学习
2019/08/05
4K1
SQL注入ByPass的一些小技巧
01 — 前言 SQL注入从古至今都是一个经久不衰的影响严重的高危漏洞,但是网络安全发展到现在,如果想通过SQL注入直接获取数据或者权限,多多少少都需要绕过一些网站前面的WAF,无论是基于规则的还是带
xfkxfk
2018/03/29
2K0
SQL注入ByPass的一些小技巧
我的wafBypass之道
去年到现在就一直有人希望我出一篇关于waf绕过的文章,我觉得这种老生常谈的话题也没什么可写的。
用户1467662
2019/04/19
3K0
我的wafBypass之道
老司机带你过常规WAF
0x00 前言 最近看了不少关于WAF绕过的文章,想把理论深化到实践当中去,于是就有了您正在看的这篇文章,这篇文章分为两大部分,分别写的是SQL注入相关的WAF绕过和一句话木马免杀相关的WAF绕过,本文用来做测试的WAF是安全狗(4.0最新版),在一句话木马免杀的章节也会提到一些绕过D盾的技巧。 0x01 绕过安全狗继续SQL注入 其实说白了,绕过WAF就是混淆你的SQL语句,让它以另一种方式呈现出来,以绕过WAF的黑名单正则表达式匹配,至于具体的混淆方法,网络上有很多的文章已经讲的够详细了,在这里我就直接
ChaMd5安全团队
2018/03/29
1.5K1
老司机带你过常规WAF
sqli-labs通关笔记(1-30)
sqli-labs是一款练习sql注入的著名靶场。而造成SQL注入的原因是服务器端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为 称为SQL注入。通过本文将sqli-la
逍遥子大表哥
2022/04/15
2.2K0
sqli-labs通关笔记(1-30)
【面试】记一次安恒面试及总结
产生sql注入的根本原因在于代码中没有对用户输入项进行验证和处理便直接拼接到查询语句中。利用sql注入漏洞,攻击者可以在应用的查询语句中插入自己的SQL代码并传递给后台SQL服务器时加以解析并执行。
没事就要多学习
2024/07/18
1680
【面试】记一次安恒面试及总结
SQL注入的常规思路及奇葩技巧
最近在看《SQL注入攻击与防御》这本书,看了之后感觉自己之前的视野和格局还是太小了些。SQLi的应用特别广泛,多种web数据库不说,移动安卓端也存在通用的SQLi。而从语言的角度来看~PHP/JAVA/PYTHON/C#等等~都可以与SQLi联系起来,由语言特性而衍生的SQLi种类。最近还听说Javascript也能写后端了,着实把我高兴坏了,看来PHP这“世界上最好的语言”的称号,要换主了~ 同是弱类型语言,这俩哥们怕是要一绝“高低”。
信安之路
2018/08/08
1.6K0
SQL注入的常规思路及奇葩技巧
SQL注入攻击与防御
在动态网站中,往往需要用户传递参数到服务器,这些参数往往需要和数据库进行交互;当服务端没有对参数进行安全过滤时,攻击者在参数中加入恶意的SQL语句结构,便编造成了SQL注入漏洞.
婷婷的橙子
2020/11/02
7.9K0
SQL注入攻击与防御
Sqli-labs 通关笔记
常用报错函数:updatexml(), extractvalue(), floor() 十种MySQL报错注入 【SQL注入】报错注入姿势总结
wywwzjj
2023/05/09
5140
MySQL手工注入学习-1
页面提示:Please input the ID as parameter with numeric value
Mirror王宇阳
2020/11/12
1.3K0
SQL注入原理及代码分析(一)
我们都知道,学安全,懂SQL注入是重中之重,因为即使是现在SQL注入漏洞依然存在,只是相对于之前现在挖SQL注入变的困难了。而且知识点比较多,所以在这里总结一下。通过构造有缺陷的代码,来理解常见的几种SQL注入。本文只是讲解几种注入原理,没有详细的利用过程。 如果想要了解Access的详细手工注入过程,可以看我的这篇文章https://www.cnblogs.com/lxfweb/p/12643011.html 如果想要了解MySQL的详细手工注入过程,可以看我的这篇文章https://www.cnblogs.com/lxfweb/p/12655316.html 如果想要了解SQL server的详细手工注入过程,可以看我的这篇文章https://www.cnblogs.com/lxfweb/p/12675023.html
雪痕@
2020/09/27
9500
SQL注入原理及代码分析(一)
SQL注入(入门)
收到请求的后端PHP代码会将GET方式传入的id=1与前面的SQL查询语句进行拼接,最后传给执行MySQL的查询语句如下:
Andromeda
2022/10/27
2K0
SQL注入(入门)
Pikachu漏洞靶场系列之SQL
在Owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。一个严重的SQL注入漏洞,可能会直接导致一家公司破产!SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
Naraku
2021/07/29
1.2K0
Pikachu漏洞靶场系列之SQL
WAF的介绍与WAF绕过原理
WAF 是什么?全称 Web Application Firewall (WEB 应用防护系统),与传统的 Firewall (防火墙) 不同,WAF 针对的是应用层。
天钧
2019/11/11
5.8K0
WAF的介绍与WAF绕过原理
科普基础 | 这可能是最全的SQL注入总结,不来看看吗
2.ACCESS没有库名,只有表和字段,并且注入时,后面必须跟表名,ACCESS没有注释
HACK学习
2019/11/14
4.6K0
MySQL注入--Payload
floor和group by配合使用group by的key唯一性和编码顺序导致二次执行产生不同大的key
Mirror王宇阳
2020/11/12
2.5K0
MySQL注入--Payload
全网最全sqli-labs通关攻略(建议收藏)
Sqli-labs是一个帮你总结大部分SQL注入漏洞类型的靶场,学习SQL注入漏洞原理,复现SQL注入漏洞必备靶场环境,玩起来吧!SQLi-LABS项目地址:https://github.com/Audi-1/sqli-labs,经过美化的项目地址:https://github.com/himadriganguly/sqlilabs,可以使用phpstudy或者web环境直接搭建运行,具体搭建步骤可以参考另一篇文章SQL注入靶场之sqlilabs搭建指南
网络安全自修室
2021/11/25
24.4K0
全网最全sqli-labs通关攻略(建议收藏)
深入理解SQL注入绕过WAF和过滤机制
深入理解SQL注入绕过WAF和过滤机制 知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 本文小结 0x6 参考资料 0x0 前言 促使本文产生最初的动机是前些天在做测试时一些攻击向量被WAF挡掉了,而且遇到异常输入直接发生重定向。之前对WAF并不太了解,因此趁此机会科普一下并查阅了一些绕过WAF的方法。网上关于绕过WAF有诸多文章,但是观察之后会发现大体上绕
tnt阿信
2020/08/05
3.2K0
深入理解SQL注入绕过WAF和过滤机制
SQL注入头脑风暴
union语句是一下可以查询两条语句的用法,需要注意的是前一句查询语句与后一句查询语句中查询的数量需要保持一直,否则会报错。
Tommonkey
2023/03/20
6690
SQL注入头脑风暴
MySQL手注之报错注入详解
往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了。这篇文章会讲解一下报错注入的产生原理和利用案例。
渗透攻击红队
2020/05/19
9.6K1
相关推荐
SQLi_Labs通关文档【1-65关】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档