0%

数学建模协作方法论

数学建模比赛是本、硕学生参加频次较高一个比赛,其奖项也具有一定的含金量。笔者在研究生期间参加过两次华为杯数模,先后得到二等奖和一等奖。本文会结合笔者自身经验,并从一个开发者的角度,分享该以怎样的工作流来提高团队合作的效率。

本文同步发表公众号:QiangZiBro和我的博客https://qiangzibro.com,欢迎关注!

简而言之,笔者推荐的数模合作方式概述为以下四点

  • 每人各做1或2道题
  • 使用Latex作为论文格式支持,使用VSCode作为论文编辑工具
  • 使用Git做版本控制,Github作为同步源
  • 在各自分支上进行论文写作,由队长最后合并到主分支

下面,我们来抽枝剥茧地看细节。

1. 每人各做1或2道题

传统的编程+建模+写作三人分工模式将这三样工作割裂开来,造成的问题是编程等建模,写作等编程这样一个尴尬局面。

笔者建议每人都应该具有了解他人工作的能力,不要将几种能力独立开来。

比赛开始时,队友间相互讨论、协商,每人各选一道题,能力强者可以选两题进行求解。毕竟,多人同时求解的多线程操作,不太会造成最后一题没时间做的情况。

2. 使用Latex+VSCode进行你的论文写作

排版是论文最后得分高低的一个重要因素,但也是最令人头疼的问题。建议使用Latex进行论文写作,直接参考模板写作即可。

要使用Latex,需要下载安装支持Latex的Latex编译器。Latex编译器的下载和Latex语法网上有大量教学,这里不再赘述。在你的电脑下载安装Latex编译器后,能够将Latex文本转为PDF文本。

使用VSCode进行Latex文本编辑。在VSCode这个神奇的编辑器中,有个叫Latex Workshop的插件,能调用Latex编译器一键编译并显示PDF文件。建议参考南开大学程明明老师的学术论文写作[1]了解详细操作,也可参考[3]。

使用Latex还有一个好处是,便于做版本控制。不像Word,Latex文件本身是纯文本,能够轻松地做版本控制。

关于数学建模的Latex模板,网上有很多,以2020研究生数学建模为例[2]

1
2
git clone https://github.com/latexstudio/GMCMthesis 
cd GMCMthesis

笔者在2020年数学建模用的就是这个模板,在Windows下可以直接使用,在Mac下的VSCode编译时,自动提醒我下载了两种字体后,才能使用。

3. 使用Git做版本控制

为什么要做版本控制?讲个恐怖故事:小明在比赛结束前一天将辛辛苦苦写的论文误删除了,并且是不可恢复的删除,于是小明顶着崩溃的心情在最后的时间又重写了一篇出来。

这个故事是真的,就发生在我身边。

由此可见版本控制+多地存储的重要性。使用Git对每一次小改动做提交,并及时push到你的Github或者Gitee仓库,就算你的电脑烧了也能从远程找回些东西出来。

4. 多人协作分支策略

使用Git多分支管理,共同协作一个私有的Github/Gitee仓库。主分支(master或者main分支)作为稳定的最终版本,每人在初始点的模板引出一个分支,并推到自己的分支上,由一人做最后的分支合并。

具体流程如下,比如我是队长,同时要写文章,用下列命令,从模板新引出一个分支出来

1
git checkout -b dev_captain

队员小明也引出一个分支

1
git checkout -b dev_ming

假设模板如下

1
2
3
4
## chapter 1
## chapter 2
## chapter 3
## reference

在分支dev_captain上,我对第1,3章节做了大量修改后,并push到自己的远程分支

1
2
3
4
5
6
## chapter 1
大量修改 captain
## chapter 2
## chapter 3
大量修改 captain
## reference

在分支dev_ming上,小明也对第2章节进行大量修改

1
2
3
4
5
## chapter 1
## chapter 2
小明 大量内容
## chapter 3
## reference

将这两份内容直接合并到主分支非常简单,因为我们只在自己的对应章节进行了更新,Git能够自动将其合并成一个整体。例如,分支管理者进行操作如下:

1
2
3
4
git fetch -a # 从远程更新
git checkout master
git merge dev_captain
git merge dev_ming

再次看我们点的论文,也就变成了

1
2
3
4
5
6
7
## chapter 1
大量修改 captain
## chapter 2
小明 大量内容
## chapter 3
大量修改 captain
## reference

分支冲突

遇到分支冲突不要怕,首先要明白为什么会有分支冲突:两个分支版本在同一块区域进行了不同的改动,Git不能确定到底要保留哪块内容,于是要求你改完后再次进行提交。还是上面的例子,我在reference章节下添加了两个参考

1
2
3
4
...
## reference
- refer 1
- refer 2

小明在reference章节下也添加了两个参考

1
2
3
4
...
## reference
- refer 1
- refer 3

将两个分支合并到主分支时,出现

1
2
3
Auto-merging example.txt
CONFLICT (content): Merge conflict in example.txt
Automatic merge failed; fix conflicts and then commit the result.

这意味着产生了冲突,打开这个文件

1
2
3
4
5
6
7
8
9
10
...
## reference
<<<<<<< HEAD
- refer 1
- refer 3
=======
- refer 1
- refer 2
>>>>>>> dev_captain

可以看到<<<<<<< HEAD>>>>>>> dev1中间包围的部分就是冲突内容,=======上下是各自分支的内容。我们将这个区域的内容改成我们想要的样子,比如说想要1、2、3,那就只需要删掉重复的- refer 1

1
2
3
4
5
6
<<<<<<< HEAD
- refer 1
- refer 3
=======
- refer 2
>>>>>>> dev_captain

再微调一下,并删掉<<<<<<< HEAD>>>>>>> dev_captain=======,如下

1
2
3
- refer 1 
- refer 2
- refer 3

再次提交

1
2
3
git add .
git commit -m "解决了参考文献的冲突"
git push origin main

至此,分支冲突解决。

课后作业:多人合作有时候会产生合并冲突,你会采取怎样约束,让冲突少产生、或者不产生?

Hint:

  • 本文提供的Latex模板仓库,没有忽略掉编译产生的中间文件,这些文件不应该被提交
  • Git能够自动识别合并不同区域

也许没有完美的方法,但一定有更适合你们的方法,希望本文能给即将参加数学建模的你们带来帮助,祝好运✨

参考

[ 1 ] : https://mmcheng.net/writing/

[ 2 ] : https://github.com/latexstudio/GMCMthesis

[ 3 ] : https://zhuanlan.zhihu.com/p/38178015

欢迎关注我的其它发布渠道