python +gurobipy数学建模
简述
最近帮人做了一个混合整数线性规划case,使用了gurobipy优化库。学术版官网可以直接申请licence,三个月有效然后可以继续申请。总比要收费的cplex好点哈哈。但是还是遇到了一些坑,现在把整个问题与解决方案,代码,遇到的坑都记录一下。
对比cplex,gurobipy更适合复现一个优化问题,因为gurobipy不用把优化问题写成矩阵相乘的标准形式而是直接堆公式就行。
比如二次规划,不用写成:
XTQX + A*X的形式而是直接可以循环定义目标函数
然后就是gurobipy必须要求问题是半正定的,如果不是需要增加参数:
m.setParam('nonconvex', 2) # for nonconvex problem
# solve the problem :gurobipy.GurobiError: Objective Q not PSD (diagonal adjustment of 1.0e+00 would be required)
gurobipy 优化模型定义
from gurobipy import * # 导入
# 定义一个模型
m = Model()
# 设定一些参数 求解时长,精度等
m.setParam('nonconvex', 2)
m.setParam('MIPGap', 0.0001)
m.setParam('TimeLimit', 100)
# 定义优化变量
x1 = m.addVar(vtype=GRB.CONTINUOUS, lb=20, ub=30, name="x1")
x2 = m.addVar(vtype=GRB.CONTINUOUS, lb=20, ub=30, name="x2")
# 设定目标函数
m.setObjective(x1 * x2, GRB.MAXIMIZE)# 求最大问题 or 求最小问题
m.update()
# 添加约束 可以在设定目标函数前 或者后都可以
c_x = LinExpr()
c_x -=x1
c_x -=x2
m.addConstr(c_x<=50)
m.update()
# 进行求解
m.write('assign.lp')# 问题打印
m.optimize()
# 结果导出
if m.solCount == 0:
print("Model is infeasible")
m.computeIIS()
m.write("model_iis.ilp")# 出问题无法满足的约束与残差可以打印出来debug
print('optimal value: %d' % obj.getValue())
print('optimal solution:{} {}'.format(x1,x2))
x1_output = x1.x
x2_output = x2.x# 取出变量最优值到python变量里