不知道大家在写CPLEX的时候遇到过这个问题没有?

其实有过经验的小伙伴都知道该怎么处理了,但是小编决定还是写一下避免刚入行的小伙伴们踩坑。

这个错误呢查了ibm knowledge center显示如下:

里面讲了一堆想必大家也懒得去看了,我来讲讲这类问题的解决方案吧~出现这个错误的原因不是编程上的问题,而是建模方式上的问题。简单来说就是目标函数或者约束上出现了非线性的数学表达式。

那么什么是线性和非线性呢?我这里引一下百度知道上一个非常通俗易懂的解释:

两个变量之间的关系是一次函数关系的——图象是直线,这样的两个变量之间的关系就zhi是“线性关系”;如果不是一次函数关系的——图象不是直线,就是“非线性关系”。比如说y=kx 就是线形的 而y=x^2就是非线形的线形的图形一般是一条直线。

“非线性”的意思就是“所得非所望”。一个线性关系中的量是成比例的:十枚橘子的价钱是一枚的十倍。非线性意味着批发价格是不成比例的:一大箱橘子的价钱比一枚的价钱乘以橘子的个数要少。这里重要的观念是“反馈”——折扣的大小反过来又影响顾客购买的数量。

也就是说你的模型中很可能出现了多个变量相乘的情况,例如下面这种情景:

要解决这个问题,首先就得想你的模型给linearlized了。而最常用的做法就是“大M”法了,通过增加一个充分大的数,将多个相乘的变量给拆开,从而达到线性化的目的。

不过像上图那种情况就非常麻烦(其实是我建模建错了),今天就先不讨论。举个简单的例子,VRP的arc-flow模型中货物流常见的约束如下:

其中Q j k Q_j^kQjk​和x i , j k x_{i,j}^kxi,jk​为决策变量,Q j k Q_j^kQjk​表示车辆k kk离开客户j jj以后的载重量,而x i , j k x_{i,j}^kxi,jk​为1表示车辆走过边(i , j i, ji,j),否则为0。这条约束的含义是非常明了的,如果车辆经过边(i , j i, ji,j),那么该车辆离开客户j jj的载重量必须大于等于车辆离开客户i ii的载重量加上客户j jj的需求量,这是货物流平衡。

可以看到不等式右边出现了变量和变量相乘的情况,这就造成了我们刚刚说的“非线性”问题,那么这个模型放进cplex中肯定会报“not convex”的错误。为了让cplex能求解该模型,我们需要将非线性的约束转成线性的。

常见的一个办法是引入一个充分大的数,我们都喜欢叫它大M。当然这个数具体要多大,是不是越大越好,也不一定,后面我再讲。

先观察约束(8)右端的式子,发现只有当x i , j k x_{i,j}^kxi,jk​为1时,才需要Q j k ≥ Q i k + q i Q_j^k \ge Q_i^k + q_iQjk​≥Qik​+qi​,当x i , j k x_{i,j}^kxi,jk​为0时,Q j k Q_j^kQjk​就无所谓了。这是一个非常明显的if else约束。因此可以考虑将x i , j k x_{i,j}^kxi,jk​提取出来,和一个大M相乘:

Q j k ≥ Q i k + q j + M ( x i , j k − 1 ) Q_j^k \ge Q_i^k + q_j +M(x_{i,j}^k-1)Qjk​≥Qik​+qj​+M(xi,jk​−1)

我们现在来检验上面这个约束含义是否和之前的保持一致。首先当x i , j k x_{i,j}^kxi,jk​为1时,M ( x i , j k − 1 ) = 0 M(x_{i,j}^k-1)=0M(xi,jk​−1)=0,约束变成Q j k ≥ Q i k + q j Q_j^k \ge Q_i^k + q_jQjk​≥Qik​+qj​,这个没问题。然后当x i , j k x_{i,j}^kxi,jk​为0时,M ( x i , j k − 1 ) = − M M(x_{i,j}^k-1)=-MM(xi,jk​−1)=−M,这个约束就被松弛掉了,也就是说Q j k Q_j^kQjk​取其定义域内任意值都能满足,也和之前的保持一致。

