记一枚蒟蒻的数模国赛参赛经历

ycy说:这次比赛我们体验的是人生,我认为没错。 ——题记

题目发布

9月13日晚8:00,从国赛群里get到了题目。这次的比赛题型一如往常:A题是“高温作业专用服装设计”,草草看过后断定是一个机理分析+微分方程求解的问题。B题是“智能RGV的动态调度策略”,典型的优化模型。由于B题的内容和我的专业关联度较高,和队友做完简单的分工后,我开始研究起了B题。
B题对应到ACM里就是一道模拟题,于是,啥经验都没有的我就开始直接分析起题目的层次,企图把程序的轮廓打出来。但是到了采用具体什么算法的时候出现了艰难的“抉择”。
我的情况是刚接触正经的算法一个月,其中约一半的时间花在图论算法上,一开始就总想着用图论建模,什么工序的排序就对应着一个拓扑排序,8小时内最大生产量对应着图的最大流。但是想法总归是想法,屡试无果后我又想到了这是一个计算机仿真的决策模型,这零星的想法主要来自于我大一下学期java未竟项目(五子棋AI),设计一个启发规则的评估函数,设置深度去预测每一次决策后总的等待时间增加了还是减少了,但是我又从来没有尝试过自己设置一套启发规则,于是留着这个想法想和队友一起讨论一下如何设计规则。接下来想法就更多,什么神经网络,智能搜索算法都出来了,上网一查,发现B题是最近信息学方面一个研究热点——智能调度,而自己居然把流行的解决策略都考虑了一遍,不由有些惊奇。

匹兹堡初聚

9月14号(星期五),上完第一大节的课后,我赶到匹兹堡学院和队友会晤(不得不提,匹兹堡学院的待遇真的是太好了,虽然学费贵的一匹)。
两个队友按照分工昨天研究的是A题,他们说A题并不如看起来这么简单。于是我和他们交流了我对B题的看法,他们都觉得B题更难,而且如果选B题,我就只能孤军奋战了(因为队友一个是学材料的,一个是数经的。其实我觉得有点扯,什么不都是自学的嘛)。虽然我对于B题兴趣较大,但是主要是自己太弱,怕最后什么都做不出来拖累了队友,于是我决定选择A题(现在想想自己应当有勇气去选B题,实在不应该有这么不自信的想法)。

一筹莫展

A题的热力学和偏微分方程这一块对于我来说完全是知识盲区,于是我就让队友带着我用上午的两个小时快速入门了一下。但是听完后还是闷闷的,只知道我可以计算机仿真这个传热的过程,但是不知道怎么做。听队友欢快的聊着各种名词,我就不敢打断他们,在一边卖力的听着。下午队友又查到了这道题完全就是浙江理工大学某教授的一个研究课题,在其学生的论文里找到了多层材料热传导的偏微分方程模型(这一点最令人不爽,国赛哪能就这样变成一个信息搜索题呢)。于是我们问题的焦点就落到了如何解这个偏微分方程身上,我由于负责编程这一块,于是找代码的任我就落到了我的头上,但是我连原理都听的懵懵的,更别说看懂哪恼人的大片数学公式了,所以整个下午搜索都是懵懵的,一无所获。

设计出算法!

