Java API的概述


Java API的概述

本节记录gu罗比Java接口。本手册首先快速概述了接口中公开的类以及这些类上最重要的方法。然后继续a对所有可用类和方法的全面介绍

如果您更喜欢Javadoc格式,也可以在文件中找到关于gu罗manbet体育手机客户端比Java接口的文档gurobi-javadoc.jar.在Eclipse®等集成开发环境中使用Javadoc格式尤其有用。有关如何导入Javadoc文件的信息,manbet体育手机客户端请参考IDE的文档。

如果您是gu罗比优化器的新手,我们建议您从快速入门指南或者是例子之旅.这些文档提供了如何使用此处描述的类和方法的具体示例。

环境

使用gu罗比Java接口的第一步是创建一个环境对象。来表示环境GRBEnv类。环境充当与一组优化运行相关的所有数据的容器。在程序中通常只需要一个环境对象。

模型

您可以在一个环境中创建一个或多个优化模型。每个模型都表示为类的一个对象GRBModel.模型由一组决策变量(类的对象)组成GRBVar),这些变量的线性或二次目标函数(指定使用GRBModel.setObjective),以及对这些变量的一组约束(类的对象GRBConstrGRBQConstrGRBSOS,或GRBGenConstr).每个变量都有一个相关的下界、上界和类型(连续、二进制等)。每个线性或二次约束都有相关的含义(小于或等于、大于或等于或等于)和右侧值。详情请参阅变量和约束有关详情,请参阅参考手册。

当一个变量被添加到模型中时,线性目标也可以被定义GRBModel.addVar),但是GRBModel.setObjective通常更可取,因为它更易于阅读和维护。

线性约束通过构建线性表达式(类的对象)来指定GRBLinExpr),然后指定这些表达式之间的关系(例如,要求一个表达式等于另一个表达式)。二次约束以类似的方式构建,但是使用二次表达式(类的对象)GRBQuadExpr)。

优化模型可以通过从文件(使用适当的GRBModel构造函数),或者通过首先构造类的空对象来增量构建GRBModel然后再调用GRBModel.addVarGRBModel.addVars要添加额外的变量,和GRBModel.addConstrGRBModel.addQConstrGRBModel.addSOS,或任何GRBModel.addGenConstrXxx方法来添加额外的约束。模型是动态的实体;您总是可以添加或删除变量或约束。

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

解决一个模型

一旦您构建了一个模型,您就可以调用GRBModel.optimize计算解。默认情况下,优化将使用并发优化器求解LP模型,求解QP和QCP模型的屏障算法,求解混合整数模型的分支-切割算法。溶液储存在一组属性的模型。控件上的一组属性查询方法可以查询这些属性GRBModelGRBVarGRBConstrGRBQConstrGRBSOS,GRBGenConstr和类。

gu罗比算法仔细地跟踪模型的状态,因此调用GRBModel.optimize只有当自模型上次优化后相关数据发生变化时,才会执行进一步优化。如果您想放弃以前计算的解决方案信息,并在不更改模型的情况下从头开始重新启动优化,您可以调用GRBModel.reset

在解决了MIP模型之后,您可以调用GRBModel.fixedModel计算相关的固定模型。该模型与输入模型相同,只是所有整数变量都固定为MIP解决方案中的值。在某些应用中,计算MIP模型的这个连续版本的信息(例如双变量、灵敏度信息等)是很有用的。

多种解决方案和多种目标

默认情况下,gu罗比优化器假定您的目标是为具有单一目标函数的模型找到一个经过验证的最优解决方案。gu罗比提供了允许您放松这两种假设的功能。你应该参考关于溶液池有关如何请求多个解决方案的信息,或参阅有关多个目标有关如何指定多个目标函数并控制它们之间的权衡的信息。

不可行模型

