苟利国家生死以,岂因祸福避趋之

0%

很久没有写技术贴了。最近,总有在Linux环境下连回ecnu服务器的需求,但是又不想丧失使用Google的权利,怎么办?openconnect是一个非常好的开源软件,可以实现这一需求。

openconnect支持AnyConnect、Pluse Connect等诸多高校常用的校外访问平台,可以用包:

1
sudo apt install openconnect

1
sudo dnf install openconnect

然后用pip安装vpn-slice:

1
pip install vpn-slice

确定which vpn-slice能够找到路径。

方便起见,我们先设置环境变量:

1
2
3
4
export SERVER=vpn-cn.ecnu.edu.cn
export USERNAME=20199966
export PASSWORD=<HIDDEN>
export IPRANGE="219.228.63.0/21 59.78.176.0/20 59.78.199.0/21 202.120.80.0/20 222.66.117.0/24"

SERVER是要连接的服务器地址,USERNAME是我的用户名,PASSWORD是密码,IPRANGE是需要用VPN访问的IP段,这里就是ecnu的IP段。然后我们使用openconnect连接:

1
2
3
4
5
6
7
8
echo "$PASSWORD" | \
sudo openconnect $SERVER \
-m 1290 \
-u $USERNAME \
--passwd-on-stdin \
-s "$(which vpn-slice) $IPRANGE" \
-b \
--syslog

即可连接成功。

ping ecnu的服务器,大致就是中美之间的正常延迟:

1
2
3
4
5
6
7
8
9
10
(base) [jz748@muscato bin]$ ping 219.228.63.136
PING 219.228.63.136 (219.228.63.136) 56(84) bytes of data.
64 bytes from 219.228.63.136: icmp_seq=1 ttl=62 time=246 ms
64 bytes from 219.228.63.136: icmp_seq=2 ttl=62 time=246 ms
64 bytes from 219.228.63.136: icmp_seq=3 ttl=62 time=246 ms
64 bytes from 219.228.63.136: icmp_seq=4 ttl=62 time=246 ms
64 bytes from 219.228.63.136: icmp_seq=5 ttl=62 time=246 ms
64 bytes from 219.228.63.136: icmp_seq=6 ttl=62 time=246 ms
64 bytes from 219.228.63.136: icmp_seq=7 ttl=62 time=246 ms
64 bytes from 219.228.63.136: icmp_seq=8 ttl=62 time=246 ms

ping google,延迟极小:

1
2
3
4
5
6
7
8
9
(base) [jz748@muscato bin]$ ping www.google.com
PING www.google.com (172.217.12.164) 56(84) bytes of data.
64 bytes from lga25s62-in-f4.1e100.net (172.217.12.164): icmp_seq=1 ttl=53 time=2.10 ms
64 bytes from lga25s62-in-f4.1e100.net (172.217.12.164): icmp_seq=2 ttl=53 time=2.25 ms
64 bytes from lga25s62-in-f4.1e100.net (172.217.12.164): icmp_seq=3 ttl=53 time=2.30 ms
64 bytes from lga25s62-in-f4.1e100.net (172.217.12.164): icmp_seq=4 ttl=53 time=2.32 ms
64 bytes from lga25s62-in-f4.1e100.net (172.217.12.164): icmp_seq=5 ttl=53 time=2.31 ms
64 bytes from lga25s62-in-f4.1e100.net (172.217.12.164): icmp_seq=6 ttl=53 time=2.25 ms
64 bytes from lga25s62-in-f4.1e100.net (172.217.12.164): icmp_seq=7 ttl=53 time=2.20 ms

虽然只过了博士生涯的1/10,但是已经可以对比了。

0 待遇和工作时间

待遇方面,本科期间导师给的津贴是¥800-1000/月,因为导师的经费只支持这么多。博士期间的工资是$3000/月,全额学费减免,医保,享受1984年税收协定的零税率。
收到工资确实是一件很有仪式感的事情,感到自己的劳动受到了尊重。

