Engee 文档
Notebook

解决优化问题的算法

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

JuMP.jl是一个开源库。该库实现了一种代数建模语言,允许用户使用各种求解器提出并解决各种优化问题。

库的安装

如果您的环境没有安装最新版本的JuMP 软件包,请取消注释并运行下面的方框:

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

要在安装完成后启动新版本的程序库,请单击 "我的账户 "按钮:

screenshot_20240710_134852.png 然后点击 "停止 "按钮:

screenshot_20240710_2.png

按下 "Start Engee "按钮重新启动会话:

screenshot_20240710_135431.png

解决问题的算法

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

  1. 连接库JuMP
  2. 选择并连接求解器库、
  3. 创建优化问题 变量声明 制定目标函数
  4. 设定条件 解决问题
  5. 得出结果 分析结果。

任务描述

在本例中,我们将找出变量 xy 的值,使线性目标函数的值尽可能小: $$F = 13x + 22y \rightarrow min$$ 给定以下条件 $$3x + 8y >= 20 Условие 1$$ $$6x + 10y <= 100 Условие 2$$ 我们还将为变量 xy 的值指定以下边界: $$x >= 1$$ $$0 <= y <= 20$$

解决问题

连接图书馆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.5.1 [date: 1970-01-01, git hash: 93f1876e4]
Copyright (c) 2023 HiGHS under MIT licence terms
Presolving model
2 rows, 2 cols, 4 nonzeros
2 rows, 2 cols, 4 nonzeros
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
HiGHS run time      :          0.00

输出找到的 xy 的最佳值:

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

输出求解器结果的状态:

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

OPTIMAL**状态意味着求解器找到了问题的全局最优解。

结论

在本例中,我们介绍了使用JuMPHiGHS 库解决基本优化问题的算法。通过JuMP 库,您可以提出优化问题、设定条件并使用用户定义的求解器求解。您可以在我们的课程优化基础中了解JuMP 库的实际应用。