Gurobi Class1:Gurobi基本操作
from gurobipy import *
#tuplelist
Cities = [('A', 'B'), ('A', 'C'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
Routes = gurobipy.tuplelist(Cities)
print(Routes)
print(Routes.select('A', '*'))
'''
<gurobi.tuplelist (5 tuples, 2 values each):
( A , B )
( A , C )
( B , C )
( B , D )
( C , D )
>
<gurobi.tuplelist (2 tuples, 2 values each):
( A , B )
( A , C )
>
'''
#tupledict,具有select,sum,prod方法
Routes = gurobipy.tupledict(Cities)
print(Routes)
print(Routes.select('A', '*'))
'''
{'A': 'C', 'B': 'D', 'C': 'D'}
['C']
'''
#Multidict()
cities, supply, demand = gurobipy.multidict({
'A': [100, 20],
'B': [150, 50],
'C': [20, 300],
'D': [10, 200]
}) #cities:key; supply:key和第一列;demand:key和第二列
print(cities, supply, demand)
'''
['A', 'B', 'C', 'D'] {'A': 100, 'B': 150, 'C': 20, 'D': 10} {'A': 20, 'B': 50, 'C': 300, 'D': 200}
'''
#quicksum
a=[i for i in range(10)]
b = [i ** 2 for i in range(10)]
obj = quicksum(a[i] * b[i] for i in range(10))
print(obj)
'''
<gurobi.LinExpr: 2025.0>
'''
tupledict:Gurobi变量一般都是tupledict类型,有sum函数
m = Model()
x = m.addVars(3,4, vtype=GRB.BINARY, name='x')
m.addConstrs((x.sum(i, '*')<=1 for i in range(3)), name='con')
m.update()
m.write('test.lp')
m
x
'''
m:
<gurobi.Model MIP instance Unnamed: 3 constrs, 12 vars, No parameter changes>
x:
{(0, 0): <gurobi.Var x[0,0]>,
(0, 1): <gurobi.Var x[0,1]>,
(0, 2): <gurobi.Var x[0,2]>,
(0, 3): <gurobi.Var x[0,3]>,
(1, 0): <gurobi.Var x[1,0]>,
(1, 1): <gurobi.Var x[1,1]>,
(1, 2): <gurobi.Var x[1,2]>,
(1, 3): <gurobi.Var x[1,3]>,
(2, 0): <gurobi.Var x[2,0]>,
(2, 1): <gurobi.Var x[2,1]>,
(2, 2): <gurobi.Var x[2,2]>,
(2, 3): <gurobi.Var x[2,3]>}
'''
tupledict:Gurobi变量一般都是tupledict类型,有prod函数,用于变量和系数相乘后累加
cost = tuplelist([[i for i in range(1,5)] for i in range(3)])
#obj = quicksum(cost[i, j] * x[i, j] for i, j in [[1,2], [3,1]])
#obj
obj = x.prod(cost)
obj
案例(examples/python/mip1.py)
max x+y+2z
s.t.x+2y+3z<=4
x+y>=1
x,y,z {0,1}
try:
#创建模型
m = Model('mip1')
#创建变量
x = m.addVar(vtype=GRB.BINARY, name='x')
y = m.addVar(vtype=GRB.BINARY, name='y')
z = m.addVar(vtype=GRB.BINARY, name='z')
#设定目标
m.setObjective(x + y + 2 * z, GRB.MAXIMIZE)
#添加约束
m.addConstr(x + 2 * y + 3 * z <= 4, 'c0')
m.addConstr(x + y >= 1, 'c1')
#优化模型
m.optimize()
for v in m.getVars():
print('%s %g' % (v.varName, v.x))
print('Obj: %g' % m.objVal)
except GurobiError as e:
print('Error code ' + str(e.errno) + ': ' + str(e))
except AttributeError:
print('Encountered an attribute error')
'''
Gurobi Optimizer version 9.1.0 build v9.1.0rc0 (win64)
Thread count: 4 physical cores, 8 logical processors, using up to 8 threads
Optimize a model with 2 rows, 3 columns and 5 nonzeros
Model fingerprint: 0xf43f5bdf
Variable types: 0 continuous, 3 integer (3 binary)
Coefficient statistics:
Matrix range [1e+00, 3e+00]
Objective range [1e+00, 2e+00]
Bounds range [1e+00, 1e+00]
RHS range [1e+00, 4e+00]
Found heuristic solution: objective 2.0000000
Presolve removed 2 rows and 3 columns
Presolve time: 0.08s
Presolve: All rows and columns removed
Explored 0 nodes (0 simplex iterations) in 0.17 seconds
Thread count was 1 (of 8 available processors)
Solution count 2: 3
Optimal solution found (tolerance 1.00e-04)
Best objective 3.000000000000e+00, best bound 3.000000000000e+00, gap 0.0000%
x 1
y 0
z 1
Obj: 3
'''
案例(examples/python/diet.py)
categories, minNutrition, maxNutrition = multidict({
'calories': [1800, 2200],
'protein': [91, GRB.INFINITY],
'fat': [0, 65],
'sodium': [0, 1779]})
foods, cost = multidict({
'hamburger': 2.49,
'chicken': 2.89,
'hot dog': 1.50,
'fries': 1.89,
'macaroni': 2.09,
'pizza': 1.99,
'salad': 2.49,
'milk': 0.89,
'ice cream': 1.59})
nutritionValues = {
('hamburger', 'calories'): 410,
('hamburger', 'protein'): 24,
('hamburger', 'fat'): 26,
('hamburger', 'sodium'): 730,
('chicken', 'calories'): 420,
('chicken', 'protein'): 32,
('chicken', 'fat'): 10,
('chicken', 'sodium'): 1190,
('hot dog', 'calories'): 560,
('hot dog', 'protein'): 20,
('hot dog', 'fat'): 32,
('hot dog', 'sodium'): 1800,
('fries', 'calories'): 380,
('fries', 'protein'): 4,
('fries', 'fat'): 19,
('fries', 'sodium'): 270,
('macaroni', 'calories'): 320,
('macaroni', 'protein'): 12,
('macaroni', 'fat'): 10,
('macaroni', 'sodium'): 930,
('pizza', 'calories'): 320,
('pizza', 'protein'): 15,
('pizza', 'fat'): 12,
('pizza', 'sodium'): 820,
('salad', 'calories'): 320,
('salad', 'protein'): 31,
('salad', 'fat'): 12,
('salad', 'sodium'): 1230,
('milk', 'calories'): 100,
('milk', 'protein'): 8,
('milk', 'fat'): 2.5,
('milk', 'sodium'): 125,
('ice cream', 'calories'): 330,
('ice cream', 'protein'): 8,
('ice cream', 'fat'): 10,
('ice cream', 'sodium'): 180}
m = Model('diet')
buy = m.addVars(foods, name='buy')
buy, type(buy)
m.setObjective(buy.prod(cost), GRB.MINIMIZE)
m.addConstrs((quicksum(nutritionValues[f, c] * buy[f] for f in foods)
== [minNutrition[c], maxNutrition[c]] for c in categories), '-')
#'-'表示约束名字为c
def printSolution():
if m.status == GRB.OPTIMAL:
print('\nCost: %g' % m.objVal)
print('\nBuy:')
buyx = m.getAttr('x', buy)
for f in foods:
if buy[f].x > 0.0001:
print('%s %g' % (f, buyx[f]))
else:
print('No Solution')
m.optimize()
printSolution()
'''
buy:
{'hamburger': <gurobi.Var buy[hamburger] (value 0.6045138888888888)>,
'chicken': <gurobi.Var buy[chicken] (value 0.0)>,
'hot dog': <gurobi.Var buy[hot dog] (value 0.0)>,
'fries': <gurobi.Var buy[fries] (value 0.0)>,
'macaroni': <gurobi.Var buy[macaroni] (value 0.0)>,
'pizza': <gurobi.Var buy[pizza] (value 0.0)>,
'salad': <gurobi.Var buy[salad] (value 0.0)>,
'milk': <gurobi.Var buy[milk] (value 6.970138888888889)>,
'ice cream': <gurobi.Var buy[ice cream] (value 2.5913194444444447)>}
m.getAttr('x', buy)
{'hamburger': 0.6045138888888888,
'chicken': 0.0,
'hot dog': 0.0,
'fries': 0.0,
'macaroni': 0.0,
'pizza': 0.0,
'salad': 0.0,
'milk': 6.970138888888889,
'ice cream': 2.5913194444444447}
'''
print('\nAdding constraint: at most 6 servings of dairy')
m.addConstr(buy.sum(['milk', 'ice cream']) <= 6, 'limit_dairy')
m.optimize()
printSolution()
总结
1:尽量采用稀疏方式,而不是遍历 2:tuplelist.select(),tupledict.select(),tupledict.sum(),tupledict.prod() 3:建模过程: 1:创建变量:addVar(),addVars() 2: 创建目标:setObjective() 3: 创建约束:addConstr(), addConstrs() 4: 运行:optimize()