CPLEX出现‘q1‘ is not convex?

本文介绍了在使用CPLEX优化工具时遇到'q1' is not convex错误的原因和解决方案。问题源于模型中出现了非线性表达式,通常由变量相乘导致。通过大M法,将非线性约束转换为线性,以适应CPLEX的求解。文章以货物流平衡问题为例,详细解释了如何应用大M法,并讨论了大M取值与CPLEX精度的关系,提醒读者在实际应用中需要注意的潜在问题。
摘要由CSDN通过智能技术生成

不知道大家在写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

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
出现"cplex does not support signomial constraints"的错误提示时,这意味着你在使用cplex时,遇到了不支持signomial约束的情况。signomial约束是一种非线性的数学表达式,而cplex是一个用于解决线性规划和混合整数规划问题的求解器,不支持这种类型的约束。为了解决这个问题,你需要将这些signomial约束转换为线性约束。 一种常见的解决方案是使用近似方法,比如将signomial函数进行泰勒级数展开,只保留前几项进行近似。这样可以将signomial约束转化为一组线性约束,使其符合cplex的要求。 另一种解决方案是将signomial约束进行离散化处理,将其分成一系列的线性约束。通过将变量的取值范围分成多个小区间,并在每个区间内引入线性约束,可以近似表示signomial约束。 总结起来,当cplex不支持signomial约束时,你可以考虑使用近似方法或离散化处理来转化这些非线性约束为线性约束,以便能够在cplex中求解该模型。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CPLEX出现q1‘ is not convex?](https://blog.csdn.net/qq_40178343/article/details/113573351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [CPLEX12.10资源下载](https://download.csdn.net/download/qq_38776397/87466823)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值