0、背景
0.0 前年(2021)
我在北京的校园里,设计并制作了一个六重竹笋,《六重蓝笋成长记(上)》和《六重蓝笋成长记(下)》,开始体会到竹笋的乐趣,并立志于做更高重的笋。
0.1 去年(2022)
我在上海的某个特殊时期,闲得实在是无聊,制作了 视频:从入门到夺笋,以缓解不能出去玩的郁闷,并立志于做更高重的七重(七色彩虹)竹笋。
0.2 今年(2023)
随着我做高重蓝笋的念头越来越强烈,便开始着手准备这件事情。
非常重要的问题来了——做几重?
我上一次做单人六重,耗时 5 个小时,行程 31.37 公里。
@ALHDLIOX
上一次做单人七重,耗时 35 小时,行程 184.69 公里
经过鲁莽的思考,我觉得九这个数字很好,代表数之极。做九重!
正所谓:
九重开,灵之斿,垂惠恩,鸿祜休。
不对,做九重的 AP 只够我转生半次的,我要十重!
1、获取数据
1.1 三年前的数据
我想起 @Nanoape
曾在 来刷新新的个人
Dronenet 飞行记录吧 一文中提到他拿到了全球所有 Portal 的数据。共
1.31G,Portal 总数 11,475,124,数据统计截止到 2020.06.12。
于是我下载了portal数据Mega(这个网盘真良心啊,不限速,不强制登陆)
然而三年过去了,这一数据已经过时,比起得不到最优解,我更担心的是有的 portal 移动了位置,致使整个计划失败。
1.2 获取新数据
我本想通过某个脚本来抓取上海区域的所有 portal 的信息,但是抓到了这个信息:
{'message': 'Please, dont do so. Contact @Lanched insted.'}
谢天谢地,这似乎制止了我违反ToS的行为。
于是我联系了
@Lanched
,在他的热心帮助下,我顺利拿到了一份整个上海portal的信息。
数据截止到 2023-7-30 日,区域范围是北纬 30.662225-31.879785,东经 120.860389-121.969865,基本包含整个上海区域,一共 30,179 个potal。
在与他的交流过程中得知,全球 portal 的数量已经从2020年的 11,475,124 个,2023年上涨到了 18,284,480 个,增长为原来的 159%。看这个数据很可观,依稀还是能看到它茁壮成长的影子的(拜托拜托,再撑十年吧)。
最后,我向他表示感谢,并表示 以后有需要我的地方我会尽全力帮忙, 得到的回复却是:
I dont think, you can help me in ingress - anyway i cant play it anymore.
我看了他的名字是
Alex Zverev
,猜测到他的国籍,顿时心里五味杂陈,但愿以后游戏可以更纯粹一些。
2、分析数据
写了一些小脚本,对拿到的数据进行了分析,结果如下:
- 上海的经纬度是东经120°52′-122°12′,北纬30°40′-31°53′之间。
- 数据截止到2023-7-30日,区域范围是北纬30.662225-31.879785,东经120.860389-121.969865,基本包含整个上海区域
- 共30179个potal。
我喜欢密集的区域!于是进一步将经纬度限制在比较密集的 北纬30.988-31.430,东经121.249-121.718,一共22431个portal:
上边长 = 44472m, 下边长 = 44679m
左边长 = 48716m, 右边长 = 48716m
3、计算竹笋的解
3.1 思路一:求助大厉害
又一次翻出了 @NanoApe
的大厉害,又一次感叹高三的时候能写出这代码实在是太太太强了!
稍微修改了一下代码,使其能够兼容读取非json形式的portal信息。这时我突然有一个大胆的想法——如果不对竹笋的计算重数进行限制,将整个上海的 potals 送进代码,看一看整个魔都能容纳几重笋?
对一些代码进行修改,比如从栈
上分配内存改为从堆
上分配内存,增大对portal
和field
数量的限制等,最终发现这个方案不太可行——
以筛选出的 22431 个portal为例,这可以形成 \(C^3_{22431} = 1880773814095\) 个 field,如果对每一个 field 都进行保存计算,这比ChatGPT的参数量都多一个量级,直接劝退。
3.2 思路二:分而治之
采用分治思想(Divide and Conquer)
,先选出若干小区域,对每个小区域使用大厉害进行竹笋计算,然后在所有计算结果中寻求高重竹笋的解。
如上,每一小块区域包含了1000个portal,通过对每个小区域计算竹笋的解,然后对所有的解进行拼接,拼出一个大竹笋。
然后就是兴致勃勃的准备进行暴力求解,辛苦电脑跑几天,然而代码跑起来突然意识到这条路其实是行不通的。
大致原因就是,竹笋确实是能获得很多解,但是没法拼大竹笋啊。于是也放弃了。
(不过这个代码在后面发挥了很大的作用)
3.3 思路三:不求优解,但求有解
灵感来源于以前聊天时 @hydronephrosis
的撒豆子说法:
我喜欢这样理解field的形成:类似于学概率的时候往桌布上撒豆子的模式,在一块三角形的布上撒一颗豆子(po),连接所在区域的三个顶点,把布分成三个小区域;然后再撒下一颗,连接所在小区域的三个顶点,以此类推,直到所有po都囊括,形成完美多重。根据撒豆子顺序的不同,同样的一组po可以形成成千上万种不同的完美多重,每一个完美多重也可以通过这种形式解读成唯一的一系列po的顺序。这种多样性正是完美多重的魅力所在。如果每一次不止撒一颗,而是根据现有区域的数量来撒相同数量的一把豆子,使得刚好每个区域都落下一颗,就是竹笋了。如此竟与你看field的三维视角有异曲同工之妙。
每撒一颗豆子都是多加三个field和三条link,也可以解释为什么完美多重的结构改变不影响AP和field的数量。
以及@HesalTJ
的补充:
在游戏内实现的话就是,利用在Field之下连Link的新规则,在形成第一重之后依次抵达下一级的内点射3out 3out 3out… 实际上执行起来会绕很多圈,但是它的美丽在于,如果用Intel截了仅Field的图一帧一帧地做成录像,那么你会看到的是一个填充色由浅逐渐逐渐变深的三角形,每一帧都有一个小三角形的深度+1重,每次提升了重数之后新的小三角形面积变小数量×3: 从一重+1帧变为二重、+3帧变为三重、+9帧变为四重、+27帧变为五重…
可惜的是,按照这种思路写代码比较难拿到最优解,做笋的时候会多走很多路。不过,不求优解,但求有解嘛:)
而且这种解法是我最喜欢的竹笋形状,我心目中的完美竹笋——
高重的顶点位于次高重field的重心位置,这样的竹笋看起来更加规则,非常完美!
备注:三条中线相交的点叫做重心。
针对这种思路,po场的分布均匀程度更重要,于是进一步将经纬度限制在分布比较密集且均匀的 北纬31.18-31.29,东经121.40-121.54,一共 8704 个 portal.
上边长 = 13296m, 下边长 = 13312m
左边长 = 12226m, 右边长 = 12226m
于是,我得到了上海的一个八重竹笋的解:
当然,这是一个假的。它甚至连一个6重竹笋都不是。
于是换一个思路,不再寻找三角形的重心位置,而是能够 将po的数量三等分的位置。这里就不展示了,因为跑出来个更不靠谱的结果。
想来想去,还是得依靠 Nano 的大厉害啊!
其实,思路二:分而治之 的方法其实是可行的,只不过我的那个方法实在是蠢到家了。
而且,要想计算高重竹笋,分而治之大概是最好的方法。
4、搁置
暂时没有得到8重解,这件事情就搁置了两个月。
11月的一天早上,@Hesal 发给了我一个兑换码,兑换出来 800 个 la,我瞬间狂喜,因为这可以通过运动胶囊合成竹笋党最爱的 SBUL,也就在此刻,上海大竹笋计划又一次被我记起。
然后,这件事情又搁置了近两个月。
12月底,在 @NanoApe
的频道看到了这么一条消息——
六年前的 2017 年,26 名北京 Res Agents 在金融街完成了全球最快六重蓝竹笋,12 月 24 日凌晨 02 点 17 分到凌晨 02 点 58 分,耗时 39 分钟。
想一想,26位玩家,在凌晨,齐心协力种出竹笋,真是一件浪漫的事情啊!
然后,这件事情又搁置了近两个月。
2024年2月底,我终于用光了那 800 个 la,上海大竹笋计划又一次被我记起!
5、可行性分析
5.1 场内连线是否能实现真竹笋?
大约在2022年5月份的时候,已经允许 field 内 500米 的 link 了,那时候我产生过类似的疑问,于是做过相关实验。
结论是:在field内往顶点po射,是能够起到顶点po往里面射一样的效果的(即层数增加一致),所以不需要担心这种规则下会做一个假竹笋。
以前和平周活动可以允许长度不超过 8 公里的 Link 在 Field 下面建立,这非常利好7重以上的竹笋。 但是仍然需要注意一点:
- 7重笋要保证封口时最近的 65 - 40 - 2 = 23 条 link 小于 8 公里
- 8重笋要保证封口时最近的 129 - 40 - 2 = 78 条 link 小于 8 公里
- 9重笋要保证封口时最近的 257 - 40 - 2 = 215 条 link 小于 8 公里
5.2 上海能否出现8重竹笋?
目前8重应该是可以的,尤其按照最近半年来上海portal肉眼可见的增长速度,这个难度是降低的。
但是按照现在双方特工们的活跃程度以及极个别的不和谐因素,出现高重竹笋的困难度还是非常高的。
5.3 玩家够多吗?
上海这边做竹笋尤其需要速战速决,这就必须要多人合作共同完成。
比如8重竹笋,要想在几个小时内完成至少要动用10名以上有竹笋经验的特工,
好在上海这边活跃玩家有很多,但是有竹笋经验的玩家比较少一些。尤其这两年,感觉已经很少听到竹笋的大新闻了,竹笋教快要没落了哇。
6、起航
遍地开花
至于上海高重竹笋计划,大概会在某个月黑风高夜顺利完成吧。