如果一个模型被发现是不可行的,您有一些选择。你可以尝试诊断不可行性的原因,尝试修复不可行性,或者两者兼有。要获得对诊断不可行性的原因有用的信息,请调用GRBModel.computeIIS计算不可约不一致子系统(IIS)。此方法可用于连续模型和MIP模型,但您应该注意,MIP版本可能相当昂贵。此方法填充一组IIS属性。

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

查询和修改属性

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

使用GRBVar.getGRBConstr.getGRBQConstr.getGRBSOS.getGRBGenConstr.get,或GRBModel.get,并使用GRBVar.setGRBConstr.setGRBQConstr.setGRBGenConstr.set,或GRBModel.set.属性按类型(伽马射线爆发。CharAttr伽马射线爆发。DoubleAttr伽马射线爆发。IntAttr伽马射线爆发。StringAttr).的get ()而且设置()方法是重载的,因此属性的类型决定了返回值的类型。因此,constr.get (GRB.DoubleAttr.RHS)返回双精度值,而constr.get (GRB.CharAttr.Sense)返回一个字符。

如果希望检索一组变量或约束的属性值,通常更有效的方法是在相关的GRBModel对象。方法GRBModel.get包括允许您查询或修改一个、两个和三维变量或约束数组的属性值的签名。

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

附加的模型修改信息

对现有模型的大多数修改都是通过属性接口完成的(例如,对变量边界、约束右侧的更改,等等)。主要的例外是对约束矩阵和目标函数的修改。

可以用几种方法修改约束矩阵。第一个是调用chgCoeff方法GRBModel对象更改各个矩阵系数。此方法可用于修改现有非零的值,将现有非零设置为零,或创建新的非零。从模型中删除变量或约束时,约束矩阵也会被修改GRBModel.remove方法)。与已删除的约束或变量相关联的非零值将随约束或变量本身一起被删除。

模型目标函数还可以通过几种方式进行修改。最简单的方法是构建一个表达式来捕获目标函数(aGRBLinExprGRBQuadExpr对象),然后将该表达式传递给方法GRBModel.setObjective.如果你想修改目标,你可以简单地调用setObjective再次用一个新的GRBLinExprGRBQuadExpr对象。

对于线性目标函数,可选择setObjective就是使用Obj变量属性修改个别线性目标系数。

如果变量具有分段线性目标,则可以使用GRBModel.setPWLObj方法。对每个相关变量调用此方法一次。gu罗比单形解算器包括对凸分段线性目标手机万博登录函数的算法支持,因此对于连续模型,您应该会从使用该特性中看到显著的性能优势。若要清除先前指定的分段线性目标函数,只需设置Obj属性设置为0。

懒惰的更新

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

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

为什么gu罗比接口以这种方式工作?有几个原因。首先,这种方法使对模型执行多次修改变得更加容易,因为模型在修改之间保持不变。第二,处理模型修改可能非常昂贵,特别是在Compute Server环境中,修改需要在机器之间进行通信。因此,准确地了解何时应用这些修改是很有用的。一般来说,如果您的程序需要对模型进行多次修改,您应该以分阶段进行为目标,即先进行一组修改,然后更新,再进行更多修改,然后再次更新,等等。每次修改之后的更新都可能非常昂贵。

如果你忘记调用update,你的程序不会崩溃。您的查询将只返回上一次更新点的请求数据的值。如果您试图查询的对象那时不存在,您将得到一个NOT_IN_MODEL例外。

自早期的gu罗比版本以来,惰性更新的语义已经发生了变化。虽然绝大多数程序不受此更改的影响,但您可以使用UpdateMode参数在遇到问题时恢复到先前的行为。

管理参数

gu罗比优化器提供了一组参数,允许您控制优化过程的许多细节。在开始优化之前,可以通过修改古罗比参数来控制可行性和最优性公差、算法的选择、探索MIP搜索树的策略等因素。参数可以是类型int,或字符串

设置参数的最简单方法是通过GRBModel.set方法。类似地,参数值可以用GRBModel.get