晚饭过后,风一吹,我感觉自己有些清醒过来了,下午一直想着从空间和时间两个维度离散化热传导,完全模拟传热过程,现在这个想法愈加遏制不住。于是就和队友商量自己设计算法(因为下午想到这个算法和队友讨论后队友表示不理解,由于我对于整个原理的理解都来源于队友,而对偶一直强调我改变了公式成立的条件,我就一直不敢自己写程序浪费时间)。
我使用有限的热力学知识加上对于离散化的理解,推导出了一个自认为能描述离散化热传导过程的公式就开始编写代码。但代码写好后的运行结果一直有问题,热传导终点的温度全部显示为负无穷。可是这公式原理上是不会产生这么奇怪的结果的。
于是,本就视调试于猛虎的我硬着头皮调试起了超大操作数的程序,不一会儿就崩溃了。前面的热传导一直是没有问题的,但是离热传到目标层,我至少还需要上万次单步执行。吼,我简直要抓狂到去下载一个可以自动点击的代码了。无奈之下,我不情愿的想到了编写函数,通过接口的设计,使得我可以通过简单修改一个时间参数将程序运行到仿真中的某一时刻,使用二分法确定出现问题的时间点,再针对该时间点的传热进行查看。没过多久,我就定位到了出现位置的时间点。查看变量内容,我敏感的发现传热过程刚好在第三层织物和空气层的交界处出现了异常,再仔细调试,确定了出现问题的是空气层中的热传导过程。不明所以,既然我空气层出现了问题,我就先看看传到第三层与空气层交界处的数据到底“长啥样”。简单修改程序后,我惊喜的发现,交界处的前面500s的数据和题目所提供的数据还是基本吻合的。至于后面的相差较大,我就姑且将它归结为空气层的内部机理没有分析透彻。于是我将自己的成果和队友share了一下,由于这次有实际的数据,队友似乎可以理解了我的思想。于是我开始兴高采烈的用程序分析起空气层为什么传热出了问题,哎,不得不说程序还是能说明一切问题,结果是,空气层的一个时间单位内传出的热量太多,使一个空气微元的降温大于了两个相邻空气微元之间的温差,这显然违背了热传导规律。一开始我想到的是精度问题,于是反复调整空间和时间精度的比例,但是不论怎么调整,都解决不了这一问题。在调整精度的过程中,我无意中发现,精度的比例居然会影响程序运行的正确性。经过多番尝试,我发现只有时空精度的比例大于平方关系时程序才有正确结果(这一关系我主要根据程序运行的结果推算平均情况下热传导的空间速度得出的)。程序的事情已经告一段落了,接下来当务之急是解决空气层的机理问题,ycy恍然大悟般的说道:大概在空气层中我们不能忽略热辐射的作用,因为只有热辐射才能实现热量从低温到高温的传递。而且我前面已经查到,空气层小于8mm的情况下是不可能产生热对流的,所以只剩下热辐射了。
于是我们开始查询相关资料,过不多久,学姐在他们之前查到过的论文中找到了几乎和我们的问题一样的模型。且里面提到了使用有限差分法求解和我们列出的一模一样的偏微分方程组。学姐还说,这有限差分法的公式居然和我推出的公式长的很像,这下队友们才彻底接收了我的想法。
蒟蒻的垃圾代码:

#include
#define maxn 200
#define PRECISION 540000
#define STEP 101
#define TIME 0.01

double block[maxn], material[3][3] = { {300.0,1377.0,0.082},{862.0,2100.0,0.37},{74.2,1726.0,0.045} };

void init()
{
	block[0] = 75.0;
	for (int i = 1; i <= STEP + 1; i++)
		block[i] = 37.0;
}

int ID(int i)
{
	if (i <= 6 && i > 0) return 0;
	else if (i <= 66 && i > 6) return 1;
	else if (i <= 102 && i > 66) return 2;
}

double increase(double t_dif, int id)
{
	return (1e+8)* t_dif *TIME*material[id][2] / (material[id][1] * material[id][0]);
}

double decrease(double t_dif, int id1, int id2)
{
	return (1e+8)* t_dif *TIME*material[id1][2] / (material[id2][1] * material[id2][0]);
}

void conduct(int s, int t)
{
	for (int j = s; j < t; j++)
	{
		for (int i = STEP; i >= 0; i--)
		{
			double t_dif = block[i] - block[i + 1];
			if (block[i] > block[i + 1])
			{
				block[i + 1] += increase(t_dif, ID(i + 1));
				if (i != 0) block[i] -= decrease(t_dif, ID(i), ID(i+1));
			}
		}
		if (j % 1000 == 0) printf("\n%d-- ", j / 1000);
		if (j % 100 == 0) printf("%.2f ", block[STEP + 1]);
	}
}

