gurobi可以求解多种类型的优化问题,如线性规划、二次规划、二阶锥规划及非线性规划问题等。
当目标函数为非线性时,默认要求函数为凸函数,即矩阵Q为半正定矩阵(PSD),否则会报错,显示目标 Objective Q not PSD ,问题无法求解;
同理,当约束条件非线性时,约束函数可能也是非凸的,会出现如下报错:
gurobipy.GurobiError: Constraint Q not PSD (diagonal adjustment of 2.9e+01 would be required). Set NonConvex parameter to 2 to solve model.
此时,需要设置NonConvex参数为2 ,即
model.Params.NonConvex = 2
模型将按照求解MIP的逻辑来求解此类非凸问题。
Continuous model is non-convex -- solving as a MIP
设置目标函数:model.setObjective(obj, GRB.MINIMIZE) # 添加目标函数
设置是否输出迭代过程及运算法则等内容(1是0否):model.setParam('OutputFlag', 1)
执行模型model优化:model.optimize()
输出决策变量名称及最优解数值、输出最优解的前20个决策变量的数值:
variable = []
for v in model.getVars():
print(v.varName, v.x)
variable.append(v.x)
for i in range(0, m):
print(variable[i])