工作时间方面,本科期间有张纸贴在办公室的门上,说是一周7天,每天9:30-21:30,不过我没理睬过这张纸。博士期间课题组对工作时间没有任何要求。实际来说,本科期间大概只要对得起良心就行,比如每天8小时,不过由于周末总能见到人,所以周末去办公室是件正常的事情。博士期间的状态也差不多,不过大家都会在20点前走光,导致我最晚也会在21点走人;周末去办公室总是见不到人,大概大家默认周末不上班,于是后来也不去了,最多在家工作。

1 办公环境

本科时,导师在办公室给了一个比较宽敞的座位;博士时,座位宽敞了3倍,人均面积提高了10倍。连卫生间都更加宽敞。本科时办公室的面积是要给学校交钱的;博士时尚不清楚。

2 仪器

办公电脑方面,本科时,导师给了一套含显示屏的dell电脑,型号记不清了,我毕业前又买了NAS给我存数据,感觉很大方。博士时,老板给我买了$2985的Dell alienware(京东卖三四万RMB)、$339的HP显示屏和2个$174.99的4TB硬盘,感觉老板就是土豪。

超算方面,本科时,学校有超算,现在已经有九期了,有CPU和GPU,觉得学校很有钱。美中不足的是超算是收费的,需要老师申请账号,CPU 0.1元/核/小时,GPU 1元/卡/小时。博士时,得知所有超算都是免费的,当时就大跌了眼睛。学校主要有两个超算,一个是学生也可以申请的Amarel,CPU和GPU型号和华师大的差不多,但是速度莫名其妙就是更快(当然不是心理作用,测试过的)。另一个是Caliburn,说是花了一千万刀美元建设的。华师大在超算上十年的投入应该都没这么多。

网络方面,本科时,有100Mbps有线网,感觉很快,当然只限于国内的网络。博士时,竟然有1000Mbps有线网,下个package唰的一下就下好了,当时感觉不敢相信自己的眼睛。GitHub也很快。

3 老板

经费方面,本科时,觉得经费很多。博士时,查到老板每年竟然能从NIH拿到120万刀经费,不知道是国内的多少倍了。

关于老板的h-index,Google Scholar的数据分别是13和47。

老板都不push。具体来说,博士期间的老板更不push一点。当然,可能是因为push程度是相对的,当自己比老板还push时老板就显得不push了。

4 课题组

博士期间,组里人才更多,猜测因为工资更高。

关于组内通讯方式,除了当面聊这一全世界通用的方式以外,本科期间,一般用微信,立马回;博士期间,只用email,一般不回,偶尔回。

关于组会,本科期间,组会按例一周一次。博士期间,迄今为止只开过两三次,感觉根本没有开组会的习惯。

5 课题

本科时,用deep learning potential炼丹;博士时,还在用deep learning potential炼丹。

6 课程与讲座

本科期间,上课对研究没有任何帮助;博士期间,虽然选的课都是(看起来)相关的,但是对研究仍然没有任何帮助。

讲座报告都是一般每周一次。

7 院系和同学

本科时,一个年级一个班。博士时,大致也是如此,不过没有听说过有“班级”的说法。(可能叫program?)

本科时,同班同学都是正儿八经的第一学历985的学生(废话)。博士期间,发现同年级第一学历在国内的那些同学的第一学历也都是985。

关于院系的文章要求,应该没有哪里会对本科生有文章要求;然而博士期间,对文章仍然没有任何要求。

本科期间学院内有丰富的活动,包括学院的班级的团支部的党支部的。博士期间未见有什么活动,清净的很。

本科时学院有学生会。博士期间并没有这种东西。

8 学校资源

关于电子资源,感觉没什么区别,该买的数据库学校都买了。

关于校外访问校园网的方式,都是思科的AnyConnect,没什么区别。

关于Email,本科期间学校提供的是无限量的腾讯企业邮箱,stu.ecnu.edu.cn域名;博士期间学校提供的是100GB的Outlook和无限量的Gmail,rutgers.edu域名和chem.rutgers.edu域名。

关于网盘,本科期间学校没有提供网盘;博士期间学校给了无限量的Google Drive、无限量的Box和5TB OneDrive。