int main()
{
	init();
	conduct(0, 286);
	conduct(286, PRECISION);
}

瓶颈

那天晚上回去后,队友们又回去查了资料,基本确定了这道国赛题和浙江理工大学有着千丝万缕的关系,并且查出了是哪一位教授的研究课题。第二天早上,学姐就从望江的图书馆借来了我们学习唯一一本那位浙江理工大学教授研究成果的书籍。本以为这下胜券在握,但接下来的过程并不如意。我们未在那个教授的书里找到他到底是怎么得到自己的研究成果。虽然我看了那个有限差分法的公式后确定了那个公式和我的公式一模一样,但是一上午就没有再多的进展了。

望江求教

临近中午,我提出求助指导老师。以我敏锐的洞察力,我建议去问张XX老师,虽然我只听过他的一节课,但是我的直觉告诉我他很牛逼,而且他的助攻方向是微分方程(虽然队友们都不敢苟同)。于是我们给很多位老师同时发了求助信,过不多久,张XX居然回复了我们,说他上午就在望江,于是无助的三人组怀抱着一丝希望踏上了望江求教之路。

飘了

到了望江,我们并未见到张XX老师,但我们见到了我校的数学建模组长,他正在给一波同学指导比赛题目。等待过程中,我们发现,大多数人做的是A题,且他们的进度居然都没有我们快,当我们问老师的时候,老师居然对我们的问题一无所知,老师也是通过我们才开始推断空气层出了问题,其他组的同学(特别是妹子)投来了钦佩的目光,顿时我们觉得有些飘飘然了。

熬夜

下午,我们找了一家咖啡馆,斗志满满的准备大干一场。由于老师肯定了我们的思考路线,我开始悠闲的翻阅起了浙江理工大学教授的那本书,发现这段时间我们做的事情和他整本书的路线居然差不多。队友不一会儿提出要先将C程序转化成matlab程序,好绘图。我本想自己转化,但队友主动提出要转化这个程序,鉴于他比我更熟悉matlab语言,于是我口述C程序的意思,在旁边指导他如何转化这段程序(事实证明,跟一个非计算机专业的人解释起程序来还是颇为头痛的)。
但是,当我们完成程序转化后,居然发现程序的结果出错了。我于是一次次仔细核对主程序n遍,除了找到一两个队友不仔细的小错误之外,还是不能将预期结果运行出来。一直为这个问题伤神无果到晚上7:30,我们决定先出去吃饭后回来再干。
在如家租了一间标间,几番折腾到晚上11:40,队友无意中翻到了我建议编写的唯一一个函数文件,我一眼就觉得这里的参数有点不对劲,惊觉修改了主程序的参数后忘了修改函数文件里的参数,之前只是为了图个便利没把代码的接口好好设计一番,没想到就这样在这里栽了一个大跟头(哎,被队友当做了一大糗事)。
这里已经耽误了大量时间了,明天晚上就要结题了,我们打算今晚熬夜干题。已有前车之鉴,我于是先将程序的接口好好设计了一番,代码健壮了一些。接下来就是热辐射公式怎么结合进我们这个程序里面的问题了,我们三人对于这些物理学方面的知识实在捉急,折腾到1:30也没有理解书上的公式推导。队友已经乏了,进里屋小憩,我坚持自己不困,准备静下心来理解这个公式。约莫过了两个多小时,我隐隐感觉自己对于这个公式的收敛性有了形象化的理解,于是给处于意识模糊状态的队友,用杆上挂长绳的模型结合函数图像变化给队友们解释了参数变化,公式中指数函数的形状变化,以及一定会在我们给定的区间内趋于一条直线的收敛性证明,由此证明了虽然外界温度仍高于空气层中的温度,但空气层一定会收敛于一个较低的温度不会再升温,此时热辐射平衡。

