C API概述


C API概述

本节文档了Gurobi C接口。本手册开始快速概述界面中的功能,并继续所有可用的接口例程的详细描述

如果您是Gurobi Optimizer的新手,我们建议您从中开始快速入门指南或者是例子之旅.这些文件提供了如何使用此处描述的例程的具体示例。

环境

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

模型

您可以在环境中创建一个或多个优化模型。模型包括一组变量,线性,二次或分段 - 线性目标函数,以及一组约束。每个变量具有相关的下限,上限,类型(连续,二进制,整数,半连续或半整数),以及线性物镜系数。每个线性约束具有相关的感觉(不足或等于或等于或等于或等于或相等的)和右侧值。参考这个部分有关变量和约束的更多信息。

可以通过A立即指定优化模型,通过GRBloadmodel通过第一次呼叫常规或逐步构建grbnewmodel.然后调用grbaddvars.添加变量和grbaddconstr.grbaddqconstr.GRBaddsos,或任何一个grbaddgenconstrxxx.添加约束的方法。模型是动态实体;您可以随时添加或删除变量或约束。

使用其索引在整个Gurobi C接口中引用特定变量和约束。可变指数被分配为变量以连续的方式添加到模型中。限制也是如此。在遵守C语言约定时,索引全部启动0。

我们经常提到班级一个优化模型。具有线性目标函数、线性约束和连续变量的模型为线性程序(LP).如果目标是二次的,模型是a二次规划(QP).如果任何约束是二次的,则模型是一个Quadratically-Constrained计划(QCP).我们有时也会讨论QCP的特殊情况,二阶锥程序(SOCP).如果模型包含任何整数变量,半连续变量,半整数变量,特殊订购集(SOS)约束或一般约束,模型是一个混合整数程序(MIP).我们还将有时讨论MIP的特殊情况,包括混合整数线性程序(MILP)混合整数二次程序(MIQP)混合整数二次约束程​​序(MIQCP),混合整数二阶锥程序(MISOCP).Gurobi Optimizer处理所有这些模型类。

解决模型

一旦建立了一个型号,您可以打电话GRBoptimize计算解决方案。默认情况下,grboptimize()将使用并发优化器要解决LP模型,屏障算法解决QP和QCP型号,以及分支算法解决混合整数型号。将解决方案作为一组存储属性模型。C接口包含一个广泛的例程,用于查询这些属性。

Gurobi算法保持仔细追踪模型状态,所以呼叫grboptimize()只在自上次优化模型以来相关数据发生更改时执行进一步优化。如果您想放弃以前计算的解决方案信息,并在不更改模型的情况下从头开始优化,您可以调用Grbeset.

在解决了MIP模型后,您可以打电话grbfixedmodel.计算关联的固定的模型。此模型与输入模型相同,除了所有整数变量都固定到MIP解决方案中的值。在某些应用中,计算关于MIP模型的此连续版本的信息(例如,双变量,灵敏度信息等)是有用的。

多种解决方案和多目标

默认情况下,Gurobi Optimizer假定您的目标是找到一个具有单个目标函数的模型的证明最佳解决方案。Gurobi提供了允许您放宽其中任何一个假设的功能。您应该参考该部分溶液池有关如何请求多个解决方案的信息,或有关多目标有关如何指定多个目标函数并控制它们之间的权衡的信息。

不可行的模型

如果发现模型是不可行的,您有一些选项。您可以尝试诊断发出的原因,尝试修复不可行,或两者。获取可用于诊断不可行性原因的信息,请致电GRBcomputeIIS计算不可缩短的不一致子系统(IIS)。此例程可用于连续和MIP模型,但您应该意识到MIP版本可能相当昂贵。此例程填充了一组IIS属性。

试图修复不可行,呼叫grbfeasrelax.计算模型的可行性放松。此放松允许您找到最小化约束违规程度的解决方案。

查询和修改属性

与GuRObi模型相关的大多数信息存储在一组属性中。某些属性与模型的变量相关联,其中一些具有模型的约束,以及一些模型本身。要提供一个简单的例子,解决优化模型原因导致X要填充变量属性。属性如X由Gurobi Optimizer计算的,不能由用户直接修改,而其他诸如可变下限阵列(属性)可以。

Gurobi C接口包含一个广泛的例程,用于查询或修改属性值。用于特定属性的确切例程取决于属性的类型。如前所述,属性可以是可变属性,约束属性或模型属性。变量和约束属性是数组,并使用一组数组属性例程。模型属性是标量,并使用一组标量例程。属性值可以另外是类型字符, 或者细绳(真的char *).

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

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

可以通过用户设置的数组属性进行修改grbset * attrarray()grbset * attrelement(),GRBset * attrlist ()例程。

可以在中找到gurobi属性的完整列表属性部分。

附加的模型修改信息

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

