Python API概述

这部分文档Gurobi Python接口。它开始于全局函数的概述,这可以称为没有引用任何Python对象。然后论述了不同类型的对象可用的接口,和最重要的那些对象上的方法。最后,它提供了全面介绍所有可用的类和方法

如果你是新Gurobi优化器,我们建议你先快速入门指南或者是例子之旅。这些文件提供了具体的例子如何使用这里描述的类和方法。

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

全局函数

Gurobi shell包含一组全局函数没有提到任何Gurobi对象可以调用。可能是其中最重要的功能功能,它允许您从一个文件读取一个模型。其他有用的全局函数系统,它允许您从内部发出shell命令Gurobi壳,模型,它给你一个列表当前加载的模型,和disposeDefaultEnv配置默认的环境。全球其他函数允许您阅读、修改或写Gurobi参数(readParams,setParam,writeParams)。

模型

大多数Gurobi Python接口中的操作执行Gurobi对象通过调用方法。是最常用的对象模型。模型由一组决策变量(对象类Var兆乏),一个线性或二次目标函数(指定使用这些变量Model.setObjective),一组约束这些变量(类的对象若干,MConstr,QConstr,紧急求救信号,或GenConstr)。每个变量都有一个关联的下限,上限和类型(连续、二进制等)。每个线性或二次约束都有一个关联的意义(小于或等于、大于或等于或相等),和右边的值。指本节为更多信息变量、约束和目标。

一个优化模型可以被指定,从文件加载模型(使用前面提到的功能),或者它可能是逐步建立,首先构造一个空对象的类模型然后随后调用Model.addVar,Model.addVars,或Model.addMVar添加额外的变量Model.addConstr,Model.addConstrs,Model.addLConstr,Model.addQConstr,Model.addSOS,或任何的Model.addGenConstrXxx方法来添加额外的约束。

线性约束是通过建立线性表达式(指定的对象类LinExprMLinExpr),然后指定这些表达式之间的关系(例如,要求一个表达式等于另一个)。二次约束是建立在类似的方式,但使用二次表达式(类的对象QuadExprMQuadExpr)。使用一组通用约束构建专门的方法,或一组一般约束辅助函数加上重载操作符。

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

我们经常指的是优化模型。一个模型与一个线性目标函数,线性约束,是一个连续变量线性规划(LP)。如果目标是二次,是一个模型二次规划(QP)。如果二次的任何约束,模型是一个Quadratically-Constrained计划(QCP)。我们有时会引用一些特殊情况的QCP: QCPs凸约束,QCPs与非凸约束,双线性程序,二次二阶锥规划。如果模型包含任何整数变量,半连续变量,semi-integer变量,特殊的有序集(SOS)的约束,或一般约束,模型是一个混合整数规划(MIP)。有时我们也会讨论MIP的特殊情况,包括混合整数线性规划(MILP),(MIQP)混合整数二次规划问题,混合整数Quadratically-Constrained程序(MIQCP),混合整数二阶锥规划(MISOCP)。Gurobi优化器处理所有这些模型类。

环境

环境中作用相对较小的Gurobi Python接口比其他语言api,这主要是因为Python接口有一个默认的环境。除非你显式地通过自己的环境,需要一个环境的例程,将使用默认的环境。

的主要情况,您可能想要创建自己的环境是当你想要精确的控制与环境相关的资源(具体来说,授权牌或计算服务器)的发行。狗万app足彩如果您使用您自己的环境中创建模型(使用或者是模型构造函数),然后与环境相关的资源将尽快发布程序狗万app足彩不再引用您的环境或与环境创建的任何模型。

注意,您可以手动删除引用默认环境,从而使它可用于垃圾收集,通过调用disposeDefaultEnv。调用这个,毕竟模型建立在默认环境垃圾收集,默认的环境也会被垃圾收集。将会创建一个新的默认环境自动如果你调用一个程序,需要一个。

对于更高级的用例,您可以使用一个空环境创建一个未初始化的环境,然后通过编程,设置所有必需的选项为您的特定需求。详情查看环境部分。

解决一个模型

一旦你建立了一个模型,您可以调用Model.optimize计算一个解决方案。默认情况下,优化将使用并发优化器解决LP模型、障碍解决QP算法模型与凸凸目标和QCP模型约束,否则branch-and-cut算法。解决方案是存储在一个组属性随后的模型,可以进行查询(我们很快就会回到这个话题)。

