gurobi之python调用实例_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')

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值