Julia高性能科学计算(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 线性规划问题

一旦安装了前面提到的JuMP包和优化求解器,我们就能使用Julia很容易地解决LP和MILP问题了。例如,下面的这个LP问题。

max x1+2x2+5x3

其约束条件如下。

x1+x2+3x3≤−5

x1+3x2 −7x3≤10

0≤x1≤10

x2≥0

x3≥0

使用Julia和JuMP,我们可以将其写成下面的代码。

虽然上面的代码非常容易理解,这里还是要解释一下。我们首先声明了一个优化模型的占位符。

并在代码中表明我们想使用GLPK优化求解器,这里称模型为m,之后声明3个变量。

在这段代码中,我们使用JuMP包中的宏@variable。在Julia中,宏为你做重复性的工作。这有些类似于函数,但与之有一些重要的不同之处。具体详见官方文档(参考资料[23])。

我们用另一个宏@objective来设置对象。

并用宏@constraint增加两个约束条件。

注意:constraint1和constraint2是约束条件的名称,这些名称将对获取对应的对偶变量值很有用。

现在对优化问题已经做好了准备。现在就可以打印优化模型,并检查它是怎么写的了,代码如下所示。

解决优化问题,如下所示。

解决了优化问题后,我们可以使用JuMP.value()函数来获取最优条件下的变量值。

在上述代码中,println()是在屏幕上将一些文本输出为单独的一行函数的。如果你不想这样,可以使用print()函数。

要想获取最优对偶变量的值,请调用JuMP.shadow_price(),其对应的约束名称如下所示。

注意:这里还定义了JuMP.dual()函数。但是,JuMP.dual()函数结果的符号不会如你所愿,因为它遵循圆锥曲线二元性的原理。对线性优化问题,JuMP.shadow_price()像大多数标准参考书那样提供了对偶变量值。具体可参考JuMP文档(参考资料[24])和MathOptInterface文档(参考资料[25])中相关的讨论。

在我的机器上,Gurobi的输出如下所示。

如果你想使用Gurobi优化器而不是GLPK,请使用下面的输入。

如果使用CPLEX,则用下面的输入。

JuMP包还支持很多其他的优化求解器,具体见JuMP手册(参考资料[26])。