Engee 文档
Notebook

求解优化问题的算法

在本例中,我们将考虑使用库求解优化问题的标准算法。 JuMP.

[JuMP.jl](https://github.com/jump-dev/JuMP.jl)是一个开源库。 该库实现了代数建模语言,允许用户使用各种求解器来制定和解决广泛的优化问题。

安装库

如果您的环境中未安装最新版本的软件包 JuMP,取消注释并运行下面的单元格:

In [ ]:
Pkg.add(["JuMP", "HiGHS"])

解决问题的算法

使用以下方法求解优化问题的算法 JuMP 它包括几个系统的步骤,从任务的制定到获得和解释结果。 以下是解决问题的标准算法:

  1. 连接图书馆 JuMP
  2. 选择和连接求解器库,
  3. 创建优化任务,
  4. 变量声明,
  5. 目标函数的制定,
  6. 条件的制定,
  7. 解决问题,
  8. 结果输出,
  9. 结果的分析。

任务说明

在这个例子中,我们将找到变量xy的值,这将导致线性目标函数的最小可能值。:

须符合下列条件:

我们还将定义变量xy的值的以下边界:

解决问题

连接库 JuMP:

In [ ]:
using JuMP;

在此示例中,我们使用求解器库HiGHS.jl。 连接库 HiGHS:

In [ ]:
using HiGHS;

使用函数创建优化任务 Model() 并在括号中指定求解器的名称。:

In [ ]:
optimization_problem = Model(HiGHS.Optimizer)
Out[0]:
A JuMP Model
├ solver: HiGHS
├ objective_sense: FEASIBILITY_SENSE
├ num_variables: 0
├ num_constraints: 0
└ Names registered in the model: none

使用宏 @variable 来确定决策变量。 指定变量xy值的边界:

In [ ]:
@variable(optimization_problem, x >= 1);
@variable(optimization_problem, 0 <= y <= 20);

使用宏设置要优化的目标函数 @objective:

In [ ]:
@objective(optimization_problem, Min, 13x + 22y);

设置使用宏求解优化问题的第一个条件 @constraint:

In [ ]:
@constraint(optimization_problem, c1, 3x + 8y >= 20)
Out[0]:
$$ 3 x + 8 y \geq 20 $$

设置求解优化问题的第二条件:

In [ ]:
@constraint(optimization_problem, c2, 6x + 10y <= 100)
Out[0]:
$$ 6 x + 10 y \leq 100 $$

解决优化问题:

In [ ]:
optimize!(optimization_problem)
Running HiGHS 1.11.0 (git hash: 364c83a51e): Copyright (c) 2025 HiGHS under MIT licence terms
LP   has 2 rows; 2 cols; 4 nonzeros
Coefficient ranges:
  Matrix [3e+00, 1e+01]
  Cost   [1e+01, 2e+01]
  Bound  [1e+00, 2e+01]
  RHS    [2e+01, 1e+02]
Presolving model
2 rows, 2 cols, 4 nonzeros  0s
2 rows, 2 cols, 4 nonzeros  0s
Presolve : Reductions: rows 2(-0); columns 2(-0); elements 4(-0) - Not reduced
Problem not reduced by presolve: solving the LP
Using EKK dual simplex solver - serial
  Iteration        Objective     Infeasibilities num(sum)
          0     1.3000046544e+01 Pr: 1(17) 0s
          1     5.9750000000e+01 Pr: 0(0) 0s
Model status        : Optimal
Simplex   iterations: 1
Objective value     :  5.9750000000e+01
P-D objective error :  0.0000000000e+00
HiGHS run time      :          0.00

打印找到的xy的最佳值:

In [ ]:
println("Оптимальное значение x: ", value(x))
println("Оптимальное значение y: ", value(y))
Оптимальное значение x: 1.0
Оптимальное значение y: 2.125

显示求解器结果的状态:

In [ ]:
task_status = termination_status(optimization_problem)
println("Статус: ", task_status)
Статус: OPTIMAL

OPTIMAL状态表示求解器已找到问题的全局最优解。

结论

在这个例子中,我们分析了使用库求解基本优化问题的算法。 JuMPHiGHS. 图书馆 JuMP 允许您制定优化问题,设置条件,并使用用户定义的求解器求解。 您可以熟悉库的实际应用。 JuMP 在我们的课程[优化基础](https://engee.com/helpcenter/stable/ru/courses/optimization-course.html )。