参数也可以设置在gu罗比环境对象上,使用GRBEnv.set.注意,每个模型在创建时都有自己的环境副本,因此对原始环境的参数更改不会对现有模型产生影响。

可以使用。从文件中读取一组参数设置GRBEnv.readParams,或使用GRBEnv.writeParams

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

gu罗比参数的完整列表可以在参数部分。

内存管理

用户通常不需要关心Java中的内存管理,因为它是由垃圾收集器自动处理的。gu罗比Java接口使用与其他Java程序相同的垃圾收集机制,但是我们的内存管理有一些细节是用户应该知道的。

通常,gu罗比对象与其他Java对象位于相同的Java堆中。当它们不再被引用时,它们就成为垃圾收集的候选者,并在垃圾收集器的下一次调用时返回到空闲空间池。两个重要的例外是GRBEnv而且GRBModel对象。一个GRBModel对象在Java堆中有少量与它相关的内存,但与模型相关的大部分空间位于gu罗比本地代码库的堆中(Windows中的gu罗比DLL,或Linux或Mac中的gu罗比共享库)。Java堆管理器不知道本机代码库中与模型关联的内存,因此在决定是否调用垃圾收集器时不考虑这种内存使用情况。当垃圾收集器最终收集JavaGRBModel对象,则gu罗比本地代码库中与模型关联的内存将被释放,但此集合可能比您希望的要晚。类似的考虑也适用于GRBEnv对象。

如果您正在编写使用多个gu罗比模型或环境的Java程序,我们建议您调用GRBModel.dispose当您使用关联的GRBModel对象,GRBEnv.dispose当您使用关联的GRBEnv对象和调用之后GRBModel.dispose在所有用它创建的模型上GRBEnv对象。

本机代码

如前所述,gu罗比Java接口是位于本地代码库(Windows上的gu罗比DLL, Linux或Mac上的gu罗比共享库)之上的一个薄层。因此,使用gu罗比Java库的应用程序将在运行时加载gu罗比本地代码库。为了实现这一点,您需要确保两件事是正确的。首先,您需要确保本机代码库在目标机器的搜索路径(路径在Windows上,LD_LIBRARY_PATH在Linux上,或DYLD_LIBRARY_PATH在Mac)。这些路径是作为安装gu罗比优化器的一部分设置的,但是在没有安装完整的gu罗比优化器的机器上可能无法进行适当配置。其次,您需要确保Java JVM和gu罗比原生库使用相同的对象格式。特别是,您需要使用32位的gu罗比本机库和32位的Java JVM,以及类似地使用64位的gu罗比本机库和64位的Java JVM。

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

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

更详细的进度监视可以通过GRBCallback类。的GRBModel.setCallback方法允许您从gu罗比优化器接收定期回调。类的子类来实现这一点GRBCallback抽象类,自己写回调()方法。你可以叫GRBCallback.getDoubleInfoGRBCallback.getIntInfoGRBCallback.getStringInfo,或GRBCallback.getSolution从回调中获取关于优化状态的附加信息。

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

回调还可以用于修改gu罗比优化器的行为。最简单的控件回调是GRBCallback.abort,它要求优化器在最早的方便点终止。方法GRBCallback.setSolution允许您在MIP模型的求解过程中注入可行的解决方案(或部分解决方案)。方法GRBCallback.addCut而且GRBCallback.addLazy允许你添加减少飞机而且懒惰的约束在MIP优化期间,分别。方法GRBCallback.stopOneMultiObj允许您中断多目标MIP问题中一个优化步骤的优化过程,而不停止层次优化过程。

错误处理

gu罗比Java库中的所有方法都可以抛出类型为的异常GRBException.当发生异常时,可以通过检索错误代码(使用方法)获得关于错误的附加信息GRBException.getErrorCode),或者通过检索异常消息(使用方法GRBException.getMessage来自父类)。控件中可以找到可能的错误返回码列表错误代码部分。