C API概述


C API概述

本节介绍Gurobi C接口。本手册首先对界面中的功能进行快速概述,然后继续所有可用接口例程的详细描述

如果您对Gurobi优化器是新手,我们建议您从快速入门指南或者是例子之旅.这些文档提供了如何使用这里描述的例程的具体示例。

环境

使用Gurobi C优化器的第一步是创建一个环境,使用GRBloadenv调用。环境充当与一组优化运行相关联的所有数据的容器。您通常只需要在程序中使用一个环境,即使您希望使用多个优化模型。一旦你完成了一个环境,你应该调用GRBfreeenv释放关联资源。狗万app足彩

对于更高级的用例,您可以使用GRBemptyenv例程创建一个未初始化的环境,然后以编程方式设置针对特定需求的所有必需选项。欲了解更多细节,请参阅环境部分。

模型

您可以在一个环境中创建一个或多个优化模型。一个模型包括一组变量,一个线性的,二次的,或分段线性的目标函数对这些变量和一组约束。每个变量都有一个相关的下界、上界、类型(连续、二进制、整数、半连续或半整数)和线性目标系数。每个线性约束都有一个关联的意义(小于或等于、大于或等于或等于)和右侧值。指本节有关变量和约束的更多信息。

优化模型可以通过GRBloadmodel例程,或通过首次调用递增构建GRBnewmodel然后调用GRBaddvars添加变量和GRBaddconstrGRBaddqconstrGRBaddsos,或任何GRBaddgenconstrXxx方法添加约束。模型是动态实体;您总是可以添加或删除变量或约束。

特定的变量和约束在整个Gurobi C接口中使用它们的索引来引用。随着变量以连续的方式添加到模型中,变量索引被分配。约束条件也是如此。按照C语言的惯例,索引都从0开始。

我们经常提到一个优化模型。一个具有线性目标函数、线性约束和连续变量的模型是线性规划(LP).如果目标是二次型,则模型为a二次规划(QP).如果任何约束条件是二次的,则模型为aQuadratically-Constrained计划(QCP).我们有时会提到一些QCP的特殊情况:带凸约束的QCP,带非凸约束的QCP,双线性程序,二阶圆锥程序(SOCP).如果模型包含任何整数变量、半连续变量、半整数变量、特殊有序集约束或一般约束,则该模型为混合整数程序.我们有时还会讨论MIP的特殊情况,包括混合整数线性规划(MILP)混合整数二次规划混合整数二次约束程序,混合整数二阶圆锥程序(MISOCP).Gurobi优化器处理所有这些模型类。

解决一个模型

一旦建立了模型,就可以调用GRBoptimize计算一个解。默认情况下,GRBoptimize ()将使用并发优化器求解LP模型时,采用障碍算法求解带有凸目标的QP模型和带有凸约束的QCP模型,采用分支切割算法求解。解决方案存储为一组属性的模型。C接口包含一组用于查询这些属性的扩展例程。

Gurobi算法小心地跟踪模型的状态,因此调用GRBoptimize ()将只执行进一步优化,如果相关数据已经改变,自模型上次优化。如果您想放弃以前计算的解决方案信息,并在不更改模型的情况下从头重新启动优化,可以调用GRBreset

在解决了MIP模型后,您可以调用GRBfixmodel来计算相关的固定模型。除了整数变量固定于MIP解决方案中的值外,该模型与原始模型相同。如果您的模型包含SOS约束,那么这些约束中出现的一些连续变量也可能是固定的。在某些应用程序中,在这个固定模型上计算信息可能是有用的(例如,双变量、敏感性信息等),尽管您应该小心地解释这些信息。

多种解决方案、目标和场景

默认情况下,Gurobi优化器假定您的目标是用单个目标函数为单个模型找到一个经过验证的最佳解决方案。Gurobi提供了以下特性,允许您放松这些假设:

  • 溶液池:让你找到更多的解决方案。
  • 多个场景:允许您找到多个相关模型的解决方案。
  • 多个目标:指定多个目标函数,并控制它们之间的权衡。

不可行模型