这样,我们就将两个相乘的变量通过一个大M将其拆开了。将其他非线性约束改成非线性约束,就能放进CPLEX跑了。当然了,小编才疏学浅,目前只知道这种方法,不过已经够小编用了,就没继续往下深究。关于大M法将if else类的约束线性化,我这里贴一个知乎上的回答:

如果有多个变量相乘,那可能就得引入多个大M。不过呢,到这里还没有结束。下面我们聊聊关于大M的取值与CPLEX的精度可能造成的BUG。这种BUG是非常可怕的,如果不了解这一点,可能要走很多很多弯路哦,而且书本上才不会告诉你这些。

还是下面这条式子:

Q j k ≥ Q i k + q j + M ( x i , j k − 1 ) Q_j^k \ge Q_i^k + q_j +M(x_{i,j}^k-1)Qjk​≥Qik​+qj​+M(xi,jk​−1)

关键就在于CPLEX可能会存在精度损失,比如为0-1的决策变量有可能求解之后是这样的:

也就是说当x = 0.9999999995343387 x=0.9999999995343387x=0.9999999995343387或者当x = 1.0000000004656613 x=1.0000000004656613x=1.0000000004656613,本应该为0的M ( x i , j k − 1 ) M(x_{i,j}^k-1)M(xi,jk​−1)此刻都不是0了。那么这就很有可能造成约束失效,从而使模型无法满足所有约束。

不过注意,我上面说的是有可能造成约束失效,而非一定。x = 0.9999999995343387 x=0.9999999995343387x=0.9999999995343387和x = 1.0000000004656613 x=1.0000000004656613x=1.0000000004656613,它们和1相差的值都在小数点的后九位。也就是说当M设置得足够大的时候(比如1 0 10 10^{10}1010),M ( x i , j k − 1 ) M(x_{i,j}^k-1)M(xi,jk​−1)也会足够大,大到影响约束原本的作用。而当M不那么大的时候(比如1 0 5 10^{5}105),M ( x i , j k − 1 ) M(x_{i,j}^k-1)M(xi,jk​−1)也是小数点后4位,对原约束可以认为是没有影响的。

当然这个没有影响是相对于Q j k Q_j^kQjk​和q j q_jqj​而言,因为他们要求为整数并且大于等于0,就相当于你有1000万,那么丢几块钱对你来说除了有点小小的不爽以外,基本上也是没影响的。

那么M取什么值比较合适呢,这就需要大家去做一个简单的bound了,简单判断下影响约束的一个upper bound或者lower bound,只需要大致估算一个值即可。比如上面那个货物流平衡,可以取M = 2 V c a p M = 2V_{cap}M=2Vcap​,其中V c a p V_{cap}Vcap​为车辆的容量。

好了,以上就是今天分享的内容了。可以关注我们,不定时分享一下小编踩过的雷,这样你就不会在漫漫科研路上踩到相同的雷啦。

转自大佬公众号https://mp.weixin.qq.com/s/4IEXIegTm3dW1TSPUtENMw

https://blog.csdn.net/Rivalsx/article/details/109895281

