7.5. JuMP 的建模与优化¶
JuMP 是一个基于 Julia 编程语言的开源建模工具,专为数学优化而设计。它提供了一个高效、可扩展的平台,用于定义和求解线性规划、混合整数规划、二次规划、非线性规划等各种优化问题。
目前,MindOpt 可对在 Windows/Linux/OSX 平台上通过 JuMP 建立的 线性规划模型 进行求解。关于 JuMP 的更多详细内容,请参考 JuMP 官方文档库。
在本节中,我们将介绍如何使用 JuMP 来建立 线性规划问题示例 中的优化问题,并调用 MindOpt 求解。
7.5.1. 安装 JuMP¶
用户需首先安装 MindOpt。关于 MindOpt 的安装与配置请参考 单机版安装。MindOpt 安装后,用户需要自行下载和配置 JuMP 环境,参考以下步骤:
- 第1步: 安装 Julia
访问 Julia 官方网站: https://julialang.org/downloads/。
下载与您的操作系统兼容的 Julia 版本。选择您想要的版本(建议使用最新的稳定版本)。
启动下载的安装程序并遵循指示完成安装。
一旦安装完成,在命令行执行 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))