如果一个模型被发现是不可行的,你有几个选择。您可以尝试诊断不可行的原因,尝试修复不可行的原因,或两者兼有。为了获得有用的信息,可以诊断一个不可行的原因,呼叫GRBcomputeIIS计算不可约不一致子系统(IIS)。这个例程可以用于连续和MIP模型,但是您应该知道MIP版本可能非常昂贵。这个例程填充一组IIS属性。

试图修复一个不可行的,打电话GRBfeasrelax计算模型的可行性松弛。这种松弛允许您找到一个解决方案,将违反约束的程度降到最低。

查询和修改属性

与Gurobi模型关联的大部分信息都存储在一组属性中。一些属性与模型的变量相关联,一些属性与模型的约束相关联,还有一些属性与模型本身相关联。举一个简单的例子,求解一个优化模型会导致X要填充的变量属性。属性,如X由Gurobi优化器计算的数组不能被用户直接修改,而其他的,如变量下界数组(属性)。

Gurobi C接口包含一组用于查询或修改属性值的例程。用于特定属性的确切例程取决于属性的类型。正如前面提到的,属性可以是变量属性、约束属性或模型属性。变量和约束属性都是数组,并使用一组数组属性例程。模型属性是标量,并使用一组标量例程。属性值还可以是某种类型字符int,或字符串(真的char *).

标量模型属性通过一组GRBget * attr ()例程(例如,GRBgetintattr).另外,那些可以由用户直接设置的模型属性(如客观意义)可以通过GRBset * attr ()例程(例如,GRBsetdblattr).

通过三组例程访问数组属性。第一盘GRBget * attrarray ()例程(例如,GRBgetcharattrarray)返回属性数组的连续子数组,使用第一个成员的索引和所需子数组的长度指定。第二组是GRBget * attrelement ()例程(例如,GRBgetcharattrelement)从属性数组返回单个条目。最后,GRBget * attrlist ()例程(例如,GRBgetdblattrlist)检索索引列表的属性值。

方法修改可以由用户设置的数组属性GRBset * attrarray ()GRBset * attrelement (),GRBset * attrlist ()例程。

完整的Gurobi属性列表可以在属性部分。

附加模型修改信息

对现有模型的大多数修改都是通过属性接口完成的(例如,对变量边界、约束右侧的更改,等等)。主要的例外是对约束本身的修改,以及对目标函数的二次和分段线性部分。

约束矩阵可以通过几种方式进行修改。首先是打电话GRBchgcoeffs改变单个矩阵系数。此例程可用于修改现有非零值、将现有非零值设置为零或创建新的非零值。当你移除约束时,约束矩阵也会被修改GRBdelconstrs)或变量(通过GRBdelvars).与删除的约束或变量相关联的非零值将随约束或变量本身一起删除。

二次目标项被添加到目标函数中GRBaddqpterms例行公事。您可以在一次调用中添加一个二次项列表,也可以通过多次调用递增地添加项。的GRBdelq例程允许您从模型中删除所有二次项。请注意,二次模型通常同时包含二次项和线性项。函数输入和修改线性项Obj属性,与处理纯线性目标函数模型的方法相同。

如果你的变量具有分段线性目标,你可以使用GRBsetpwlobj例行公事。对每个相关变量调用一次这个例程。Gurobi单形求解器包括对凸分段线性手机万博登录目标函数的算法支持,因此对于连续模型,您应该看到使用该特性带来的显著性能效益。要清除先前指定的分段线性目标函数,只需设置Obj属性将相应的变量设置为0。

懒惰的更新

关于Gurobi优化器中的模型修改,需要注意的一个重要事项是,它是在一个懒惰的时尚,意味着修改不会立即影响模型。相反,它们被排队并稍后应用。如果您的程序只是创建一个模型并解决它,您可能永远不会注意到这种行为。但是,如果您在应用修改之前询问关于模型的信息,则延迟更新方法的细节可能与您相关。

正如我们刚才提到的,模型修改(边界更改、右侧更改、目标更改等)被放置在队列中。这些排队的修改可以以三种不同的方式应用于模型。第一个是通过显式调用GRBupdatemodel.第二种是通过呼叫GRBoptimize.第三种是通过电话呼叫GRBwrite写出模型。第一种情况为您提供了对何时应用修改的细粒度控制。第二种方法和第三种方法假设您希望在优化模型或将模型写入磁盘之前应用所有未决的修改。