Gurobi算法保持小心跟踪模型的状态,所以调用Model.optimize只会执行进一步优化如果相关数据改变了自从去年优化模型。如果你想抛弃以前从头计算解决方案信息并重新启动优化而不改变模型中,您可以调用Model.reset

MIP模型已经得到解决之后,您可以调用Model.fixed计算相关的固定模型。这个模型是相同的原始,除了它们的值的整数变量是固定的MIP的解决方案。如果你的模型包含SOS约束,一些连续变量出现在这些约束可能是固定的。在某些应用程序中,它可能是有用的信息来计算这种固定模式(例如,双变量,敏感信息,等等),虽然你应该小心在你如何理解这些信息。

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

默认情况下,优化器Gurobi假设你的目标是找到一个证明单个模型的最优解与一个单一的目标函数。Gurobi提供了以下功能,让你放松这些假设:

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

不可行模型

你有几个选项如果找到一个模型是不可行的。你可以尝试诊断不可行性的原因,试图修复不可行性,或两者兼而有之。获取信息,可以用于诊断的原因不可能实行,电话Model.computeIIS计算一个不可约子系统(IIS)不一致。该方法可用于连续和MIP模型,但是你应该意识到MIP版本将是相当昂贵的。这种方法填充IIS的一组属性。

尝试修复的不可行性,电话Model.feasRelaxSModel.feasRelax计算的可行性松弛模型。这个放松可以让你找到一个解决方案,最大限度地减少的大小约束违反。

查询和修改属性

大多数与Gurobi模型相关的信息存储在一组属性。一些属性与模型的变量相关联,一些模型的约束,和一些与模型本身。给一个简单的例子,使求解优化模型x填充变量属性。属性,如x所计算的Gurobi优化器直接由用户不能修改,而其他的,如变量下界(属性)。

属性可以通过两种方式访问在Python接口。第一个是使用getAttr ()setAttr ()方法,可以在变量(Var.getAttr/Var.setAttr),矩阵变量(MVar.getAttr/MVar.setAttr),线性约束(Constr.getAttr/Constr.setAttr),矩阵约束(MConstr.getAttr/MConstr.setAttr),二次约束(QConstr.getAttr/QConstr.setAttr),索斯(SOS.getAttr),一般约束(GenConstr.getAttr/GenConstr.setAttr)和模型(Model.getAttr/Model.setAttr)。这些被称为属性名称作为第一个参数(例如,var.getAttr (“x”)若干。setAttr (rhs》0.0))。可用属性的完整列表可以在找到属性本手册的部分。

属性也可以访问更直接:你可以遵循一个对象名称的时期,紧随其后的是对象的一个属性的名称。注意大写和小写是忽略指属性。因此,b = constr.rhs相当于b = constr.getAttr (rhs),若干。rhs = 0.0相当于若干。setAttr (rhs》0.0)

额外的模型修改信息

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

约束矩阵在一些方面可以修改。第一个是调用Model.chgCoeff方法。这种方法可以用来修改一个现有的非零的值,现有的非零设置为0,或者创建一个新的非零。约束矩阵也修改,当你删除一个变量或约束的模型(通过Model.remove方法)。相关联的非零值删除删除约束或变量与约束或变量本身。

模型的目标函数在一些方面也可以修改。最简单的是构建一个表达式捕获目标函数(一个LinExpr,MLinExpr,QuadExpr,或MQuadExpr对象),然后通过表达方法Model.setObjective。如果你想修改目标,您可以简单地调用setObjective又一个新的LinExprQuadExpr对象。

线性目标函数的另一种选择setObjective是使用Obj变量属性修改个人线性目标系数。

如果你的变量的分段线性目标,您可以指定使用Model.setPWLObj方法。调用这个方法一次每个相关变量。Gurobi单纯形解算器包括算法支持凸手机万博登录分段线性目标函数,所以连续模型你应该看到一个巨大的性能受益于使用这个特性。清除先前指定的分段线性目标函数,简单的设置Obj属性对应的变量为0。

懒惰的更新

