求解器Gurobi 超过二次的高阶多项式表达方法(python)

Gurobi 提供了线性项和二次项的直接表达方法,用户可以直接调用。但超过二次之后,有2种表达方式

(1)引入辅助变量,拆解为二次项表达。例如 x ^5 可以引入几个辅助变量 y=xz,z=w^2, w=x^2,这样每项都是二次项或者线性项。
eg1: w = s(0)×s(1)×s(2),此时变量w已经超过二次,需要建立中间变量v,使得
v = s(0)×s(1),最后变量可表示为: w = v×s(2)。
主要方案是通过model.addVar(name=“v”) 添加变量, model.addConstr(v==var_s[0]* var_s[1])添加约束来实现。

// w = s(0)*s(1)*s(2)
   v = model.addVar(name="v")     # 在model基础上添加变量,name="v"
   model.addConstr(v==var_s[0]* var_s[1])   # 在model基础上添加约束
   w = QuadExpr(v*var_s[2])

eg2: 建立表达式m = x * y * z + x * x * y,使得m最小 ,需要引入辅助变量,w, u, v, k

// 表达式: x * y * z + x * x * y
    expr = QuadExpr()
    w = expr.addTerms(1, x, y)
    u = expr.addTerms(1, w, z)
    v = expr.addTerms(1, x, w)
    minimize u + v

QuadExpr.addTerms() 方法介绍(引用Gurobi说明书P580)
addTerms ( coeffs, vars, vars2=None )
Add new linear or quadratic terms into a quadratic expression.
Arguments:
coeffs: Coefficients for new terms; either a list of coefficients or a single coefficient. The
arguments must have the same size.
vars: Variables for new terms; either a list of variables or a single variable. The arguments
must have the same size.
vars2 (optional): Variables for new quadratic terms; either a list of variables or a single
variable. Only present when you are adding quadratic terms. The arguments must have
the same size.
Example usage:
expr.addTerms(1.0, x)
expr.addTerms([2.0, 3.0], [y, z])
expr.addTerms([2.0, 3.0], [x, y], [y, z])

在这里插入图片描述
在这里插入图片描述

(2)直接调用 Gurobi 的 addGenConstrPoly() 函数或者addGenConstrPow() 函数。那么 y = x^5 可以表达为:

//  y = x^5
   model.addGenConstrPoly(x, y, [1, 0, 0, 0, 0, 0])
   model.addGenConstrPow(x,y,5)

在这里插入图片描述
如果所建模型是非凸的,可进行如下设置(9.0以上版本):

// # 建立模型
BFG = Model("BFG")
BFG.setParam('nonconvex', 2)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值