CPLEX出现‘q1‘ is not convex?相关推荐

  1. 【漫漫科研路\CC++】CPLEX解SOCP问题

    IBM CPLEX可以解SOCP问题,但是需要先将这个SOCP问题化为指定的格式.本文首先介绍SOCP问题,然后举例介绍如何将SOCP问题转化为CPLEX认可的输入格式并求解. SOCP的介绍 关于S ...

  2. 实用线性代数和凸优化 Convex Optimization

    If not specified, the following conditions are assumed. X∈Rn∗mA∈Rm∗nX \in R^{n*m} \\ A \in R^{m*n} X ...

  3. cplex安装_Excel软件规划求解工具的安装与功能介绍

    引言 规划求解工具是Excel软件中自带的一个功能非常强大的加载项/工具.它能够完成包括线性规划.整数线性规划等一般规模的数学优化问题的问题求解.更重要的是,无论是在Windows操作系统下,还是苹果 ...

  4. 运筹优化学习17:马尔科夫决策规划--例题及Matlab、Lingo和Cplex的建模实现

    目录 1 胡运权<运筹学>211页题目及理论分析 1.1 题目介绍 1.2 Matlab实现 1.3 使用Lingo求解 1.4 使用Cplex建模及求解 2 刘克<马尔科夫决策过程 ...

  5. 百度翻译Q1 DAU增长40%,疫情期学生在线学习率猛增

    5月11日,百度翻译公布最新的DAU(日活跃用户数量)相关数据,2020年Q1较上一个季度环比增长10%,较去年Q1同比增长40%. 此外,百度翻译还在一个季度内,将翻译的语种扩充了近7倍,目前百度翻 ...

  6. R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集)、ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull)

    R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集).ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull) 目录

  7. 2014年Q1中国.BIZ域名总量增1.5万 注册情况稳定

    IDC评述网(idcps.com)04月17日报道:根据域名统计机构WebHosting.info的数据显示,在2014年第1季度(1.2.3月),中国.BIZ域名注册总量增加至66,487个,其涨幅 ...

  8. CPLEX在Linux上的安装与配置

    1.官网下载:cplex_studio128.linux-x86-64.bin 2.创建目录 在当前用户目录下创建目录cplex mkdir cplex chmod u=rwx,g=rwx,o=rx ...

  9. cplex学术版安装

    任何人:直接在公众号"毒书 彼记" ,"资源下载" 板块下载: 如果你的学校没有购买cplex软件那么,你就不可以下载教育版的cplex软件,如果下载免费板,它 ...

最新文章

  1. 2019嵌入式智能国际大会圆满落幕,7大专场精彩瞬间释出!
  2. boost::statechart模块实现状态迭代测试
  3. G6 图可视化引擎——核心概念——节点/边/Combo——内置节点——Rect
  4. spring学习(50):延迟加载
  5. ios html字符转义字符串,iOS HTML特殊字符转译
  6. 理论基础 —— 排序 —— 计数排序
  7. 裁员之后人手却不够,马斯克和母亲只好亲自上阵帮忙了
  8. logstash 启动方式
  9. Python之Django之views中视图代码重复查询的优化
  10. 线性表--算法设计题2.23
  11. 【HAOI2008】【BZOJ1045】糖果传递(环形纸牌均分,前缀和)
  12. 鸿蒙2秒开机官方,两款荣耀智慧屏发布:鸿蒙OS首秀2秒开机,安卓应用迁移不难...
  13. Mysql基础之 事务
  14. python传大文件如何检查遗漏,如何使用Python获取大文件的实时复制进度?
  15. showdoc修改json转表格格式
  16. miui kindle安装目录
  17. 手机忘记开机密码怎么办?我来教你
  18. 谷歌浏览器崩溃,无法搜索
  19. Unity3d之骨骼动画
  20. 精通Dubbo——Dubbo支持的协议的详解

热门文章

  1. 像淘宝、京东这样的大型电商网站服务器构架完全部署方案
  2. 专科生学计算机毕业升本,专科生请注意:“升本”的机会来了
  3. 移动端网页返回主页功能php,移动端点击返回键,页面不刷新解决方案
  4. Excel - 筛选显示各项数量
  5. 诺基亚301支持java评测_诺基亚301评测详细介绍【图解】
  6. MATLAB-二维插值的笔记与应用--十安辰
  7. 尼尧的面试日记:面试记录(一)
  8. 使用jna调用c语言动态库对接华视电子身份证阅读机
  9. 让区块链技术适应不完美的世界
  10. 洁净室对讲电话机安装,一键免提洁净室sip对讲电话