文中的图片(除聊天截图外)均来自作者待出版的教材《运筹优化常用算法、模型及草莓视频污版免费实战:Python+Java 实现》
非线性项举例在运筹优化中,草莓视频在线观看APP经常会遇到一些非线性的问题,主要包括
非线性目标函数非线性约束这两者也可以只有其一,也可以兼而有之。一般,Gurobi可以求解的非线性问题为下面几类:
目标二次,约束一次(Quadratic Programming, QP)目标一次,约束二次(Quadratically Constrained Programming, QCP)目标二次,约束二次(Quadratically Constrained Quadratic Programming, QCQP)目标一次,约束是锥约束(Second-Order Cone Programming, SOCP)如果上述模型中有整数变量,则相应的模型就变为MIQP, MIQCP, MIQCQP, MISOCP。 下面举几个这种模型的例子。
Quadratic Programmingmax x 2 + y 2 + z 2 x + y ⩽ 5 x + z ⩽ 6 x , y , z ⩾ 0 egin{aligned} max quad &x^2 + y^2 + z^2\ &x+yleqslant 5\ &x+z leqslant 6\ & x, y, z geqslant 0 end{aligned} maxx2+y2+z2x+y⩽5x+z⩽6x,y,z⩾0 如果上述模型中, x ∈ Z xin mathbb{Z} x∈Z,这就是一个MIQP.
Quadratically Constrained Programmingmax x + y x 2 + y 2 ⩽ 5 x , y ⩾ 0 egin{aligned} max quad &x + y\ &x^2 + y^2leqslant 5\ & x, ygeqslant 0 end{aligned} maxx+yx2+y2⩽5x,y⩾0 如果上述模型中, x ∈ Z xin mathbb{Z} x∈Z,这就是一个MIQCP.
Quadratically Constrained Quadratic Programmingmax x 2 + y 2 2 x 2 + 3 y 2 ⩽ 5 x , y ⩾ 0 egin{aligned} max quad &x^2 + y^2\ &2x^2 + 3y^2leqslant 5\ & x, ygeqslant 0 end{aligned} maxx2+y22x2+3y2⩽5x,y⩾0 如果上述模型中, x ∈ Z xin mathbb{Z} x∈Z,这就是一个MIQCQP.
Second-Order Cone Programmingmax x + y + z 2 x 2 + 3 y 2 ⩽ 3 z + 5 x 2 + y 2 ⩽ z 2 x , y , z ⩾ 0 egin{aligned} max quad &x + y + z\ &sqrt{2x^2 + 3y^2}leqslant 3z+5\ &x^2 + y^2 leqslant z^2\ & x, y,zgeqslant 0 end{aligned} maxx+y+z2x2+3y2 ⩽3z+5x2+y2⩽z2x,y,z⩾0 如果上述模型中, x ∈ Z xin mathbb{Z} x∈Z,这就是一个MISOCP.
加上基本的MIP,一共5类,这是Gurobi可以求解的5类常见的问题。通常情况下,用户的需求,都是带整数变量的。除了以上5类,Gurobi还可以求解很多其他类型的非线性问题。
其他Gurobi可以求解的非线性形式 Gurobi代码实现 一些闲言上面非常简略的介绍了一些非线性的知识。接下来草莓视频在线观看APP进行实操。
这个问题,读者群里已经问过好多好多遍了,比如下面的小伙伴
是吧,这问题其实在很多个地方,已经回答过几十遍了,我觉得还是出一个推文比较好。
简单讲解下面草莓视频在线观看APP来看一个最简单的形式。假设草莓视频在线观看APP想要使用Gurobi构造一个非线性表达式
x 2 + y z egin{aligned} x^2 + yz end{aligned} x2+yz
该怎么做呢?首先,草莓视频在线观看APP需要构造一个二次表达式对象,然后通过在二次表达式对象中添加项的方式,完成表达式的构建。
具体代码如下(草莓视频在线观看APP直接展示完整的代码)
# 建立模型对象model = Model("MyModel")# 构建变量x = model.addVar(lb = 0, vtype=GRB.CONTINUOUS, name="x")y = model.addVar(lb = 0, vtype=GRB.CONTINUOUS, name="y")z = model.addVar(lb = 0, vtype=GRB.CONTINUOUS, name="z")# 建立二次表达式quadExpr = QuadExpr()# 添加项:addTerms()quadExpr.addTerms(1, x, x) # 添加项x * xquadExpr.addTerms(1, y, z) # 添加项y * z这样就完成了费此案性表达式的构建。
完整模型构建下面草莓视频在线观看APP来尝试写一个完整的模型。 需要用到的函数 模型如下
max x 2 + y z x y + y z ⩽ z + 5 x + z ⩽ 6 x ∈ Z + , y , z ⩾ 0 egin{aligned} max quad &x^2 + yz\ &xy + yz leqslant z + 5\ &x+z leqslant 6\ & x in mathbb{Z}+, y, z geqslant 0 end{aligned} maxx2+yzxy+yz⩽z+5x+z⩽6x∈Z+,y,z⩾0
代码如下
from gurobipy import * # 建立模型对象model = Model("MyModel")# 构建变量x = model.addVar(lb = 0, vtype=GRB.INTEGER, name="x")y = model.addVar(lb = 0, vtype=GRB.CONTINUOUS, name="y")z = model.addVar(lb = 0, vtype=GRB.CONTINUOUS, name="z")model.setObjective(x * x + y * z) # 建立二次表达式quadExpr = QuadExpr()# 添加项:addTerms()quadExpr.addTerms(1, x, y) # 添加项x * xquadExpr.addTerms(1, y, z) # 添加项y * zmodel.addQConstr(quadExpr