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