一个需要注意的重要项目的模型修改Gurobi优化器中执行懒惰的时尚,这意味着立即修改不会影响模型。相反,他们正在排队和应用。如果您的程序简单地创建了一个模型,解决了它,你将不会注意到这种行为。但是,如果你要求在你修改的信息模型已经应用,懒惰的更新方法可能相关的细节给你。

正如我们提到的,模型修改(绑定更改,右边的变化,客观变化,等等)被放置在一个队列。这些排队的修改可以被应用到模型在三种不同的方式。第一个是由一个显式的调用Model.update。第二个是通过调用Model.optimize。第三是通过调用Model.write写出模型。第一个案例给你当修改应用细粒度的控制。第二个和第三个假设你想要所有未决的修改应用优化模型或写之前到磁盘。

为什么Gurobi接口以这种方式?有几个原因。首先,这种方法使得它更容易执行多个修改模型,由于模型之间保持不变的修改。第二,处理模型的修改很贵,尤其是在计算服务器环境中,修改需要机器之间的通信。因此,它是有用的可视性应用这些修改的确切时间。一般来说,如果你的程序需要多个修改模型,你应该让他们在阶段,进行一系列修改,然后更新,然后进行更多的修改,然后再更新,等等。每个修改后更新可能会非常昂贵。

如果你忘了打电话更新,程序不会崩溃。您的查询将返回所请求的值的数据点最后的更新。如果您想查询的对象不存在,你会得到一个NOT_IN_MODEL例外。

懒惰的语义Gurobi早些时候以来已经改变了版本更新。虽然绝大多数的程序不受此更改影响,您可以使用UpdateMode参数恢复早期的行为,如果你遇到一个问题。

管理参数

Gurobi优化器提供了一组参数允许您控制的许多细节的优化过程。可行性和最优公差等因素,选择算法,探索MIP策略搜索树,等等,可以通过修改控制之前Gurobi参数优化。参数设置使用方法Model.setParam。当前值也可以被检索Model.getParamInfo。您还可以访问参数更直接通过Model.Params类。设置MIPGap0.0参数模型例如,你可以做m。setParam (MIPGap, 0)m.Params。MIPGap= 0

你可以阅读从一个文件使用一组参数设置Model.read使用,或写一组改变参数Model.write

我们还包括一个自动参数调优工具,探索许多不同的参数变化为了找到一组提高了性能。你可以叫Model.tune调用模型调优工具。指的是参数调优工具节以获取更多信息。

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

Gurobi参数的完整列表可以在找到参数部分。

监测进展——日志记录和回调

进步的优化可以通过Gurobi监控日志记录。默认情况下,Gurobi将发送输出到屏幕上。几个简单的控件可用于修改默认日志记录的行为。你可以设置日志文件参数如果你想也直接Gurobi日志文件。的频率可以控制日志输出DisplayInterval参数,可以完全关闭的和日志记录OutputFlag参数。

日志输出也发送到Python记录器命名gurobipy在水平信息。您可以使用Python日志记录模块连接到此日志。

更详细的进度监控可以通过一个回调函数。如果你通过一个函数接受两个参数,模型在哪里,Model.optimize,你的函数被称为定期从内部优化。你的回调函数可以调用Model.cbGet获取额外信息优化的状态。你可以参考回调类的额外信息。

修改解决行为——回调手机万博登录

回调也可以用来修改Gurobi优化器的行为。最简单的控制回调Model.terminate,要求优化器终止最早方便点。方法Model.cbSetSolution允许您将一个可行的解决方案(或部分解决方案)在MIP模型的解决方案。方法Model.cbCutModel.cbLazy允许你添加减少飞机懒惰的约束分别在MIP优化。方法Model.cbStopOneMultiObj允许你中断的优化过程多目标优化步骤之一MIP问题不停地分层优化过程。

批处理优化

Gurobi计算服务器允许程序卸载优化计算到专用服务器。Gurobi集群管理器上添加一些额外的功能。一个重要的一个,批处理优化,允许你和你的客户建立一个优化模型程序,提交计算服务器集群(通过集群管理器),后来检查的状态模型和检索其解决方案。您可以使用一个批处理对象使它容易使用批次。上批次的详细信息,请参阅批处理优化部分。

错误处理

Gurobi Python库中所有的方法可能抛出异常的类型GurobiError。当发生异常时,可以获得额外的错误信息检索errno消息的成员GurobiError对象。一个可能值的列表errno字段中可以找到错误代码部分。