Gurobi Class1笔记

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()

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值