关于软件,都提供了Windows、Office全套、MATLAB等软件,区别在于本科期间提供了全套Adobe和Visio,博士期间提供了ChemOffice。

9 生活

本科期间和博士期间都经常吃食堂和点外卖。外卖都主要点汉堡和中餐。

日前发布的《华东师范大学2019年毕业生就业质量报告》显示,华东师范大学化学与分子工程学院2019年共毕业245人,就业率达98.78%(242人),仅3人暂不就业。就业率超过孟宪承书院、计算机科学与软件工程学院等23个院系,也超过全校平均水平(96.91%)。

《就业质量报告》同时公布了院系本科毕业生留学、升学比例。化学与分子工程学院本科毕业生境内升学率达41.67%,境外留学率达9.72%。

就业质量报告院系留学、升学数据

信息公开网公开的《华东师范大学2018-2019学年本科教学质量报告》[1]显示,2018-2019学年华东师范大学化学与分子工程学院本科毕业生就业率达100%。化学与分子工程学院是学校10个本科毕业生就业率达100%的院系之一。

参考资料


  1. 1.华东师范大学2018-2019学年本科教学质量报告 http://xxgk.ecnu.edu.cn/s/202/t/377/a8/04/info174084.htm

2019年11月11日晚,数十名爱国学生自发聚集在一起,发起“反废青”爱国集会。此前,“废青”们计划当晚在罗格斯大学道格拉斯学生中心散布有关香港的谣言,引起了极大愤慨。爱国学生自发策划了是次活动,旨在传播真相,抵制谣言。

在“废青”的要求下,道格拉斯学生中心加强了安保,禁止带入宣传性标语和专业摄像设备,禁止摄像和拍照,禁止散布传单。这些措施限制了真相的传播,但不能限制爱国学生们传播真相的决心。“废青”们自称受女权组织资助,宣扬所谓“民主”,与香港暴徒连线,声称他们是“非暴力”、“和平”的。现场爱国学生对这些谎言表示愤怒,但为了维护国家形象,爱国学生们保持了最大限度的克制,准备在“废青”们声称的所谓问答环节戳穿他们的谎言。

然而到了休息时间,“废青”声称问答将不会现场提问,而是以所谓问卷的形式进行。一时间,现场学生纷纷抗议“问答”造假,使用预先准备好的问题,压制真相和异议。休息时间结束后,“废青”承诺问题不会造假,然而果然使用了预先准备好的问题。爱国学生群情激愤,纷纷离场以示抗议。在场外唱国歌的提案遭到了否决,爱国学生一致同意国歌是神圣而不可侵犯的,用于抗议“废青”有损国歌的尊严。一名女生当场痛哭,痛诉香港“废青”传播谣言的罪恶行径。

次日,校报The Daily Targum对爱国学生分发传单谴责“废青”的行动,以及对“废青”掩盖真相的抗议进行了报道。

本次爱国集会使香港“废青”“双标”式的“民主”谎言暴露于世,他们的所谓“民主”便是压制一切与己不同的观点,与法西斯主义无异。希望全世界能看清香港“废青”的真面目,不被谎言蒙蔽。

(题图来自校报The Daily Targum,图注为Students who opposed the Hong Kong protests distributed double-sided flyers outlining their position to other attendees. SALMA HQ)

2019 年 10 月 24 日(UTC-4)微信公众号

近日,我已经通过 conda-build[1]构建了 deepmd-kit(含 lammps 模块)的 conda packges[2],并用 constructor[3]打包了离线安装包。下介绍安装方法及注意事项:

一、conda 安装

安装 conda 后,使用以下命令安装 GPU 版:

