简单的Python示例
本节将通过一个简单的Python示例来工作 说明Gurobi Python接口的使用。 该示例构建 一个模型,优化,和输出最优目标的价值。
我们的示例优化以下模型:
最大化
x
+
y
+
2 z
受
x
+
2 y
+
3 z
4
x
+
y
1
x,y,z的二进制
Python
from gurobipy import *
try:
# Create a new model
m = Model("mip1")
# Create variables
x = m.addVar(vtype=GRB.BINARY, name="x")
y = m.addVar(vtype=GRB.BINARY, name="y")
z = m.addVar(vtype=GRB.BINARY, name="z")
# Set objective
m.setObjective(x + y + 2 * z, GRB.MAXIMIZE)
# Add constraint: x + 2 y + 3 z <= 4
m.addConstr(x + 2 * y + 3 * z <= 4, "c0")
# Add constraint: x + y >= 1
m.addConstr(x + y >= 1, "c1")
m.optimize()
for v in m.getVars():
print(v.varName, v.x)
print('Obj:', m.objVal)
except GurobiError:
print('Error reported')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
fromgurobipyimport*
try:
# Create a new model
m=Model("mip1")
# Create variables
x=m.addVar(vtype=GRB.BINARY,name="x")
y=m.addVar(vtype=GRB.BINARY,name="y")
z=m.addVar(vtype=GRB.BINARY,name="z")
# Set objective
m.setObjective(x+y+2*z,GRB.MAXIMIZE)
# Add constraint: x + 2 y + 3 z <= 4
m.addConstr(x+2*y+3*z<=4,"c0")
# Add constraint: x + y >= 1
m.addConstr(x+y>=1,"c1")
m.optimize()
forvinm.getVars():
print(v.varName,v.x)
print('Obj:',m.objVal)
exceptGurobiError:
print('Error reported')
细节部分
Python
from gurobipy import *
1
fromgurobipyimport*
Gurobi Python应用程序应该从这一行开始。
请注意,为了使这个命令成功,Python应用程序 需要知道如何找到Gurobi函数和类。 回忆 你有三个选择。 第一个是使用Python文件 包含在我们的分布。 你会运行这个例子 通过输入gurobi。 蝙蝠mip1.py。 第二个目标是安装Python蟒蛇 分布。 第三步是安装Gurobi到您自己的函数和类 Python安装。
在我们的示例中,第一步是创建一个模型。 Gurobi模型 拥有一个优化问题。 它由一组 变量,一组约束和相关联的属性 (变量范围,目标系数、变量类型的完整性, 约束,约束右边的价值观,等等)。 我们开始 这个例子使用一个空模型对象:
Python
m = Model("mip1")
1
m=Model("mip1")
此函数接受所需的型号名称作为它的参数。
Python
# Create variables
x = m.addVar(vtype=GRB.BINARY, name="x")
y = m.addVar(vtype=GRB.BINARY, name="y")
z = m.addVar(vtype=GRB.BINARY, name="z")
1
2
3
4
# Create variables
x=m.addVar(vtype=GRB.BINARY,name="x")
y=m.addVar(vtype=GRB.BINARY,name="y")
z=m.addVar(vtype=GRB.BINARY,name="z")
变量是通过补充道addVar()方法在模型 对象(或addVars()如果你想添加超过一次)。 一个变量总是关联到一个特定的模型。
Python允许您传递参数位置或名称。 我们已经 通过他们的名字。 每个变量类型(二进制),和 一个名字。 我们使用其他参数的默认值。 请参阅在线帮助(help(Model.addVar)Gurobi Shell)的进一步细节addVar()。
在我们的示例中,下一步是将变量添加到模型中。
下一步是设置的示例中优化 摘要目的:
Python
# Set objective: maximize x + y + 2 z
model.setObjective(x + y + 2 * z, GRB.MAXIMIZE)
1
2
# Set objective: maximize x + y + 2 z
model.setObjective(x+y+2*z,GRB.MAXIMIZE)
这里的目标是建成使用重载操作符。 Python API过载算术运算符允许您构建线性的 和二次表达式涉及Gurobi变量。
第二个参数表示的感觉是最大化。
注意,在这个简单的示例构建在一个单一的目标 声明中使用一个显式的术语列表,项目将更加复杂 通常逐步构建它。 例如:
Python
obj = LinExpr();
obj += x;
obj += y;
obj += 2*z;
model.setObjective(obj, GRB.MAXIMIZE);
1
2
3
4
5
obj=LinExpr();
obj+=x;
obj+=y;
obj+=2*z;
model.setObjective(obj,GRB.MAXIMIZE);
下一步是添加的示例中线性约束。 第一个 添加约束:
Python
# Add constraint: x + 2 y + 3 z <= 4
m.addConstr(x + 2 * y + 3 * z <= 4, "c0")
1
2
# Add constraint: x + 2 y + 3 z <= 4
m.addConstr(x+2*y+3*z<=4,"c0")
与变量、约束总是与特定的关联 模型。 他们是使用创建的addConstr()方法 模型对象。
我们再次使用重载的算术运算符来构建线性的 表达式。 比较运算符也超载 容易建立约束。
第二个参数addConstr给出了(可选) 约束的名字。
再一次,这个简单示例构建线性的表达式 约束在一个声明中使用一个显式的术语列表。 更复杂的程序通常会建立表达式 增量。
第二个约束以类似的方式创建:
Python
# Add constraint: x + y >= 1
m.addConstr(x + y >= 1, "c1")
1
2
# Add constraint: x + y >= 1
m.addConstr(x+y>=1,"c1")
现在模型已经建立,下一步是优化:
Python
# Optimize model
m.optimize()
1
2
# Optimize model
m.optimize()
这个例程执行优化和填充一些内部 模型属性(包括优化的状态 解决方案,等等)。
优化完成后,我们可以查询的值 属性。 特别是,我们可以查询varName和x变量属性获取名称和值为每个解决方案 变量:
Python
for v in m.getVars():
print(v.varName, v.x)
1
2
forvinm.getVars():
print(v.varName,v.x)
我们也可以查询objVal属性模型 获取当前的客观价值解决方案:
Python
print('Obj:', m.objVal)
1
print('Obj:',m.objVal)
所有模型的名称和类型、变量和约束属性 可以在网上找到Python文档。 类型help(GRB.Attr)Gurobi壳的细节。
中的错误Gurobi Python接口是通过Python 异常机制。 在这个例子中,所有Gurobi语句 封闭在一个try块,和任何相关的错误 抓到的except块。
当您运行这个示例gurobi。 蝙蝠mip1.py, 你应该可以看到如下输出:
Python
Optimize a model with 2 rows, 3 columns and 5 nonzeros
Presolve removed 2 rows and 3 columns
Presolve time: 0.00s
Explored 0 nodes (0 simplex iterations) in 0.00 seconds
Thread count was 1 (of 4 available processors)
Optimal solution found (tolerance 1.00e-04)
Best objective 3.000000000000e+00, best bound 3.000000000000e+00, gap 0.0%
x 1.0
y 0.0
z 1.0
Obj: 3.0
1
2
3
4
5
6
7
8
9
10
11
12
13
Optimizeamodelwith2rows,3columnsand5nonzeros
Presolveremoved2rowsand3columns
Presolvetime:0.00s
Explored0nodes(0simplexiterations)in0.00seconds
Threadcountwas1(of4availableprocessors)
Optimalsolutionfound(tolerance1.00e-04)
Bestobjective3.000000000000e+00,bestbound3.000000000000e+00,gap0.0%
x1.0
y0.0
z1.0
Obj:3.0