再无进展

于是,一直忙活理解公式的离散化形式,并编写代码一直到早晨7:30,队友自认为帮不到我出去买了吃的回来。我的程序是编好了,但是又有一些问题,此时我的神智已经有些不清了,上一步刚调试的程序下一步就不记得结果了,队友坚持我进屋去睡一会儿,哎,可能真的是体力透支了吧,40个小时没睡觉还是受不了啊。

咖啡馆总结

下午,我们从旅店搬了出来,找了一家咖啡馆,但是大家再无斗志了。ycy突然想把研究重新退回到解PDE的一般解法(至少我给他总结出他说的是这个意思),但是时间上已经不允许我们这样做了。于是乎我开始了整个比赛的总结,这个A题从头到尾就是让我们搜到一个现成的解PDE的算法,但是我们一直没有搜到所以就想办法利用计算机仿真跳过了常规解法,并且恰好我推出的公式又和那个常规解法的思想有限差分法一样,只是我是用模拟推进(迭代)的方式实现的,而正规如何解不得而知。我们关键的问题就卡死在这个搜索上,导致第一题始终解不出,老师给我们的错误指导又浪费了我们大量的时间。第二题和第三题就是一个状态空间二次搜索和组合优化问题,对于我来说并不是很难。哎,彻彻底底的败给了搜索。

赛末饭局

虽然有些失落、遗憾与不甘,我们决定去吃一段好的。找了一家烧烤店,我们开始谈天了,谈谈自己的未来规划,谈谈自己的过去,抛下一切烦恼与顾虑,好不开心。大概只有一同奋斗过才能使大家更加认同吧,这种不一般的朋友的感觉真好。

分别

在望江的小车站,我们道了别,我和ycy坐校车回了江安。回到寝室赶在最后一秒提交了做了一半的论文,算是对这三天的付出有一个交代吧。这一分别可能意味着我们三人最后一次合作的结束。因为明年的时候,ycy出国了,学姐将毕业了,回想半年前组队后第一次线下见面,不由有些感慨。

大梦三生

比赛后的第一天早上,我开始补起了作业。身体仍有些疲惫,但是脑子却格外清醒,我感觉到自己对于学习和人生有了新的理解和看法。学习上,我更加深刻的感受到对于自己不懂的东西千万不能轻易跳过,有所糊弄,不然终归是要还的,整个比赛过程中,两个队友从一开始就讨论起了我完全听不懂的东西,但是他们并没有真正去理解,而我通过几个小时的理解之后就完全掌握了这些知识,后面比赛过程中我不断给他们一遍遍解释,但是他们还是似懂非懂,知道比赛快结束了才终于有所参悟,这里加起来的时间远远超过了我狠下心来认真理解的时间。我的人生观也有了新的变化,自从中考失利后,我一直缩手缩脚,不敢放手一搏,总是运筹帷幄早早做准备充分后才敢开始做事,虽然结果颇好,但是始终不符合自己的心意。这次比赛让我认识到自己还未完全湮灭的能力,我可以在短短时间内理解这么多高深的知识,还自己想出了有限差分法,真的有些回到初中时候天赋异禀的状态。久违的少年轻狂似乎重新渗入了我的血液,我不再那么惧怕失败,对自己的前路只有信心,只是不同于以前的是多了一丝深思和远见。


ps:后来了解到,我的直觉非常准确,张XX后来去参与了国赛作品的评阅,如果我们当初没有恰巧和他错过的话,说不定就可以得一个大奖。虽然有些遗憾,但是这次比赛的经历对我的助益早就盖过了这些遗憾,虽然结果不咋地,但是我仍旧庆幸有这么一次比赛的经历,庆幸有这么两个队友陪我一同奋斗。

你可能感兴趣的:(dairy,数学建模)