Python API概述


Python API概述

本节文档了Gurobi Python接口。它首先概述了全局函数,可以在不引用任何Python对象的情况下调用。然后,它讨论了接口中可用的不同类型的对象,以及这些对象上最重要的方法。最后,它给了一个全面演示所有可用的类和方法

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

AIX用户的重要说明:由于Python对AIX的有限支持,我们的AIX端口不包括Python接口。

全球职能

Gurobi shell包含一组全球职能可以在不参考任何Gurobi对象的情况下调用。这些功能中最重要的可能是函数,允许您从文件中读取模型。其他有用的全局功能是系统,这允许您从Gurobi shell中发出shell命令,楷模,它为您提供了当前加载模型的列表,dispeedefaultenv.,处理默认环境。其他全局函数允许您读取,修改或写Gurobi参数(readParams.setParam., 和Writeparams.)。

楷模

Gurobi Python接口中的大多数操作都是通过在Gurobi对象上调用方法来执行的。最常用的对象是模型。模型由一组决策变量(类对象组成var.),这些变量上的线性或二次目标函数(指定使用model.setobjective.),以及对这些变量的一组约束(类的对象约束QCONSTR.SOS., 或者Genconstr.)。每个变量具有相关的下限,上限,键入(连续,二进制等)。每个线性或二次约束具有相关的感觉(不足或等于或等于或等于或等于或相等的)和右侧值。参考这个部分有关变量和约束的更多信息。

通过从文件加载模型(使用先前提到的),可以一次性地指定优化模型函数),或者它可能是逐步构建的,首先构建类的空对象模型然后随后呼唤model.addvar.或者model.advars.添加其他变量,和model.addconstr.model.addconstr.model.addlconstr.model.addqconstr.模型.Addsos.,或任何一个model.addgenconstrxxx.添加其他约束的方法。

线性约束由构建线性表达式指定(类对象LINEXPR.),然后在这些表达式之间指定关系(例如,要求一个表达式等于另一个表达式)。二次约束以类似的方式构建,但使用二次表达式(类的对象quadexpr.) 反而。使用一组构建一般约束专用方法,或一组一般约束辅助功能加上超载的运营商。

模型是动态实体;您可以随时添加或删除变量或约束。

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

环境

环境在Gurobi Python界面中在我们的其他语言API中扮演更小的角色,主要是因为Python接口具有默认环境。除非您将自己的环境明确传递给需要环境的例程,否则将使用默认环境。

您可能想要创建自己的环境的主要情况是当您希望释放与环境相关联的资源(具体地,许可证令牌或计算服务器)时精确控制。狗万app足彩如果您使用自己的环境来创建模型(使用或者模型构造函数),然后将在您的程序不再引用您的环境或狗万app足彩使用该环境创建的任何模型来发布与环境关联的资源。

请注意,您可以手动删除对默认环境的引用,从而可以通过呼叫来获得垃圾收集dispeedefaultenv.。在调用此后,在默认环境内构建的所有模型都是垃圾收集后,默认环境也将是垃圾收集。如果调用需要一个的例程,将自动创建新的默认环境。

解决模型

一旦您构建了一个型号,您可以打电话Model.Optimize.计算解决方案。默认情况下,优化将使用它并发优化器解决LP模型,屏障算法解决QP和QCP型号,以及分支算法解决混合整数型号。解决方案存储在一组中属性模型,随后可以查询(我们将很快返回此主题)。

Gurobi算法保持仔细追踪模型状态,所以呼叫Model.Optimize.如果由于模型上次优化,因此如果相关数据发生了改变,则只会执行进一步的优化。如果您想丢弃先前计算的解决方案信息并在不改变模型的情况下重新启动从头开始的优化,则可以调用Model.Reset.

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

多种解决方案和多目标

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

不可行的模型

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

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

查询和修改属性

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

可以在Python接口中以两种方式访问​​属性。第一个是使用getattr()setattr()方法,可在变量上使用(var.getattr./var.setattr.),线性约束(cranct.getattr./cranct.setattr.),二次约束(qconstr.getattr./qconstr.setattr.),soss(sos.getattr.),一般约束(genconstr.getattr./genconstr.setattr.)和模型(model.getattr./model.setattr.)。这些称为属性名称作为第一个参数(例如,var.getattr(“x”)或者cranct.setattr(“RHS”,0.0))。可以在可用属性列表中找到属性本手册的一部分。

