初学者:python调用gurobi入门混合整数规划小案例

数学模型:

'''
\ Model MIP
\ LP format - for model browsing. Use MPS format to capture full model detail.
Maximize
  x0 + 2 x1 + 3 x2 + x3
Subject To
 c1: - x0 + x1 + x2 + 10 x3 <= 20
 c2: x0 - 3 x1 + x2 <= 30
 c3: x1 - 3.5 x3 = 0
Bounds
 x0 <= 40
 x3 <= 3
Generals
 x3
End
'''
#########################################################################################
#1.方法1
import gurobipy as gp
from gurobipy import *

#创建一个模型
m = gp.Model("MIP")
#决策变量
x1 = m.addVar(lb=0,ub=40,vtype=GRB.CONTINUOUS,name='x1')
x2 = m.addVar(vtype=GRB.CONTINUOUS,name='x2')
x3 = m.addVar(vtype=GRB.CONTINUOUS,name='x3')
x4 = m.addVar(lb=2,ub=3,vtype=GRB.INTEGER,name='x4')
#目标函数
m.setObjective(x1 + 2*x2 + 3*x3 + x4,GRB.MAXIMIZE)
#约束条件
m.addConstr(-x1+x2+x3+10*x4 <= 20,name='c1')
m.addConstr(x1-3*x2+x3 <= 30,name='c2')
m.addConstr(x2-3.5*x4 == 0,name='c3')
#写入模型
#m.write('MIP.lp')
#求解
m.setParam('outPutFlag',0)#设置参数的值,不输出求解日志
m.optimize()
#输出
if m.status==GRB.Status.OPTIMAL:
    print('obj=',m.objVal) #获取目标函数值
    for v in m.getVars():  #model.getVars():取出模型中所有变量,包括名字和数值
        print(v.varName,':',v.x)   #v.varName:变量的名字,v.x变量的数值

#########################################################################################
#2.方法2
from gurobipy import *
m = read("MIP.lp")
m.setParam('outPutFlag',0)#设置参数的值,不输出求解日志
m.optimize()
#输出
if m.status==GRB.Status.OPTIMAL:
    print('obj=',m.objVal) #获取目标函数值
    for v in m.getVars():  #model.getVars():取出模型中所有变量,包括名字和数值
        print(v.varName,':',v.x)   #v.varName:变量的名字,v.x变量的数值

#########################################################################################
#3.方法3
from gurobipy import *
# 创建模型
c = [1, 2, 3, 1]
p = [[-1, 1, 1, 10],
  [1, -3, 1, 0],
  [0, 1, 0, -3.5]]
r = [20, 30, 0]
m = Model("MIP")
# 创建变量
x = m.addVars(range(4), lb=0, ub=[40,float('inf'),float('inf'),3],\
              vtype=[GRB.CONTINUOUS,GRB.CONTINUOUS,GRB.CONTINUOUS,GRB.INTEGER],name='x')
# 更新变量环境
m.update()
# 创建目标函数
m.setObjective(x.prod(c), GRB.MAXIMIZE)
# 创建约束条件
m.addConstrs(x.prod(p[i]) <= r[i] for i in range(2))
m.addConstr(x.prod(p[2]) == r[2])

# 执行最优化
m.setParam('outPutFlag',0)#设置参数的值,不输出求解日志
m.optimize()
if m.status==GRB.Status.OPTIMAL:
    print('obj=',m.objVal) #获取目标函数值
    for v in m.getVars():  #model.getVars():取出模型中所有变量,包括名字和数值
        print(v.varName,':',v.x)   #v.varName:变量的名字,v.x变量的数值

你可能感兴趣的:(运筹优化,python)