不知道大家在写CPLEX的时候遇到过这个问题没有?
其实有过经验的小伙伴都知道该怎么处理了,但是小编决定还是写一下避免刚入行的小伙伴们踩坑。
这个错误呢查了ibm knowledge center显示如下:
里面讲了一堆想必大家也懒得去看了,我来讲讲这类问题的解决方案吧~出现这个错误的原因不是编程上的问题,而是建模方式上的问题。简单来说就是目标函数或者约束上出现了非线性的数学表达式。
那么什么是线性和非线性呢?我这里引一下百度知道上一个非常通俗易懂的解释:
两个变量之间的关系是一次函数关系的——图象是直线,这样的两个变量之间的关系就zhi是“线性关系”;如果不是一次函数关系的——图象不是直线,就是“非线性关系”。比如说y=kx 就是线形的 而y=x^2就是非线形的线形的图形一般是一条直线。
“非线性”的意思就是“所得非所望”。一个线性关系中的量是成比例的:十枚橘子的价钱是一枚的十倍。非线性意味着批发价格是不成比例的:一大箱橘子的价钱比一枚的价钱乘以橘子的个数要少。这里重要的观念是“反馈”——折扣的大小反过来又影响顾客购买的数量。
也就是说你的模型中很可能出现了多个变量相乘的情况,例如下面这种情景:
要解决这个问题,首先就得想你的模型给linearlized了。而最常用的做法就是“大M”法了,通过增加一个充分大的数,将多个相乘的变量给拆开,从而达到线性化的目的。
不过像上图那种情况就非常麻烦(其实是我建模建错了),今天就先不讨论。举个简单的例子,VRP的arc-flow模型中货物流常见的约束如下:
其中 Q j k Q_j^k Qjk和 x i , j k x_{i,j}^k xi,jk为决策变量, Q j k Q_j^k Qjk表示车辆 k k k离开客户 j j j以后的载重量,而 x i , j k x_{i,j}^k xi,jk为1表示车辆走过边( i , j i, j i,j),否则为0。这条约束的含义是非常明了的,如果车辆经过边( i , j i, j i,j),那么该车辆离开客户 j j j的载重量必须大于等于车辆离开客户 i i i的载重量加上客户 j j j的需求量,这是货物流平衡。
可以看到不等式右边出现了变量和变量相乘的情况,这就造成了我们刚刚说的“非线性”问题,那么这个模型放进cplex中肯定会报“not convex”的错误。为了让cplex能求解该模型,我们需要将非线性的约束转成线性的。
常见的一个办法是引入一个充分大的数,我们都喜欢叫它大M。当然这个数具体要多大,是不是越大越好,也不一定,后面我再讲。
先观察约束(8)右端的式子,发现只有当 x i , j k x_{i,j}^k xi,jk为1时,才需要 Q j k ≥ Q i k + q i Q_j^k \ge Q_i^k + q_i