一、导入方式
from gurobipy import * # 在Python中调用gurobi求解包
import numpy as np # 一般会用到numpy库
import scipy as sp # 也可能用到scipy库
二、创建模型
model = Model(name="model_MP") # 创建模型
三、添加变量
添加单个变量
addVar ( lb=0.0, ub=float(‘inf’), obj=0.0, vtype=GRB.CONTINUOUS, name=“”, column=None )
lb (optional): 变量下界
ub (optional): 变量上界
obj (optional): 在目标函数中的系数
vtype (optional): 变量的数据类型
name (optional): 变量名字
column (optional): 暂时不懂
x = model.addVar() # 默认参数
添加多个变量
addVars ( *indices, lb=?, ub=?, obj=?, vtype=?, name=“?” )
1.Gurobi默认变量下界为0,上下界如果定为无穷,容易出错,所以一般设定一个确定的值
2.变量的数据类型
Gurobi中常用的变量类型 vtype=
GRB.CONTINUOUS——连续变量(Gurobi默认变量类型,可以省略)
GRB.BINARY——二进制变量(0-1)
GRB.INTEGER——整数变量
3.变量的key索引形式
数组
x = model.addVars(2, 3) # 变量以2行3列数组的形式访问,x[0,0], x[0,1], x[0,2], x[1,0], x[1,1], and x[1,2]
列表(列表里的元素只能是数字或者字符串)
x = model.addVars([3, 7], ['a', 'b', 'c']) # 产生6个变量:x[3,'a'],x[3,'b'], x[3,'c'], x[7,'a'], x[7,'b'], x[7,'c']
元组(元组里的元素只能是数或者字符串)
x = model.addVars([(3,'a'), (3,'b'), (7,'b'), (7,'c')]) # 产生4个变量:x[3,'a'],x[3,'b'], x[7,'b'], x[7,'c']
4.强烈不建议使用包含空格的name,因为它们不能写入LP格式文件。
5.参数(lb、ub、obj等)可以采用多种形式。如果提供标量值(或使用默认值),则每个变量都将使用该值。
6.如果indices参数是单个列表,则可以为name参数提供相同长度的Python列表。对于每个变量,它将从列表中的相应位置提取值。
7.如果为name提供标量参数,则该参数将被转换为具有与关联变量的索引对应的下标。
x = model.addVars(2,3,name="x") # 变量名为:x[0,0], x[0,1]等
添加numpy数组形式的变量
addMVar ( shape, lb=0.0, ub=float(‘inf’), obj=0.0, vtype=GRB.CONTINUOUS, name=“” )
可用于构造线性/二次的目标函数/约束
shape: 数组的形状,一个int或一个int的元组
1.lb、ub、obj和vtype参数的值可以是标量、列表或数组。它们的形状应该与新的MVar对象的形状相匹配,或者它们应该可以广播到给定的形状
2.name参数可以是一个字符串,用作通用基名,每个变量的后缀都是它的索引,也可以是一个字符串数组,与新MVar对象的形状相匹配。
x = model.addMVar((4,2), vtype=GRB.BINARY) # 添加4行2列矩阵的二元变量
y = model.addMVar((3,), lb=[-1, -2, -1]) # 添加含3个变量的向量
四、添加约束
Gurobi 不支持严格大于或者严格小于的约束条件
Gurobi 模型中约束条件只支持 >=, <= 或者== 表达,不支持严格 > 或者 < 表达。如果需要表达严格大于或者小于,可以设定一个小的阈值,然后用 >= 或者 <= 表达。所以下述所有sense中的<或>均等同于<=或>=。
1.线性表达式LinExpr
LinExpr()
expr = LinExpr(2.0