为什么Gurobi接口会以这种方式运行?有几个原因。首先,这种方法使对模型执行多个修改变得更加容易,因为模型在修改之间保持不变。第二,处理模型修改的代价可能很高,特别是在Compute Server环境中,其中修改需要在机器之间进行通信。因此,对应用这些修改的确切时间具有可见性是很有用的。一般来说,如果你的程序需要对模型进行多次修改,你应该以分阶段进行为目标,即先进行一系列修改,然后更新,然后进行更多修改,然后再次更新,等等。在每个单独的修改之后进行更新是非常昂贵的。

如果您忘记调用update,您的程序不会崩溃。您的查询将简单地返回上次更新时所请求数据的值。如果你试图查询的对象不存在,你会得到一个INDEX_OUT_OF_RANGE错误。

从早期的Gurobi版本开始,延迟更新的语义发生了变化。虽然绝大多数程序不受此更改的影响,但您可以使用UpdateMode参数,以便在遇到问题时恢复到以前的行为。

管理参数

Gurobi优化器提供了一组参数,允许您控制优化过程的许多细节。在开始优化之前,可以通过修改Gurobi参数来控制可行性和最优性公差、算法的选择、探索MIP搜索树的策略等因素。参数设置GRBset *参数()例程(例如,GRBsetintparam).对象可以检索当前值GRBget *参数()例程(例如,GRBgetdblparam).参数可以是某种类型int,或char *(字符串)。您还可以使用以下方法从文件中读取一组参数设置GRBreadparams,或者使用GRBwriteparams

我们还包括一个自动参数调优工具,它可以探索许多不同的参数更改集,以便找到一个能够提高性能的参数更改集。你可以叫GRBtunemodel调用模型上的调优工具。指的是参数调优工具部分获取更多信息。

我们应该注意的一点是,每个模型在创建时都有自己的环境副本。因此,对原始环境的参数更改不会对现有模型产生影响。使用GRBgetenv检索与特定模型关联的环境,如果您想更改该模型的参数。

监控进度-记录和回调

优化过程可以通过Gurobi测井进行监控。默认情况下,Gurobi将向屏幕发送输出。有几个简单的控件可用于修改默认的日志记录行为。如果您希望将输出直接输出到文件和屏幕,请在中指定日志文件名GRBloadenv当你创造你的环境。您可以修改日志文件参数,如果您希望在创建环境后将日志重定向到不同的文件。日志输出的频率可以通过DisplayInterval参数,并且可以完全关闭日志记录OutputFlag参数。关于Gurobi日志文件的详细描述可以在日志记录部分。

更详细的进度监控可以通过Gurobi回调函数完成。的GRBsetcallbackfuncroutine允许您安装一个函数,Gurobi优化器将在优化过程中定期调用该函数。你可以叫GRBcbget从回调中获取关于优化状态的附加信息。

修改求解器行为-回调手机万博登录

回调还可以用于修改Gurobi优化器的行为。如果你调用例程GRBterminate例如,在回调中,优化器将在最方便的时间点终止。例程GRBcbsolution允许您在MIP模型的解决方案期间注入一个可行的解决方案(或部分解决方案)。例程GRBcbcutGRBcblazy允许你添加减少飞机懒惰的约束分别在MIP优化过程中。例程GRBcbstoponemultiobj允许您中断多目标MIP问题中的一个优化步骤的优化过程,而无需停止分层优化过程。

批处理优化

Gurobi计算服务器允许程序将优化计算卸载到专用服务器上。在此基础上,Gurobi集群管理器添加了许多额外的功能。一个重要的一个,批处理优化,允许您使用客户端程序构建优化模型,将其提交到Compute Server集群(通过集群管理器),然后检查模型的状态并检索其解决方案。你可以使用批处理对象使批量工作更容易。有关批号的详情,请参阅批处理优化部分。

错误处理

大多数Gurobi C库例程都会返回整数错误代码。返回值为零表示例程成功完成,而返回值为非零表示发生了错误。的中可以找到可能的错误返回码列表错误代码部分。

当错误发生时,可以通过调用来获取关于该错误的附加信息GRBgeterrormsg