约束矩阵可以通过几种方式进行修改。第一个是要打电话GRBchgcoeffs改变单个矩阵系数。此例程可用于修改现有非零的值,将现有的非零设置为零,或创建新的非零。删除约束时,还修改约束矩阵(通过grbdelconstr.)或变量(通过grbdelvars.).与删除的约束或变量关联的非零值与约束或变量本身一起移除。

使用二次客观术语使用grbaddqpterms.例行公事。您可以在一次调用中添加一个二次项列表,也可以通过多个调用递增地添加项。这GRBdelq例程允许您从模型中删除所有的二次项。请注意,二次模型通常既有二次项又有线性项。线性项通过obj.属性,以同样的方式处理具有纯线性目标函数的模型。

如果变量具有分段线性目标,则可以使用grbsetpwlobj.例行公事。为每个相关变量调用此例程一次。Gurobi单纯形求解器包含了对凸分段手机万博登录线性目标函数的算法支持,因此对于连续模型,您应该可以从使用该特性中看到实质性的性能优势。要清除先前指定的分段线性目标函数,只需设置obj.将相应变量的属性属于0。

懒惰的更新

关于Gurobi Optimizer中的模型修改的一个重要项目是它在a中执行懒惰的这意味着修改不会立即影响模特。相反,它们将排队并在稍后应用。如果您的程序只是简单地创建一个模型并解决它,那么您可能永远不会注意到这种行为。但是,如果在应用修改之前询问有关模型的信息,那么延迟更新方法的细节可能与您相关。

正如我们刚刚注意到的,模型修改(绑定更改,右侧更改,客观变化等)放置在队列中。这些排队的修改可以以三种不同的方式应用于模型。第一个是明确的呼召grbupdatemodel..第二个是呼叫GRBoptimize.第三是通过呼叫grbwrite.写出模型。第一种情况会使您在应用修改时对您进行的细粒度控制。第二和第三是假设您希望在优化模型或将其写入磁盘之前应用所有待应用的修改。

为什么Gurobi界面以这种方式行事?有几个原因。首先是这种方法使得对模型执行多种修改的更容易,因为该模型在修改之间保持不变。其次,处理模型修改可能是昂贵的,特别是在计算服务器环境中,其中修改需要在机器之间进行通信。因此,在应用这些修改时具有完全值是有用的。一般情况下,如果您的程序需要对模型进行多次修改,您应该旨在使它们在阶段中进行,在那里您制作一组修改,然后更新,然后再次进行更多修改,然后再次更新等。修改可能非常昂贵。

如果您忘记呼叫更新,您的程序将不会崩溃。您的查询将从上次更新的点中返回所请求数据的值。如果您尝试查询的对象不存在,那么您将获得一个INDEX_OUT_OF_RANGE错误。

在这个版本中,延迟更新的语义发生了变化。虽然绝大多数程序将继续工作而不需要修改,但您可以使用UpdateMode.如果遇到问题,则返回以前行为的参数。

管理参数

Gurobi Optimizer提供了一组参数,允许您控制优化过程的许多细节。可以通过修改Gurobi参数在开始优化之前来控制可行性和最优性公差等因素,算法,探索MIP搜索树等的策略。使用参数使用该参数grbset * param()例程(例如,gbsetintparam.).可以使用当前值来检索grbget * param()例程(例如,grbgetdblparam.).参数可以是类型, 或者char *(字符串)。使用。也可以从文件读取一组参数设置greadparams.或者使用grbwriteparams.

我们还包含了一个自动参数调优工具,它探索许多不同的参数更改集,以便找到一组可以提高性能的参数。你可以打电话GRBtunemodel调用模型上的调优工具。指的是参数调整工具章节以获取更多信息。

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

监控进度 - 日志记录和回调

可以通过Gurobi日志记录来监控优化的进程。默认情况下,Gurobi将输出发送到屏幕上。可以使用一些简单的控件来修改默认的日志记录行为。如果希望将输出直接输出到文件和屏幕,请指定日志文件名Grbloadenv.当您创建环境时。你可以修改日志文件参数如果您希望在创建环境后将日志重定向到其他文件。可以使用该输出的频率控制displayinterval.参数,可以完全关闭outputflag.范围。可以在GUROBI日志文件的详细描述伐木部分。

可以通过Gurobi回调函数来完成更详细的进度监控。这grbsetcallbackfunc.例程允许您安装Gurobi Optimizer在优化过程中定期呼叫的函数。你可以打电话GRBcbget从回调中获取有关优化状态的其他信息。

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

回调也可用于修改Gurobi Optimizer的行为。如果你叫例程grbterminate.例如,从回调中,优化器将在最早的方便点终止。常规GRBcbsolution允许您在MIP模型求解期间注入一个可行的解决方案(或部分解决方案)。例程grbcbcut.GRBcblazy允许您添加切割飞机懒惰的约束分别在MIP优化过程中。

误差处理

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

发生错误时,可以通过呼叫获取有关错误的其他信息grbgeterramsg.