也可以更直接访问属性:您可以按一段时间遵循对象名称,然后遵循该对象的属性的名称。请注意,在参考属性时忽略大写/小写。因此,b = cranct.rhs.相当于b = clarent.getAttr(“RHS”), 和cranct.rhs = 0.0相当于cranct.setattr(“RHS”,0.0)

其他模型修改信息

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

可以通过几种方式修改约束矩阵。第一个是打电话给Model.chgcoeff.方法。该方法可用于修改现有非零的值,将现有的非零设置为零,或创建新的非零。当您从模型中删除变量或约束时,还修改约束矩阵(通过model.remove.方法)。与删除约束或变量相关联的非零值与约束或变量本身一起移除。

也可以通过几种方式修改模型目标函数。最简单的是构建捕获目标函数的表达式(aLINEXPR.或者quadexpr.对象),然后将该表达式传递给方法model.setobjective.。如果您想修改目标,您只需打电话setobjective.再次有一个新的LINEXPR.或者quadexpr.目的。

用于线性目标功能,替代方案setobjective.是使用obj.变量属性来修改单个线性物镜系数。

如果您的变量具有分段 - 线性目标,您可以使用该方法使用model.setpwlobj.方法。每个相关变量调用一次方法一次。Gurobi Simplex求解器包括手机万博登录用于凸分段 - 线性物镜函数的算法支持,因此对于连续型号,您应该看到使用此功能的实质性效益。要清除先前指定的分段线性目标函数,只需设置obj.将相应变量的属性属于0。

懒惰的更新

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

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

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

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

延迟更新的语义在此版本中已更改。虽然绝大多数计划将继续下修,但您可以使用updatemode.如果您运行到问题,则恢复到以前的行为。

管理参数

Gurobi Optimizer提供了一组参数,允许您控制优化过程的许多细节。可以通过在开始优化之前修改Gurobi参数来控制可行性和最优性公差等因素,算法的选择,探索MIP搜索树等的策略。参数使用方法设置model.setParam.。也可以使用当前值model.getparaminfo.。您还可以更直接访问参数模型.Params.班级。设置mipgap.型号的参数为0.0m例如,您可以做任何一个M.SetParam('MIPGAP',0)或者m.params.mipgap = 0.

您可以使用文件读取一组参数设置model.read.或者使用模型.Write.

我们还包括一个自动参数调整工具,探讨了许多不同的参数变化集,以便找到提高性能的集合。你可以打电话model.tune.调用模型上的调整工具。参考参数调整工具有关更多信息的部分。

我们应该注意的一件事是改变一个模型的参数对其他模型的参数值没有影响。使用全局setParam.用于为所有加载模型设置参数的方法。

可以在的gurobi参数列表参数部分。

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

可以通过Gurobi Logging监控优化的进度。默认情况下,Gurobi将向屏幕发送输出。一些简单的控件可用于修改默认日志记录行为。你可以设置logfile.参数如果您希望将Gurobi日志指向文件。可以使用频率控制测井输出频率displayinterval.参数,可以完全关闭和记录outputflag.范围。

可以通过回调函数完成更详细的进度监控。如果您通过两个参数的函数,模型在哪里, 到Model.Optimize.,您的功能将从优化内定期调用。然后你的回调可以打电话model.cbget.检索关于优化状态的其他信息。你可以参考打回来课程以获取其他信息。

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

回调也可用于修改Gurobi Optimizer的行为。最简单的控制回调是Model.Terminate.询问优化器在最早的方便点终止。方法model.cbsetsolution.允许您在MIP模型的解决方案期间注入可行的解决方案(或部分解决方案)。方法模型.CBCUT.model.cblazy.允许您添加切割平面图懒惰的约束在MIP优化期间。

误差处理

Gurobi Python库中的所有方法都可以抛出类型的异常Gurobierror.。发生异常时,可以通过检索来获得有关错误的其他信息errno.或者信息成员Gurobierror.目的。可能的值列表errno.领域可以在其中找到错误代码部分。