Python3+Gurobi使用教程(一)

Gurobi使用教程

1.Gurobi使用的一般框架

from gurobipy import *
try:
    m=Model('modelname')
        
except GurobiError:
    print('Error reported')

2.Gurobi读取数据求解

假设给定三个文件,分别是categories.txt,foodcost.txt以及nutritionvalues.txt,分别存放每天营养摄取的上限和下限,每种食物的价格以及每种食物所含的营养成分,其中categories.txt中的数据如下(注意文件最后有换行):

calories 1800 2200
protein 91 1.00E+100
fat 0 65
sodium 0 1779


读取该文件的代码如下:

file = open("./categories.txt","r")   #设置文件对象
nutrition=[]
maxNut={}
minNut={}
for line in file.readlines():                          #依次读取每行  
    line = line.strip('')                             #去掉每行头尾空白  
    line = line[:-1]     #去掉换行符,也可以不去,这样最后一个数据要求也要换行
    str1=line.split(" ")[0]
    nutrition.append(str1)
    str2=line.split(" ")[1]
    minNut[str1]=float(str2)
    str3=line.split(" ")[2]
    maxNut[str1]=float(str3)
    
    
print(nutrition)
print(minNut)
print(maxNut)
print(minNut['fat'])
[print(minNut[x]) for x in nutrition]
file.close() 

foodcost.txt中的数据如下(文件最后有换行):

hamburger 2.49
chicken 2.89
hotdog 1.50
fries 1.89
macaroni 2.09
pizza 1.99
salad 2.49
milk 0.89
icecream 1.59


读取该文件的代码如下:

file = open("./foodcost.txt","r")   #设置文件对象
food=[]
cost={}
for line in file.readlines():                          #依次读取每行  
    line = line.strip('')                             #去掉每行头尾空白  
    line = line[:-1]     #去掉换行符,也可以不去,这样最后一个数据要求也要换行
    print("读取的数据为: %s" % (line))
    str1=line.split(" ")[0]
    food.append(str1)
    str2=line.split(" ")[1]
    cost[str1]=float(str2)
print(cost)
file.close() 

nutritionvalues.txt中的数据如下(文件最后有换行)

410
420
560
380
320
320
320
100
330
24
32
20
4
12
15
31
8
8
26
10
32
19
10
12
12
2.5
10
730
1190
1800
270
930
820
1230
125
180


读取该文件的代码如下:

file = open("./nutritionvalues.txt","r")   #设置文件对象
nutritionval=[]
food=['hamburger','chicken','hotdog','fries','macaroni','pizza','salad','milk','icecream']
for line in file.readlines():                          #依次读取每行  
    line = line.strip('')                             #去掉每行头尾空白  
    line = line[:-1]     #去掉换行符,也可以不去,这样最后一个数据要求也要换行
    print("读取的数据为: %s" % (line))
    str1=line.split(" ")[0]
    nutritionval.append(str1)
print(nutritionval)
nutritionvalue={}
i=0
for x in nutrition:
    for y in food:    
        nutritionvalue[y,x]=float(nutritionval[i])
        i=i+1
        print(nutritionvalue[y,x])
for x in food:
    for y in nutrition:
        print(nutritionvalue[x,y])
file.close() 

因此最后程序为

from gurobipy import *
import numpy as np
file = open("./categories.txt","r")   #设置文件对象
nutrition=[]
maxNut={}
minNut={}
for line in file.readlines():                          #依次读取每行  
    line = line.strip('')                             #去掉每行头尾空白  
    line = line[:-1]     #去掉换行符,也可以不去,这样最后一个数据要求也要换行
    str1=line.split(" ")[0]
    nutrition.append(str1)
    str2=line.split(" ")[1]
    minNut[str1]=float(str2)
    str3=line.split(" ")[2]
    maxNut[str1]=float(str3)

file.close() 


file = open("./foodcost.txt","r")   #设置文件对象
food=[]
cost={}
for line in file.readlines():                          #依次读取每行  
    line = line.strip('')                             #去掉每行头尾空白  
    line = line[:-1]     #去掉换行符,也可以不去,这样最后一个数据要求也要换行
    str1=line.split(" ")[0]
    food.append(str1)
    str2=line.split(" ")[1]
    cost[str1]=float(str2)

file.close() 

file = open("./nutritionvalues.txt","r")   #设置文件对象

nutritionval=[]
food=['hamburger','chicken','hotdog','fries','macaroni','pizza','salad','milk','icecream']
for line in file.readlines():                          #依次读取每行  
    line = line.strip('')                             #去掉每行头尾空白  
    line = line[:-1]     #去掉换行符,也可以不去,这样最后一个数据要求也要换行
    str1=line.split(" ")[0]
    nutritionval.append(str1)

nutritionvalue={}
i=0
for x in nutrition:
    for y in food:    
        nutritionvalue[y,x]=float(nutritionval[i])
        i=i+1

file.close() 

def printSolution():
    if m.status == GRB.Status.OPTIMAL:
        print('\nCost: %g' % m.objVal)
        print('\nBuy:')
        buyx = m.getAttr('x', buy)
        for f in food:
            if buy[f].x > 0.0001:
                print('%s%g' % (f, buyx[f]))
    else:
        print('No solution')




try:
    m=Model('modelname')
    buy=m.addVars(food,name="buy")
    m.setObjective(buy.prod(cost),GRB.MINIMIZE)
    m.addConstrs(
            (quicksum(nutritionvalue[f,c]*buy[f] for f in food)==
            [minNut[c],maxNut[c]]
            for c in nutrition),"_"
            )
    m.write("diet.lp")#写入lp文件
    m.optimize()
    printSolution()
except GurobiError:
    print('Error reported')
posted @ 2018-10-31 16:37  曲径通霄  阅读(15935)  评论(0编辑  收藏  举报