经数班之编程集训
发布时间:2021-08-04作者:经济学院;编辑:王藜颖
为了跟踪经济学前沿发展,特别是适应数字经济时代对经济学人才计算机能力不断提高的要求,经数实验班项目从2019级开始,要求同学们参加信息学院举办的暑期编程训练营。听听大家怎么说?
(一)2019级编程集训
https://mp.weixin.qq.com/s/8VbB_q7XBiPdn_20lk5sgA
2019级经数班 | 和代码相伴的八个日夜
(二)2020级编程集训
2020级的综合设计编程集训共分为三个大作业,下面分别是完成三项大作业同学的感想:
1. 数独(魏羿辉同学)
规则:使用深度优先搜索和广度优先搜索分别求解数独问题。题目由9*9的二维数组给出,0代表初始时没有数字,1-9代表初始时已知的数字。要求输出具体的解及解的个数,最大搜索深度(深度优先搜索),产生的节点数等等。(补充:不可用递归方式实现)
心路历程:本次大作业实际上是对集训前三天课上所讲内容的落实,主要包括盲搜算法与以栈和队列为代表的数据结构。
大作业发布的当晚,我从递归入手来解决数独。得益于开工之前的模型定义(即在写代码前先将初始状态、动作、目标测试等等列举出来),我的进展很顺利,基本上实现所有功能。然而,考虑到效率以及知识落实等问题,老师转天补充了不可用递归方式实现的要求。在被补充要求精准打击后,我反复研究了PPT与课堂例题,又用了一晚上将递归的逻辑艰难地转化成栈的逻辑。经历了这一整个过程,我发现听懂课堂内容和用代码将其实现之间,仍有着很长的距离,而这也就是编程集训的意义所在。值得一提的是,老师与助教对代码可读性和规范性的要求也使我显著提升了自己代码的颜值。两天来,我在解决数独问题的过程中着实收获了很多。
2. 五子棋(陈奕瑾)
集训八天里五子棋算是非常有意思的一个项目了,因为王老师单独抽出了一个下午来在班里举行AI五子棋大赛,别的班都没有,所以仍然清晰地可以记得那天下午我们班里的热闹和大家的欢乐。
说回AI五子棋,王老师主要给我们介绍的是minimax以及alpha-beta剪枝算法来处理ai模拟与人博弈下棋的过程,所以大部分同学用的也是这个算法。什么意思呢?minimax算法就是计算机会假设你是一个绝对理智的人,会找的到当前评估体系下最不利于对手(或者说最有利于自己的,这二者往往相同)的点去落子,而ai下棋的时候则也会选择对自己最有利的点去落子,所以便可以往下不断的博弈递归,进而推出当前的最佳落子,和人类棋手里面棋力很强的那些人总会去想我下完这里,对方会下哪里,对方下完我又下哪里,我又下完对方又又下哪里.......类似于这样。所以有了这个算法基础后呢就引出另外两个问题,第一个是我如何去知道这一步落子在这个位置对当前的局面来说是好是坏,第二个问题是,如果按这样去算,搜索空间会极大无比,比如这次的棋盘大小是19*19,那么如果你去全局来搜索所有可能,只要搜到第四层,你需要搜索到的点就有16983563041这么多个,所以需要剪枝。于是便引出了评价机制的设计和alpha-beta剪枝。评价机制的设计呢需要一定的下棋经验比如活4死3之类的这种棋型,大家便去各显神通来设计评价机制,当然这个东西有点玄,比如黎睿同学口口声声称自己是个臭棋篓子(bushi),结果设计的玩意最后拿了第二名hh。然后还有就是alpha-beta剪枝,α-β剪枝算法中每一个节点对应有一个α和一个β,α表示目前该节点的最好下界,β表示目前该节点的最好上界。在最开始时,α为负无穷,β为正无穷。然后进行搜索,max层节点每搜索它的一个子节点,就要更新自己的α(下界),而min层节点每搜索它的一个子节点,就要更新自己的β(上界)。如果更新之后发现α>=β了,说明后面的子节点已经不需要进行搜索了,直接break剪枝掉。这就是α-β剪枝算法的含义。
算法部分介绍就到这里啦,我自己的感受就是当时真的是又累又兴奋,熬了两天的夜来处理评价机制的设计还有minimax的实现,结果发现加了minimax后的“人工智障”还没有没加的强,可能是机制设计的还不够完善吧。记得当时那天晚上第一次成功地跑出来后和自己的机器下,然后自己连输两把时,那种兴奋,第一次输棋输的这么开心,虽然也是因为自己也是一个臭棋篓子。总之就是很好玩。
附上当时比赛现场非常有趣的一幕(我和晨影同学把棋盘下满了hhh)
3. 贪吃蛇(胡巧巧)
介绍:蛇王争霸赛是每年综合设计编程集训的压轴节目,每一位参与集训的同学都需要综合运用编程知识为自己的AI贪吃蛇设计控制其运动路径的代码。每一场比赛均为多蛇同台竞技,每一条AI蛇都需要避免撞墙,并防止与其他蛇或障碍触碰,同时获取盾牌和吃到更多的食物以尽可能达到更高的分数。比赛按照小组赛、半决赛、总决赛三个流程进行:小组赛由同一集训班级的同学同时参与,前三名进入半决赛,半决赛的前六名进入总决赛并决出特等奖与一二三等奖。另外今年还特别设置了挑战赛,即让未进入决赛的同学自主报名与前六名同台比拼。
心路历程:我设计贪吃蛇代码的前期工作主要是考虑扫描方式以及赋值方法,在这一部分我将赋分操作分两种情况进行——最大曼哈顿距离内大面积赋分以及临近区域判断小面积赋分。前期工作仅仅是对自保和获取盾牌、寻找食物等基本功能的实现,后期的战略决策以及代码优化是最为重要的部分。实际上,当基础代码完成后,贪吃蛇的比拼就更多地是一场策略的博弈了。我经过多次修改代码和平台测试以后,提高了护盾和增长豆在搜寻食物过程中的权重,根据比赛剩余时间和蛇头周围环境强化护盾使用的条件,并在放置障碍的成本提高以后采取保守型策略,提高了放置障碍的标准。在设计贪吃蛇代码的整个过程中,我体会到了专心钻研算法和研究策略而非被ddl驱使和压迫的乐趣与成就感,总体来说是非常有收获的。