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 * yexpr = 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^5model.addGenConstrPoly(x, y, [1, 0, 0, 0, 0, 0])model.addGenConstrPow(x,y,5)


如果所建模型是非凸的,可进行如下设置(9.0以上版本):

// # 建立模型
BFG = Model("BFG")
BFG.setParam('nonconvex', 2)

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

  1. 优化求解器 | Gurobi的MVar类:矩阵建模利器、求解对偶问题的备选方案 (附详细案例+代码)

    优化求解器 | Gurobi的MVar类:矩阵建模利器.求解对偶问题的备选方案 优化求解器的建模方式:以gurobi为例 Gurobi的MVar(矩阵形式变量对象) 一个线性规划的例子:Wyndor玻 ...

  2. python反射和高阶内置方法

    1.isinstance:判断对象和类的关系 #判断结果返回bool类型 class A:pass class B(A):pass a = A() print(isinstance(a,A)) #Tr ...

  3. python四大高阶函数_详谈Python高阶函数与函数装饰器(推荐)

    一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首 ...

  4. 表面配准论文1--基于高阶图匹配方法的稠密表面配准

    Dense Non-rigid Surface Registration Using High-Order Graph Matching 一.摘要 提出高阶图匹配方程来解决非刚性表面配准问题,单阶项描 ...

  5. python使用高阶函数实现_18.python高阶函数

    什么是高阶函数:一个函数可以作为参数传给另外一个函数(一个函数可以用来接收另一个函数作为参数),或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数.函数的形参位 ...

  6. python什么是高阶函数_说说 Python 中的高阶函数

    高阶函数(higher-order function)指的是:接受一个函数为参数,或者把函数作为结果值返回的函数1. 1 sorted() 比较常见的高阶函数是 sorted(),其内部的关键字参数 ...

  7. python偏函数和高阶函数_【Python入门】8.高阶函数之 匿名函数和偏函数

    目录 高阶函数 匿名函数 lambda 偏函数 高阶函数 匿名函数 lambda lambda,即希腊字母λ.顾名思义,匿名函数没有函数名,在运用时采取lambda x : ...的方式,如lambd ...

  8. 廖雪峰讲python高阶函数求导公式_高阶函数 - 廖雪峰 Python 2.7 中文教程

    高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...

  9. Z3求解器指南(二)

    配置 set-option命令用来配置z3,该命令有几个选项去控制z3的行为.这些选项中的一部分只能够在断言和申明命令之前设定.使用reset命令可以擦出所有的断言和申明,在使用reset命令后,所有 ...

最新文章

  1. 使用leangoo实现多泳道看板任务
  2. (转载)聊聊Git原理
  3. Comet OJ(Contest #8)-D菜菜种菜【树状数组,指针】
  4. Qt值得学习吗?详解Qt的几种开发方式
  5. 数字滤波器(一)--IIR与FIR的基本结构与MATLAB实现
  6. php登陆+链接+验证,php+ajax验证登录跳转登录的实现方法
  7. solr导入mysql时间类型_docker 安装solr 导入mysql时报错
  8. 通过tomcat插件启动Maven工程
  9. android 自定义进度条颜色,进度条背景颜色
  10. 十年回眸 中国游戏崛起的完美轨迹
  11. C语言:实数类型。2021-02-15
  12. linux 磁盘坏道修复,linux系统下检测硬盘上的坏道和坏块
  13. Pandas数据分析(十年期国债收益率 与 十年期国债期货价格的相关性)
  14. 虚拟服务器跟目录,如何找虚拟主机根目录?
  15. 面经合集(包含python、mysql、linux、测试等内容)
  16. /Users/xxxx/.zshrc:export:101: not valid in this context: /Users/xxxx/xxxx
  17. VUE、JS判断当前是早上,中午,下午还是晚上
  18. 机器学习2020台大李宏毅课程网站、视频以及PPT连接
  19. 抖音达人探店有用吗?算不算过时呢
  20. Suomi NPP VIIRS夜间灯光遥感数据简介与下载(一)——数据介绍,FTP下载与hdf5读取

热门文章

  1. 戴尔显示器上的耳机口,能收麦克风的音嘛?
  2. 【ElasticSearch】(六)—— 搜索结果处理
  3. OnClose和OnDestroy
  4. React、threejs实现3D登录页面
  5. 黑洞6174怎样通过 matlab编写程序来实现?,1019_黑洞6174
  6. 实现设置上月、本月电表读数,显示上月、本月电表读数,计算并显示本月用电数。
  7. 计算机图形学常用算法实现4 多边形扫描转换算法-边界标志算法
  8. linux下路径怎么写,linux相对路径怎么写 linux的相对路径怎么表示?
  9. attempted relative import with no known parent package,已解决
  10. 【数据库】数据库设计