1
2
3
4
conda install deepmd-kit=*=*gpu lammps-dp=*=*gpu -c deepmodeling
将gpu改为cpu即可安装CPU版:
```bash
conda install deepmd-kit=*=*cpu lammps-dp=*=*cpu -c deepmodeling

如需指定版本,需将两个等号中间的*号改为版本号(目前有 1.0.1 和 0.12.8):

1
conda install deepmd-kit=1.0.1=*cpu lammps-dp=1.0.1=*cpu -c deepmodeling

二、离线安装

https://github.com/njzjz/deepmd-kit-recipes/releases 下载 v1.0.1 离线安装包(也提供了百度网盘链接):

releases

下载后执行以下命令,按提示操作即可。

1
sh deepmd-kit-1.0.1-*pu-Linux-x86_64.sh

三、使用与注意事项

dp 和 lmp 分别为 deepmd-kit 主程序与 lammps:

1
2
dp -h
lmp -h

GPU 版本已经包含 CUDA 10.0,需要注意的是 CUDA 10.0 仅支持 NVIDIA 驱动 410.48 以上,详情可参见 NVIDIA 官网 https://docs.nvidia.com/deploy/cuda-compatibility/

运行 dp 命令时,应设置环境变量KMP_BLOCKTIME=0KMP_AFFINITY=granularity=fine,verbose,compact,1,0,否则会导致高达50%的性能损失。这是由于 anaconda numpy 一个存在多年的 bug[4]


  1. 1.conda-build https://github.com/conda/conda-build
  2. 2.deepmd-kit-recipes https://github.com/njzjz/deepmd-kit-recipes
  3. 3.constructor https://github.com/conda/constructor
  4. 4.numpy/numpy#12374 https://github.com/numpy/numpy/issues/12374

2019 年 10 月 17 日微信公众号

先介绍一下机器环境,CentOS 7.6,系统自带的 gcc 4.8.5,自己安装的 anaconda,icc 19.0.4,CUDA 10.1,CUDNN 7,连有互联网。目标是安装带有 TensorFlow 2.0.0、DeePMD-kit 1.0.1 的用 icc 编译的 LAMMPS 7Aug2019。

一、编译 TensorFlow C++库

1
conda create python=3.7 bazel git cmake -n dpdev -y

先创建一个 conda 环境,带 bazel、git、cmake,之后会用到。

1
2
3
4
5
conda activate dpdev
git clone https://github.com/tensorflow/tensorflow -b v2.0.0 --depth=1
cd tensorflow

./configure

这时候一般来说选默认值敲回车就行,但需注意以下几个选项:

Do you wish to build TensorFlow with CUDA support? [y/N]:Y

如果不需要编译 GPU 版本,这边可以直接用默认值,下面的选项都不会碰到。

Please specify the CUDA SDK version you want to use. [Leave empty to default
to CUDA 10]: 10.1

Please specify the comma-separated list of base paths to look for CUDA
libraries and headers. [Leave empty to use the default]:
/scratch/jz748/cuda-10.1

Please specify a list of comma-separated CUDA compute capabilities you want to
build with.

You can find the compute capability of your device at:
https://developer.nvidia.com/cuda-gpus.

Please note that each additional compute capability significantly increases
your build time and binary size, and that TensorFlow only supports compute

capabilities >= 3.5 [Default is: 3.5,7.0]: 6.0,7.5

这里需要至https://developer.nvidia.com/cuda-gpus查询GPU对应的capanilities,例如P100对应6.0,2080Ti对应7.5。

选项完成后,开始编译:

1
bazel build -c opt --verbose_failures //tensorflow:libtensorflow_cc.so

这里需要等待很长很长很长时间,可以稍作休息,等待编译结束。

1
export tensorflow_root=/scratch/jz748/tf2/libtensorflow_cc

指定 libtensorflow_cc 的安装目录,然后 copy 一大堆文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkdir -p $tensorflow_root/lib/
cp -d bazel-bin/tensorflow/libtensorflow_cc.so* $tensorflow_root/lib/
cp -d bazel-bin/tensorflow/libtensorflow_framework.so* $tensorflow_root/lib/
cp -d $tensorflow_root/lib/libtensorflow_framework.so.2 $tensorflow_root/lib/libtensorflow_framework.so
mkdir -p $tensorflow_root/include/tensorflow
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' bazel-genfiles/ $tensorflow_root/include/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' tensorflow/cc $tensorflow_root/include/tensorflow/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' tensorflow/core $tensorflow_root/include/tensorflow/
rsync -avzh --include '*/' --include '*' --exclude '*.cc' third_party/ $tensorflow_root/include/third_party/
rsync -avzh --include '*/' --include '*' --exclude '*.txt' bazel-tensorflow/external/eigen_archive/Eigen/ $tensorflow_root/include/Eigen/
rsync -avzh --include '*/' --include '*' --exclude '*.txt' bazel-tensorflow/external/eigen_archive/unsupported/ $tensorflow_root/include/unsupported/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' bazel-tensorflow/external/com_google_protobuf/src/google/ $tensorflow_root/include/google/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' bazel-tensorflow/external/com_google_absl/absl/ $tensorflow_root/include/absl/
cd ..

二、编译 DeePMD-kit C++库

TensorFlow 编译完成后,我们来编译 DEEPMD:

1
2
3
4
git clone https://github.com/deepmodeling/deepmd-kit
mkdir deepmd-kit/source/build
cd deepmd-kit/source/build
export deepmd_root=/scratch/jz748/tf2/libdeepmd

此处指定 deepmd 的安装位置。

1
cmake -DUSE_CUDA_TOOLKIT=true -DTENSORFLOW_ROOT=$tensorflow_root -DCMAKE_INSTALL_PREFIX=$deepmd_root ..

注意安装 GPU 版本时才需要 USE_CUDA_TOOLKIT 选项。

1
make -j28 && make install

将 28 改为编译时需要使用的核心数。

1
make lammps

此时会产生 USER-DEEPMD 文件夹。

1
cd ../../..

三、编译 LAMMPS

1
2
3
git clone https://github.com/lammps/lammps -b stable_7Aug2019 --depth=1
cd lammps/src
cp -r ../../deepmd-kit/source/build/USER-DEEPMD/ .

将刚才生成的 USER-DEEPMD 文件夹拷至此处。

1
make yes-user-deepmd

若已有 Intel 编译器环境(建议使用较高版本的 Intel 编译器):

1
2
make yes-user-intel
make intel_cpu_intelmpi -j28

若无 Intel 环境,只有 gcc 和 MPI:

1
make mpi -j28

编译成功后,ls lmp_* -l

-rwxrwxr-x 1 jz748 jz748 6832824 Oct 16 22:19 lmp_intel_cpu_intelmpi

说明已经编译成功,可以直接使用。(测试成功)

2019 年 10 月 9 日微信公众号发

假定已经安装了 Anaconda(建议使用最新版 2019.07),已连接互联网,则

1.安装 tensorflow(如仅需 CPU 版本的 TensorFlow,则将 tensorflow-gpu 改为
tensorflow):

1
python -m pip install tensorflow

Successfully installed google-pasta-0.1.7 keras-applications-1.0.8
opt-einsum-3.1.0 tensorboard-2.0.0 tensorflow-estimator-2.0.0
tensorflow-gpu-2.0.0

2.安装 deepmd-kit v1.0:

1
python -m pip install git+https://github.com/deepmodeling/deepmd-kit

Building wheels for collected packages: deepmd-kit

Building wheel for deepmd-kit (PEP 517) … done

Created wheel for deepmd-kit:
filename=deepmd_kit-1.0.0-cp37-cp37m-linux_x86_64.whl size=268836
sha256=1f5b1149bbf35c0c96c713cc8b607e0626ad0df6451a7

171d4f6b46acc2d4290

Stored in directory:
/tmp/pip-ephem-wheel-cache-zlksq4dl/wheels/a2/80/6c/a26fba79e43199eb4cdba7a3686c5370d3620916f5a0ea23ac

Successfully built deepmd-kit

Installing collected packages: deepmd-kit

Successfully built deepmd-kit

Installing collected packages: deepmd-kit

Successfully installed deepmd-kit-1.0.0

大功告成!现在看一看是否成功安装:

1
dp -h

usage: dp [-h] {train,freeze,test} …

DeePMD-kit: A deep learning package for many-body potential energy

representation and molecular dynamics

optional arguments:

-h, –help show this help message and exit

Valid subcommands:

{train,freeze,test}

train train a model

freeze freeze the model

test test the model

现在,DeePMD-kit v1.0.0 已成功安装。下一期将介绍如何用 DP 编译 LAMMPS。

当我大二上学期裸考数学竞赛,甚至比赛前一天晚上熬夜玩手机没睡觉,我当然没想到,考试的时候能顺风顺水,最后也获了个小奖。

数学竞赛奖状

数学竞赛,全称应该是全国大学生数学竞赛,大二以上可以在学校报名,在每年的10月,一般会与上海市高校计算机等级考试(二级)撞在同一天。形式很简单,就是3小时的考试,非数学类考高等数学,满分100分,按分数高低给奖。值得注意的是,一场考试能给国家级和省级两个证书,国家级的获奖率是25%,省级稍微高一点,但由于最低成本仅仅是一场考试,相比于参加考试的成本,这个获奖率挺高的,比大学生英语竞赛高很多,教务处的推荐指数也达到了最高级别。和数学建模竞赛一样,学校包车,报销报名费,提供培训讲座(虽然我没去过)。

非数学类的试卷包括计算题和填空题,涉及的知识绝对不超过高等数学教材,可能更注重解题技巧但绝对不超纲,往年真题可以在官网下载。根据我的亲身经验,这一比赛的最佳参赛时间就是大二,原因当然是刚学完一年的高等数学,基础扎实,甚至仅凭基础就能应付考试。如果之后参加,由于记忆衰退,必将一年不如一年。如果想提高竞争力,方法很简单:刷真题。题型和风格各届都差不多,甚至还有碰到往届原题的可能。

数学科学学院每年也会开展校级的数学竞赛(今年的比赛似乎就在今天)。我参加了一次,发现与国赛的题型和风格完全不一样,又没原题,获奖率怎么算都感觉很低……当然由于参赛成本不高,还是值得用一个上午的时间参加的。

下期预告

下期将简单介绍一些我获过奖的其它竞赛,比如大夏杯科赛等等毫无技术含量的,或者今天举办的三创赛,这种虽然有技术含量但我真的不懂的……之后就可以讲讲新的专题了,留学申请、科研、创新创业项目、学生工作、各种活动都可以聊一聊。

当我大一初涉数学建模竞赛时,我却没有想过,大四时能在这一类比赛中获得国家级一等奖。

国家一等奖

这一类比赛的特点是,会在指定时间公布一个题目,要求在3-4天内提交一份论文(及支撑材料),论文的内容即建模解决这一题目。

学校竞赛名单里的数学建模类竞赛包括以下赛事:

全国大学生数学建模竞赛,简称国赛。每年9月举行,大约7月时学校会发通知,9月初在数院报名。参赛成功后学校将退还报名费。该比赛分为省级和国家级两级,但只需提交一次作品。省级比赛由市教委主办,国家级比赛由中国工业与应用数学学会主办。省级比赛颁发一、二、三等奖,三等奖几乎等于参与奖,省级一等奖获得者将在复旦大学参与答辩,根据答辩结果决定国家级的奖项的推荐名单,并送北京审核,包括一等奖、二等奖和没有奖。因此,最终获奖情况包括:国一+省一、国二+省一、省一、省二、省三。由于参与奖(省三)的存在,该比赛性价比极高,强烈推荐参加。

美国大学生数学建模竞赛,简称美赛,每年2月举办,需要自己在网站报名(参赛费100刀)。看似是国际性的比赛,实际90%的参赛者来自中国,在中国的存在感远强于其它任何国家。S参赛即可获得,但教务处只奖励H奖以上的奖项,约占参赛总人数的50%,需要自己向院系科创负责人申报。

华东杯大学生数学建模邀请赛,是复旦大学数学科学学院举办的比赛,看似等级很低,但是教务处将之列为省部级比赛。获奖率贼低,如果不是实力无敌,确有血本无归的风险。

校赛和校热身赛,获奖率也特别低。举办时间不定期,甚至出结果的时间也完全看心情,不知之后会不会常态化举办。

国赛获奖,甚至应届毕业生落户上海都有加分,所以甚至有人在知乎上找我,说什么两万求省一……

两万求省一

我曾说过“比赛前不需要准备”,因为在我看来,这一比赛对能力的考查,远大于对知识的考查。比赛中碰到自己熟悉的题目背景的可能性几乎没有,所以掌握资料搜集能力、文献阅读能力(尤其是英文文献)和自学能力,是非常必要的。同时,用数学思维分析问题的能力,用编程解决问题的能力,以及撰写论文的能力,也是必不可少的。

是的,这些能力合起来,不就是科研能力(特别是我这个领域的科研能力)?这就是我在经过大三一年的科研训练后,在大四一开始拿到国一的原因。科研对这些能力的提升是巨大的。关于我的科研经历,另外发文叙述。

不过我想来,最重要的可能还是编程能力。在国赛题目越来越注重编程的情况下,别的能力或许都能边参赛便提高,但三天速成编程应该是不可能事件……

参赛历程

下面转载一下我去年写的参赛历程,首发于知乎:

拿到题后,根据去年的经验,很快决定做B题。一般来说,A题有固定答案,看上去简单实则很难;B题反之。决定做B题后,花了点时间,理清了B题的逻辑。个人感觉这个的模拟,和分子动力学模拟很像,于是提出先写个基于时间步长(timestep)的模拟程序,先用个最简单的策略:谁时间短,即谁最先完成加工,谁就先加工。快马加鞭,当晚便用Python写出了第一版程序,处理第一道工序的问题。

事后才知道,第一晚至少解决了一半的工作。接下来两天,主要在纠结这些事情:

1.有没有更优的策略。首先把只考虑休息的RGV改成考虑所有RGV,效率明显提高。不过我起初以为,这么简单的策略肯定不会是最优策略。后来发现,没有更优秀的策略了……最简单的反而是最好的。查阅了大量中英文文献,表明我们的方法叫动态规划,并且应该没有更优的算法了。知乎某些人说的什么遗传算法没有任何作用……

2.两道工序间怎么传送熟料。是用机械臂还是用传送带呢?题目也没说。第二天写程序的时候一直在纠结这个,最后决定两种程序都写一遍,哪个效率高就用哪个。

3.两道工序的刀具怎么选呢?本来想多试几个,后来想到可以全试一遍,一个for循环就解决了……

4.那个发生故障的概率怎么理解?题目也没说。最后决定我们自己来定义……

5.bugfix,直到确定程序和数据没有任何问题

最后一天全面进入写论文阶段。说起来我们的思想其实相当简单,所以调度策略其实没多少可写的,一句话能讲明白的调度策略硬是被队友写了好几页……模拟思路可写的倒是很多,也写了很多……最后感觉还差几页,就用visio画了张流程图,用python画了几张甘特图,凑凑页数。

下午五点,提前三小时提交,然后就回去休息了。所有内容,包括论文、数据、代码和图片,都已放在GitHub上

当时感觉状态十分良好,我们四天来既没有熬夜也没翘课,还是做得很顺利,毕竟我们的数据摆在那里(并且是用程序自动生成的)。当时的感觉是,至少比去年的奖项要高一点。

10月8日被通知入围答辩,发现大家都是用这种最简单的调度策略emmmmmm,但是我们的数据是最高的,除了因为没有像某些组死抠题目外,另一个原因就是考虑了刀片问题。于是我跟我室友说“这是我三年来离国一最近的一次了”。

和室友的对话

第二天答辩后感觉仍然良好,心里隐隐有一种对国一的期待,不过还是谦虚地跟队友说国二肯定稳了……我们学校国一每队奖5000,国二每队奖3000。于是我们开始考虑奖金怎么花……

结果出来,果然就国一了。还意外地获得了应届生就业落户上海的10分加分,大概就能到达落户的标准线了(虽然我显然并不打算本科毕业后就就业……)。

下期预告

下一期将讲一讲数学竞赛的参赛经历,说起来也没什么技巧可以分享,因为是裸考……