7.5. JuMP 的建模与优化

JuMP 是一个基于 Julia 编程语言的开源建模工具,专为数学优化而设计。它提供了一个高效、可扩展的平台,用于定义和求解线性规划、混合整数规划、二次规划、非线性规划等各种优化问题。

目前,MindOpt 可对在 Windows/Linux/OSX 平台上通过 JuMP 建立的 线性规划模型 进行求解。关于 JuMP 的更多详细内容,请参考 JuMP 官方文档库

在本节中,我们将介绍如何使用 JuMP 来建立 线性规划问题示例 中的优化问题,并调用 MindOpt 求解。

7.5.1. 安装 JuMP

用户需首先安装 MindOpt。关于 MindOpt 的安装与配置请参考 单机版安装MindOpt 安装后,用户需要自行下载和配置 JuMP 环境,参考以下步骤:

第1步: 安装 Julia
  1. 访问 Julia 官方网站: https://julialang.org/downloads/

  2. 下载与您的操作系统兼容的 Julia 版本。选择您想要的版本(建议使用最新的稳定版本)。

  3. 启动下载的安装程序并遵循指示完成安装。

  4. 一旦安装完成,在命令行执行 Julia。它会打开一个 Julia 的命令行交互界面。

第2步: 安装 JuMP 包

在 Julia 命令行中,您可以通过内置的包管理器来安装 JuMP 包。请按照以下步骤操作:

using Pkg
Pkg.add("JuMP")

这将自动下载和安装 JuMP 包及其依赖项。安装完成后,您可以通过使用 using JuMP 命令在 Julia 项目中导入它。

第3步: 安装 AmplNLWriter 包

同样地,您可以通过 Julia 的包管理器安装 AmplNLWriter 包。在 Julia 命令行中,执行以下命令:

Pkg.add("AmplNLWriter")

安装完成后,您可以使用 using AmplNLWriter 来使用它。

关于 JuMP 的详细安装方式,请参考 JuMP Installation

7.5.2. JuMP 调用接口

现在您已经安装了 JuMP 和 AmplNLWriter,可以开始在 Julia 中创建和求解优化模型了。首先你需要在 Julia 导入 JuMP 和 AmplNLWriter 模块。

1using AmplNLWriter, JuMP

然后,我们需要调用 JuMP API 来创建模型对象,并指定使用 mindoptampl 作为求解器。

9model = Model(() -> AmplNLWriter.Optimizer(mindoptampl))

接着,我们调用 JuMP API 来建立 线性规划问题示例 中的优化问题。关于 JuMP API 的详细说明,请参考 JuMP 官方文档API

10@variable(model, 0 <= x0 <= 10)
11@variable(model, x1 >= 0)
12@variable(model, x2 >= 0)
13@variable(model, x3 >= 0)
14@objective(model, Min, x0 + 2x1 + x2 + x3)
15@constraint(model, c1, x0 + x1 + 2x2 + 3x3 >= 1)
16@constraint(model, c2, x0 - x2 + 6x3 == 1)

最后,调用 JuMP 的求解函数 optimize!() 进行求解,并获取相关的结果:

17optimize!(model)
18println("Optimal objective value is: ", objective_value(model))
19println("x0 = ", value(x0))
20println("x1 = ", value(x1))
21println("x2 = ", value(x2))
22println("x3 = ", value(x3))

7.5.2.1. Linux和macOS上执行

我们在安装路径 <MDOHOME>/<VERSION>/examples/jump 下提供了示例文件。执行以下指令运行示例代码以完成优化求解:

cd <MDOHOME>/<VERSION>/examples/jump
julia jump_lp_ex1.jl

7.5.2.2. Windows平台上执行

我们在安装路径 <MDOHOME>\<VERSION>\examples\jump 下提供了示例文件。执行以下指令运行示例代码以完成优化求解:

cd <MDOHOME>\<VERSION>\examples\jump
julia jump_lp_ex1.jl

7.5.3. 建模示例: jump_lp_ex1

文件链接 jump_lp_ex1.jl 中提供了完整代码:

 1using AmplNLWriter, JuMP
 2
 3mindopt_home = ENV["MINDOPT_HOME"]
 4mindoptampl = joinpath(mindopt_home, "osx64-x86", "bin", "mindoptampl")
 5if Sys.iswindows()
 6    mindoptampl *= ".exe"
 7end
 8
 9model = Model(() -> AmplNLWriter.Optimizer(mindoptampl))
10@variable(model, 0 <= x0 <= 10)
11@variable(model, x1 >= 0)
12@variable(model, x2 >= 0)
13@variable(model, x3 >= 0)
14@objective(model, Min, x0 + 2x1 + x2 + x3)
15@constraint(model, c1, x0 + x1 + 2x2 + 3x3 >= 1)
16@constraint(model, c2, x0 - x2 + 6x3 == 1)
17optimize!(model)
18println("Optimal objective value is: ", objective_value(model))
19println("x0 = ", value(x0))
20println("x1 = ", value(x1))
21println("x2 = ", value(x2))
22println("x3 = ", value(x3))