MATLAB API 概述#
模型#
我们的Gurobi MATLAB接口使您能够表达以下形式的问题:
最小化 |
\(x^TQ x+ c^Tx + \mathrm{alpha}\) |
|
受限于 |
\(Ax = b\) |
(线性约束) |
\(\ell \le x \le u\) |
(边界约束) |
|
一些 \(x_j\) 积分 |
(完整性约束) |
|
\(x^TQc\, x + q^Tx \le \mathrm{beta}\) |
(二次约束) |
|
一些 \(x_i\) 在 SOS 中 |
(特殊有序集约束) |
|
最小值, 最大值, 绝对值, 或, … |
(一般约束) |
模型存储为struct
变量,每个变量由多个字段组成。这些字段捕获了上面列出的不同模型组件。许多这些模型组件是可选的。例如,可以省略完整性约束。
优化模型可以从文件加载(使用gurobi_read
函数),也可以通过填充模型变量的适当字段来构建(使用标准的MATLAB结构)。我们将在model参数部分讨论模型如何表示的详细信息。
我们经常提到优化模型的类别。在最高层次上,模型可以是连续的或离散的,这取决于模型中存在的建模元素是否需要做出离散决策。在连续模型中…
具有线性目标函数、线性约束和连续变量的模型称为线性规划(LP)。
如果目标是二次的,模型就是二次规划(QP)。
如果任何约束是二次的,模型就是二次约束规划(QCP)。我们有时会提到QCP的一些特殊情况:具有凸约束的QCP、具有非凸约束的QCP、双线性规划,以及二阶锥规划(SOCP)。
如果任何约束是非线性的(从可用的通用约束中选择),则该模型是一个非线性规划(NLP)。
一个包含任何整数变量、半连续变量、半整数变量、特殊有序集(SOS)约束或一般约束的模型是离散的,被称为混合整数规划(MIP)。MIP的特殊情况,即我们已经描述的连续模型类型的离散版本,是…
混合整数线性规划 (MILP)
混合整数二次规划 (MIQP)
混合整数二次约束规划 (MIQCP)
混合整数二阶锥规划 (MISOCP)
混合整数非线性规划 (MINLP)
Gurobi优化器处理所有这些模型类别。请注意,它们之间的界限并不像人们希望的那样清晰,因为我们通常能够将一个模型从一个类别转换为一个更简单的类别。
解决模型#
一旦你构建了一个模型,你可以调用gurobi
来计算一个解决方案。默认情况下,gurobi
将使用并发优化器来解决LP模型,使用屏障算法来解决具有凸约束的QP模型和QCP模型,并使用分支切割算法来解决混合整数模型。解决方案将作为struct
变量返回。我们将在讨论gurobi
函数时详细讨论优化结果的表示方式。
这是一个在MATLAB API中可能使用的简单命令序列示例:
model = gurobi_read('examples/data/stein9.mps');
result = gurobi(model);
多解和多目标#
默认情况下,Gurobi优化器假设您的目标是找到一个具有单一目标函数的模型的证明最优解。Gurobi提供了允许您放宽这些假设的功能。您应该参考解决方案池部分以了解如何请求多个解决方案,或参考多目标部分以了解如何指定多个目标函数并控制它们之间的权衡。这两个功能也分别在示例poolsearch.m和multiobj.m中进行了讨论。
不可行模型#
如果发现模型不可行,您有几个选择。您可以尝试诊断不可行的原因,尝试修复不可行性,或者两者都做。为了获取有助于诊断不可行原因的信息,可以调用gurobi_iis
来计算一个不可约不一致子系统(IIS)。此方法可用于连续和MIP模型,但您应该注意,MIP版本可能非常昂贵。我们将在gurobi_iis
函数文档中讨论IIS结果如何表示的详细信息。
为了尝试修复不可行性,调用
gurobi_feasrelax
来计算模型的可行性松弛。这种松弛允许你找到一个最小化约束违反幅度的解决方案。
你可以在章节
放松以实现可行性中找到关于此功能的更多信息。
管理参数#
Gurobi优化器提供了一组参数,允许您控制优化过程的许多细节。诸如可行性和最优性容差、算法选择、探索MIP搜索树的策略等因素,都可以通过在开始优化之前修改Gurobi参数来控制。
每个Gurobi参数都有一个默认值。所需的参数更改通过struct
变量传递。此结构体中的每个字段的名称必须是Gurobi参数的名称,关联的值应该是该参数的所需值。您可以在参考手册中找到可用Gurobi参数的完整列表。我们将在params参数部分提供有关更改参数设置的更多详细信息。
请参考params.m中的示例。
监控进度#
优化的进度可以通过Gurobi日志进行监控。默认情况下,Gurobi会将输出发送到屏幕。有一些简单的控制可用于修改默认的日志行为。如果您希望将输出同时定向到文件和屏幕,请将日志文件参数设置为您所需的日志文件的名称。日志输出的频率可以通过DisplayInterval参数进行控制,并且可以通过OutputFlag参数完全关闭日志。有关Gurobi日志文件的详细描述可以在参考手册的日志记录部分找到。
错误处理#
如果不成功,Gurobi MATLAB接口的方法将显示错误代码和错误信息。可能的错误代码列表可以在参考手册中的错误代码表中找到。
环境和许可证参数#
默认情况下,各种Gurobi函数会寻找有效的许可证文件并创建本地Gurobi环境。该环境在相应的MATLAB API函数运行期间存在,并在完成后释放。
另一个选项是通过可选的params
参数(也可以通过struct
)提供许可参数。此参数允许您在Gurobi计算服务器、Gurobi即时云或使用Gurobi集群管理器上解决给定的问题。我们将在params参数部分进一步讨论此主题。
Gurobi 将检查当前工作目录中是否存在名为 gurobi.env
的文件,如果存在,它将尝试从此文件中读取参数设置。该文件应为 PRM 格式(简而言之,每行应包含一个参数名称,后跟该参数的所需值)。