CPLEX出现‘q1‘ is not convex?

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

参考资源链接:[AMPL数学编程语言详解与应用](https://wenku.csdn.net/doc/58zjcqpwuu?utm_source=wenku_answer2doc_content) 要使用AMPL语言编写线性规划模型并通过CPLEX求解器获取优化结果,首先需要了解AMPL模型文件和数据文件的基本结构和编写方法。在此基础上,我们将通过一个简单的线性规划问题来演示整个流程。假设我们要解决的是一个经典的生产计划问题,目标是最大化利润,同时满足资源和市场的约束条件。 第一步是编写AMPL模型文件,定义决策变量、参数、目标函数和约束条件。以下是一个简单的AMPL模型文件示例: ```AMPL set PRODUCTS; # 产品集合 param profit {PRODUCTS} >= 0; # 各产品的利润 param resource_usage {PRODUCTS} >= 0; # 各产品对资源的使用量 param resource_limit >= 0; # 资源限制总量 var x {PRODUCTS} >= 0; # 生产各产品的数量 maximize Total_Profit: sum {p in PRODUCTS} profit[p] * x[p]; # 最大化总利润 subject to Resource_Constraint: sum {p in PRODUCTS} resource_usage[p] * x[p] <= resource_limit; # 资源使用限制 ``` 第二步是编写数据文件,为模型文件中的参数赋值。例如: ```AMPL data; set PRODUCTS := product1 product2 product3; param profit := product1 50 product2 60 product3 70; param resource_usage := product1 10 product2 20 product3 30; param resource_limit := 200; ``` 第三步是在模型文件中指定使用CPLEX求解器。这可以通过在文件顶部添加以下命令来完成: ```AMPL optionsolver cplex; ``` 第四步是运行AMPL程序。将模型文件和数据文件保存为同名但不同扩展名(如`problem.mod`和`problem.dat`),然后在命令行或终端中使用以下命令运行AMPL: ```bash ampl: model problem.mod; ampl: data problem.dat; ampl: solve; ampl: display x; ``` 执行上述命令后,AMPL会调用CPLEX求解器来解决线性规划问题,并输出最优解。在最后一步中,我们使用`display x;`来查看各产品的最优生产数量。 通过以上步骤,你就可以使用AMPL语言编写线性规划模型,并通过CPLEX求解器获取优化结果。为了深入理解和掌握这一过程,推荐进一步阅读《AMPL数学编程语言详解与应用》,这本书将为你提供更全面的理论知识和实际应用案例。 参考资源链接:[AMPL数学编程语言详解与应用](https://wenku.csdn.net/doc/58zjcqpwuu?utm_source=wenku_answer2doc_content)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值