Gurobi求解目标函数最优值

"""
求解目标函数最大值
x+y+2*z
约束条件
x+2*y+3*z<=4
x+y>=1

"""

from gurobipy import *
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(v.varName,v.x)
    print( m.objVal)
#捕捉程序运行中的错误
except GurobiError as e:
    print("Erroe code" + str(e.errno) + ":" + str(e))
    
except AttributeError:
    print("Encountered an attribute erroe")

 

from gurobipy import *

#所需营养
categories,minNutrition,maxNutrition = multidict({
    "calories":[1800,2200],
    "protein":[91,GRB.INFINITY],
    "fat":[0,65],
    "sodium":[0,1779]
    })
#食物已经对应的cost
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"):420,
    ("chicken","calories"):420,
    ("chicken","protein"):32,
    ("chicken","fat"):10,
    ("chicken","sodium"):1190,
    ("hot dog","calories"):380,
    ("hot dog","protein"):4,
    ("hot dog","fat"):19,
    ("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")

#构建目标函数
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),"_"
    )


def printSolution():
    if m.status == GRB.Status.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()

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Gurobi是一个优化器,可以用于求解各种优化问题。在使用Gurobi求解模型时,一般需要经过以下几个步骤: 1. 搭建模型:首先需要定义模型对象,可以通过读取模型文件或直接建模来创建模型。如果是读取模型文件,可以使用GRBModel构造函数并指定文件名来创建模型对象。如果是直接建模,可以使用GRBModel构造函数创建一个空的模型对象。 2. 定义变量:在模型中定义需要优化的变量。可以使用GRBModel的getVar方法来获取变量对象,并设置变量的属性,如变量名称、类型、上下界等。 3. 定义约束:在模型中定义约束条件。可以使用GRBModel的addConstr方法来添加约束条件,并设置约束的线性表达式和上下界。 4. 定义目标函数:在模型中定义目标函数。可以使用GRBModel的setObjective方法来设置目标函数的线性表达式和优化方向。 5. 求解模型:调用模型对象的optimize方法来求解模型。求解过程中,Gurobi会根据定义的变量、约束和目标函数进行优化,并得到最优解。 6. 获取结果:求解完成后,可以通过获取变量的属性来获取最优解的。可以使用getVar方法获取变量对象,并使用get方法获取变量的属性,如变量名称、取等。可以使用getModel方法获取模型对象,并使用get方法获取模型的属性,如目标函数等。 下面是一个使用Gurobi求解模型的示例代码: ```cpp #include <iostream> #include <gurobi_c++.h> int main() { try { GRBEnv env = GRBEnv(); GRBModel model = GRBModel(env, "model.lp"); GRBVar x = model.getVar(0); GRBVar y = model.getVar(1); GRBVar z = model.getVar(2); model.optimize(); std::cout << x.get(GRB_StringAttr_VarName) << " " << x.get(GRB_DoubleAttr_X) << std::endl; std::cout << y.get(GRB_StringAttr_VarName) << " " << y.get(GRB_DoubleAttr_X) << std::endl; std::cout << z.get(GRB_StringAttr_VarName) << " " << z.get(GRB_DoubleAttr_X) << std::endl; std::cout << "Obj: " << model.get(GRB_DoubleAttr_ObjVal) << std::endl; } catch (GRBException& e) { std::cout << "Error code: " << e.getErrorCode() << std::endl; std::cout << e.getMessage() << std::endl; } catch (...) { std::cout << "Error during optimization" << std::endl; } return 0; } ``` 这段代码中,首先创建了一个GRBEnv对象来表示Gurobi的环境。然后使用GRBModel构造函数创建了一个模型对象,并指定了模型文件名。接下来,通过getVar方法获取变量对象,并使用get方法获取变量的属性。然后调用模型对象的optimize方法来求解模型。最后,使用get方法获取变量和模型的属性,输出最优解的。 需要注意的是,模型文件中保存的是模型的信息,并没有保存上一次优化后的结果。因此,每次需要获取结果时,都需要重新优化模型。 希望这个回答对您有帮助。 #### 引用[.reference_title] - *1* *2* *3* [Gurobi优化器使用(一)搭建并求解一个优化模型的过程【C++环境】](https://blog.csdn.net/qq_34003876/article/details/109208967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值