运筹学毕业师兄教你学习运筹学专业

我是在德国某工大学习的这个专业。之前本科为经管,硕士确定方向运筹学。一开始并没有严重的意识到这个专业对数学和编程的看重,加上不太用心,学的可谓磕磕绊绊,惨不忍睹。现在回过头来,大致可以看出一个学习运筹学比较合理的思路和路径。如果你和我一样是经管出身,统计学和高数有一点概念,编程和数理基础并不强,那么这些经验可能会对你有一定帮助

运筹学的课程大概可以分为两类:基础课和进阶课

一.基础课

所谓的基础课,就是如果你不上这门课,就缺少一些基本的相关概念,无法有效率的学习运筹学。

在这个层级里,我认为有两门课是必须的,他们分别是“量化方法”和“编程,算法与数据结构”。

量化方法是运筹学一切的基础,可以理解为运筹学的101。这门课有三大块,分别是图论,线性规划和整数规划。每一部分都讲的比较浅。图论方面介绍了一些基本概念,以及学习了最短路径,Maximale flow和minimal cost flow这些最为基本的问题,以及每个问题的最简单的算法原理。线性规划主要就是介绍了基本概念,单纯形法,Big M和duality等等基本概念,能做一些简单的习题。整数规划只是讲解了最基本模型的建模公式,给了点直觉上的概念,完全没有涉及到解法和变换。顺便还学了一点软件,勉强能用GAMS解个简单的LP模型。

这门课在某大学是本科的课程,地位还蛮重的。还记得刚被某大学录取的时候,就在通知书上要求补这门课,否则无法毕业。当时我还不以为然,心想老子可是在本科修了15个OR相关学分的男人,还怕你区区QM?结果这课还真是和别的学校学的不太一样,图论讲的比较深,很重要。

编程,算法与数据结构是我眼中的另一门基础课。运筹学是否一定要学编程是“有争议”的,我的同学有一些坚决排斥编程语言的,他们一样可以以不错的分数毕业。但实际上如果不会简单的编程,那么对算法的学习就会比别人更慢,体会也会较为浅薄。而且在未来的实践中,如果你的模型稍微复杂,无法用GAMS之类的软件直接实现,那么你将束手无策。而如果你能使用Java,就可以编写复杂的模型并外接上solver(解某些问题的程序),实现自己的模型。

不过我当时并没有意识到这么多,只是因为看到本方向教授招Hiwi都要有编程能力,才选了这课。这门课和量化方法在我们学校是同一个老师上。当时我看到居然有10个学分就欣然选了,心想好歹本科学过腐朽落后的VB.net,区区Java不在话下。

然后我就跪了。

这门课的难点不在于编程,而在于算法和数据结构。由于教授是数学系出身,他对算法的证明非常看重。这门课上下来,你应该能做到了解基本的编程语句和类、接口之类的概念,会用常用的数据结构(如Array,List,堆),同时领会并能够用代码实现简单的查找(如二分查找,AVL树),排序(如QuickSort),最短路径(贝尔曼福德算法),压缩解压缩(霍夫曼树)。你不光要会用这些算法,还要能够证明他们的正确性和时间复杂度。

这些算法有些在运筹学中有直接运用(比如二分查找),有些没有(比如霍夫曼树)。但对这些基本算法的了解,有助于真正明白前人的思维路径,没有足够的算法实例在脑海中支撑,想要理解一些抽象概念(比如启发法)并将来设计自己的算法是不太可能的。

二.进阶课

顺利学好基础课之后,运筹学的大门就已经向你基本敞开了。之后的课程我也还在学习,以下是我上过或正在上的一些课,可以给大家做参考。

Operations Research 1 主要讲解的是整数规划,教授先是用40%的篇幅带领我们熟悉九个常见问题,并带着我们用GAMS来运算这些模型。然后又在理论上阐述了solver是如何算题的,主要就是Branch & Bound和动态规划。之后又开始讲解启发法,教授我们如何不知道如何寻找最优解的时候,一步步向着自己的目标前进,比如K-opt和贪心算法。到了这一步,就已经距离实践问题非常近了。

Scheduling 调度这门课用10个学分的量来较为深入的教授了我们如何处理调度问题。我认为这门课非常运筹学,因为随着需要解决的调度问题越来越复杂,使用的工具和算法也越来越多。比如一开始的单设备排序,可以用很多比较简单粗暴的、凭直觉想也能想出来的原则和算法就能搞定。而到了如计算R|pmtn|Cmax问题,就需要需要线性规划和图论中的Machting结合才能解决——但至少还是可以解决的。之后的一些调度问题就已经完全是NP问题,只能用近似算法来求近似解。后面的一些stochastic情况,每个解法都需要先写个几页纸的定理和证明。如果你像我的某些同学一样前期偷懒,缺少必要的编程算法知识,那么你就会陷入学业地狱中,觉得这TM都是些什么鬼。

Robuste Optimierung 国内翻译成鲁棒优化,名字迷之色情。这门课主要讲的是如果模型中有的部分(变量或条件)是不确定的话,如何取得最优解。例如你有一个输电网络,如果你知道将会随机坏掉一短电线,那么如何布置才能让这种可能发生的损失的损伤最小?这门课据说是实用性最高的一门之一,不过感觉教授讲的还是比较抽象。

Advanced Analytics 这门课严格来说不是纯粹的运筹学,更像是运筹学的交叉学科。我们在建模寻找最优化的时候,是需要已知若干数据的。这门课就讲Data Minning和Simulation。我选了Simulation方向,和队友一起用Netlogo编程实现了一个模型。

这里还推荐大家看看:运筹学入门教程

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: