/pkudsa.stellar

北京大学数算课程2021年大作业技术组:星际群落

Primary LanguagePythonGNU General Public License v3.0GPL-3.0

pkudsa.stellar

北京大学数算B课程2021年大作业:星际群落

背景故事 作者:王乐成

坎瓦斯星的指挥官最近很苦恼。作为双方母星之间缓冲地带的诸多星球都已经被对方所控制。每天都有部队从前线撤退回母星——为了逃离被对方压倒性的战力全歼的命运。但母星的承载量早已到达上限,已经没有多余的资源能够供给新来的部队,只能眼睁睁地看着这颗星球上自己的部队逐渐凋零。加上路途上的损耗,总的下来,戍死者固十六七。

“这也是没有办法的事……”

反观对方,他们的星球正处于产出效率最大的时刻。利用新控制的星球上的资源和充足的空间,只要驻扎适量的部队进行开发,就可以源源不断地产出新的部队运往前线。有情报称,他们打算同时从几个方向派出兵力,攻占毗邻坎瓦斯星的几颗星球之一,从而可以直接威胁母星。但好在坎瓦斯星附近的几颗星球都比较贫瘠,承载量小,不适合大军长时驻扎。如果对方长期捞不到好处,新的部队补给不上,他们自然就会将主力撤走或者分散到几颗星球上。

但是还有一种可能,就是他们马不停蹄,直捣黄龙,结束这场战争。

“事到如今,只有依赖于我们所研究的世界弦理论了。”

“世界弦理论?”

发问的人是雷诺,坎瓦斯的一名年轻舰长,曾经指挥K系列第六舰队发动著名的“凌晨攻势”,那场战役至今令人印象深刻。

现在正是发动下一次战役前的决策阶段。指挥官在这个时候将雷诺叫来母星,肯定是有事要交代。

“也许你曾听说过关于世界线和世界线变动的理论,”指挥官说,“如果一根线两端被绷紧,便成为一根‘弦’。我们的研究发现,世界的过去和未来更像是‘弦’的行为。”

“也就是说,就像演奏乐器一样,可以对这根弦进行弹拨?”

“你说的没错,迄今为止,我们进行了多次变更过去的实验,已经成功对过去某一时刻的世界状态引入了一个微小的扰动。由于蝴蝶效应的存在,初始状态的微小扰动理论上来说将会随时间扩大。只是,现在的我们并没有感受到实验造成的任何影响。”

“确实。”

“所以我们提出了世界弦理论。我们认为对过去的扰动在弦上形成了一列驻波。被扰动之处振幅约等于零,是一个波节点。波节点往后,世界线偏离初始位置的振幅逐渐扩大,到波腹处达到最大,随后又逐渐减小。而我们正好处于另一个波节点处,所以我们所处的位置振幅也为零。”

“所以,发生了更大变动的,是被扰动的时间点到现在之间的这段历史,以及更重要的——我们的未来?”

“其实倒也不能这样说……我们并不知道未来本该是什么样子,你要说它‘变了’的话,是相对于谁来说‘变了’呢?……更重要的还是现在。精确的测量发现,实验后的世界相对于实验前并不是严格的没有变化,而是有一个微小的变动率。”

“是多少?”

“十的十六次方分之一。”

(注:十的十六次方分之一:是Python的两个浮点数可被判断为不等的最小相对差)

雷诺望向窗外,他可能是想起了以前做过的定量分析化学实验,当时要求结果误差在千分之三以内。“事实上,存在过无数个坎瓦斯星系,”指挥官接着说,“每一个星系中星球的数量和邻接方式都不同,星球的丰饶和贫瘠也是同理。”

“而这场战争也有无数个不同的版本。”

“对,而这十的十六次方分之一的误差,正是在告诉我们,那一切不可以被视作是‘未曾发生过的事情’,它们通过某种方式正在对现在发生着影响。这可以用这样一种理论来解释:

“世界弦并不是完全理想的弦,其上波的叠加并不是完美的线性叠加,而是有一些非线性的成分在里面,导致波节点的振幅并不恒为零。也就是说,现实是可以被改变的。通过上次实验,我们已经和过去的另一版本建立了联系。现在要做的是将那个世界的属性投射过来,覆盖现实!”

“那,需要我做什么?”

“待命,像往常一样,直到决策阶段结束,我返回移动指令给你为止。”

(注:属性:在Python中,任何跟在一个点号之后的名称都称为属性,包括变量和方法)

从那以后,雷诺一直没有收到过任何指令。而在同一时间,对方已经将所有兵力移动到了毗邻坎瓦斯星的一颗星球上。他们几乎没有受到抵抗。就在雷诺准备联络指挥官请求下一步指令前的一瞬间——

对方驻扎在那颗星球上的舰队全部突然消失了。曾经庞大的舰队,如今只剩虚空。曾经繁荣的建筑,如今只留下废墟。

雷诺惊呆了。他马上接通了到指挥官的通讯链路,问:“这是怎么回事?”

回答是:

“这是设定。”

————分割线————

没有人知道在那一回合中指挥官返回了什么指令。事实上,要从一千多局对局记录中发现一盘有问题的对局也并非易事。只是类似的情况在此后就变得经常发生。后来,技术组的同学在GitHub上发布了一个bugfix,全文如下:

“我们发现承载产兵函数natality的游戏文件GameMap.py被替换为了它在GitHub上的早期版本,早期版本中的natality函数在兵力超过上限时的惩罚太大,倘若超过上限一定程度,产兵阶段甚至会直接导致节点兵力归零,所以我们才重写了该函数。现在我们将其还原回最新版本。”

————分割线————

今天!你所写的函数就是坎瓦斯星的指挥官。坎瓦斯的所有部队,都由你的函数所返回的指令调遣。

请不要提交奇怪的代码噢!