zoukankan      html  css  js  c++  java
  • 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('
    Cost: %g' % m.objVal)
            print('
    Buy:')
            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')
    
  • 相关阅读:
    演讲-自我认识
    App Store--心酸的上线路,说说那些不可思议的被拒理由
    100个iOS开发/设计面试题汇总
    APP store 上架过程中碰到的那些坑&被拒的各种奇葩原因整理&审核指南中文版
    iOS图片攻略之:有3x自动生成2x 1x图片
    iOS多语言备选机制
    程序员如何提高自己》
    initWithFrame 和 initWithCoder
    黑客界大拿tombkeeper文章:怎么学好技术成为技术大拿(题目我自拟的)
    程序员常去的国外开发社区
  • 原文地址:https://www.cnblogs.com/qujingtongxiao/p/9851035.html
Copyright © 2011-2022 走看看