Day0
当我在玩三角洲蜂医时,发出一阵阵烟雾的时候,我不会想到,这些烟雾在未来的竞赛中折磨了我好久。
Day1
下午18点,开开心心地打开了今年的竞赛题。读完题目后,小小评价下,A题真大雾,B题我不怎么会光学,C题一如既往的统计分析。组队的逸贤同学说我们就在A、B中选一个吧(为什么不做C呢?因为怕做的人太多)。由于图书馆讨论间没有约到,开开心心去和饭搭子一起激情讨论疯狂疯狂星期四,原味鸡两块19.9。研究一下,还是准备搞一下A题(B题看着光学不太好下手)。
首先考虑如何判断导弹是否可以看到真目标。我提出可以通过延长圆柱求与导弹被烟球挡住的圆锥空间求解的和来判断,计算过于复杂,遂放弃。逸贤提出可以俯视做切线来判断,并且我补充了侧视部分的判断,但是这些判断还是太复杂了。最后,我们选择在圆柱的表面上取大量的点,判断是否能看见来大概地判断。我将我之前写的python项目文件结构抄了过来,于是就有了将所有输出导到log文件的功能特性。开始为题目中的每个对象建立类(怎么开始面向对象了),并导入参数,写了两种时间变化方式(一个是更新在自身,一个是更新到新的Object中)。之后开始写Checker.py,用于保存所有的check函数。写了一个简单的test.py测试一下在简单情况下程序能不能给出正确的答案。最后开始写飞行器,当时以为飞行器是只能投一个烟雾弹,所以想判断的烟雾弹是否能在时间飞到,委托给了annaeina就去跑了会儿步。结果回来突然想到,不止能扔一个,于是骂骂咧咧撤回了委托,给飞行器单独写了不同飞法的计算函数。
结束所有类的写作后,开始写Problem1.py 采用了模拟退火。没有约束,让方向数值直接起飞。后来是找到了一个值,左右二分找左边界和右边界,结果,什么一写二分必定炸的诅咒,开始debug。简单输出一下查找到的合理的值,都是有的。做到这里已经是Day2的早上4:30了,于是洗洗睡了。
Day2
中午饭吃完,开始debug,发现Problem1.py的missile1为全局,被多次更新,遂找到错误。算出时间约为4.14s,与网上的大多数答案不符。在之后加强了Checker.py中对于导弹在烟雾弹中和真目标在烟雾弹中的判断。并且做出了0.05s左右的有趣结果。突然和逸贤聊天发现第一题是确定方向的,而我写了模拟退火寻找最佳方向求最优解,笑死了。小改一手后时间还是不对。逸贤设置了一个宽条件发现结果比较接近网络答案,遂开始找判断的bug。注意到AI生成的AM式子写错了,AI害人不浅啊,那太有乐子了,改正后时间恢复正常。
下午打了几把三角洲,把第三题暂时交给了annaeina,准备开始肝第四题。
第四题采用了群体算法,将所有的参数放到一个12维的空间中集体求解,先是尝试了严格让每个初始点都满足有覆盖,结果发现结果过于严苛,初始化就要跑十几分钟,于是想着用10%的满足覆盖的点带动其他散点求解。运行时发现速度实在是有点慢了,于是单开文件写了一个分发包来实现并发的版本,很好CPU都跑满了,但大概还是要跑半个多小时,答案甚至不如Problem2得出的答案(直觉告诉我 Problem4的答案严格大于Problem2), 观察log日志后发现的遮盖时间似乎是分开独立(可能有交叉,但很小)的,便思考采用基因变换的方式让不同飞机的最佳参数互相迁移。(思考),那是不是可以将每个飞机都单独求解,最后累加。于是便有了最后的方法,将Problem2的代码进行细微修改后根据三个飞机不同的参数得到了最后的结果,观察得知覆盖的时间相互独立,总时间大概是12.1s,下班收工~~
Day3
由于第四题出色的表现,让我十分怀疑Python的速度,于是准备转向C写线程池,但是系统中似乎缺少了C运行的一些动态库,于是准备使用Rust。将项目一点点移植到Rust中(我们为了打数模用的语言可真多,语言带师了属于是),但是Rust的熟练度不够,debug时间太长,觉得不如使用Python。最后又使用Python来尝试解决。思考了一下,程序的初始化时间太长了,于是就想着先生成一些点,然后直接拿来用,有的用其中的一个部分。于是写了gene.py,尝试多线程,但是感觉不如使用程序多开,于是复制了几份一起跑,写了一个一起启动的bat脚本。跑了一个晚上,顺便开始写第四题的优化和第五题。
Day4
中午醒来,发现第五题的种子还没跑完,就准备拿着接下来的种子开始跑接下来的程序了。同时,逸贤拿着mathlab算出来答案23左右,而我的程序只有13~14秒的好成绩(抑郁了)。但是,自己也没有什么特别的想法,离结束还有10小时,于是开始整理之前的数据,画图,写结果的excel。发现之前做的第二问的数据精度不够,专门写了一个程序开跑,最后结果甚至没有之前的好,果然,好数据可遇不可求。拿着大概数据画了图,写了结果的excel。队友完成所有的论文,打包程序(笑死,刚开始打包大小还太大,Rust的target文件夹还是太权威了)。最后顺利交了论文,交了程序。
与隔壁组的大佬一起去海底捞做赛后总结,群体智能可能有好的方法进行求解,还听说最后一题有人有25s的答案,还有更好的状态设置方法。今年结束了,明年还要打。(我要打一休尼的数学建模~~~(从来没有觉得做数学建模开心过)~~~)