
1.1 什么是Julia及为什么要使用Julia
Julia是一门非常新的语言,它主要擅长科学计算。开发Julia,是为了使科学计算更有趣、更高效。在计算机科学家和软件工程师看来,Julia语言有很多优点,你可以在官网(见参考资料[2])上了解这些。
这里援引了Julia的创造者在第一篇官方博客文章《为什么我们创造Julia》(见参考资料[3])中的一段话。
“我们想要一种自由的、开源的语言。它要像C语言(以下简称C)一样快速,同时要有像Ruby那样的动态语言的特性;要具有Lisp般的元编程能力而又有MATLAB那样的数学符号输入;要像Python般通用、像R般在统计分析上得心应手、像Perl般自然地处理字符串、像MATLAB般有强大的线性代数运算能力、像Shell般具有‘胶水语言’的进程管理能力;它要易于学习而又不让真正的极客感到无聊;还有,它应该是交互式的,同时又是编译型的……”
这就是Julia被创造的原因,用来满足以上所有这些“贪婪的”愿望。
下面我来讲讲我的故事。在念研究生之前我做了几年Java开发工作。我的第一份计算机家庭作业和课程项目自然是用Java写的。在此之前,我本科的计算机家庭作业是用C写的。上研究生不久,我开始用MATLAB,这主要是因为实验室的其他研究生都在用MATLAB。我需要向他们学习,所以用了MATLAB。
我喜欢MATLAB。它不像Java和C,不需要在使用之前声明每一个变量,在MATLAB里,变量可以直接使用。数组也不只是计算机内存里的数组,数组在MATLAB中像向量和矩阵。同时,计算结果绘图也容易。对建模优化问题,我使用GAMS,并与CPLEX这样的求解器相连。虽然MATLAB-GAMS-CPLEX链也能满足我的需求,但我不喜欢GAMS的语法——当时我不能完全理解这些语法——而且GAMS和MATLAB接口的速度很慢。尽管CPLEX提供与C、Java、Python的全面连接,但它与MATLAB却只有基本的连接(不够用)。
当我研究生毕业时,我认真考虑过是否要使用Python。它过去是,现在仍然是很多计算学家的一个普遍的选择。CPLEX对Python的支持好过对MATLAB的支持。与MATLAB不同,Python是免费开源软件。然而,当时我没有转向Python,而是决定继续使用MATLAB。我个人不喜欢把0作为数组的首索引,就像C和Java里那样。在Python里,首索引也是0。而在MATLAB里,首索引用的是1。例如,假设我们有这样一个向量(为尽量保持原书的风格,本书中的矩阵、向量、字典、链接、节点等的名称的样式将与原书保持一致)。

在MATLAB里会被记成如下这样。

向量的首元素应该用v(1)而不是用v(0)来访问。第i个元素必须是v(i),而不是v(i-1)。因此我继续使用MATLAB。
2012年,有人向我介绍Julia语言,它很吸引我,因为至少数组索引是从1开始的。做了一番调查研究后,我当时并没有转向Julia。因为它当时对建模和求解器优化的支持太烂了。于是我继续使用MATLAB。
2014年,我偶尔又读了几篇讲Julia的博客文章和推特,我又更多地了解了Julia。于是发现了一个Julia建模优化问题的包,叫作JuMP(Julia for Mathematical Programming,即数学编程Julia)。研究了几个小时之后,我就爱上了JuMP,于是决定转向Julia,这主要是为了使用JuMP。下面是我解决网络优化问题的部分代码。

这简直是下面的数学语言的直接“翻译”。

其约束条件如下。

我认为这是非常明显的“翻译”。特别漂亮,对不对?
CPLEX和它的竞品Gurobi通过JuMP与Julia的连接也都很顺畅。我还有什么可犹豫的呢?现在,我已经使用Julia这么多年,我仍然热爱它——我甚至为它写了本书。