求解器解的最优性 | cplex、gurobi和COPT求解器求解出来的一定是最优解吗?有理论证明吗?

求解器解的最优性 | cplex、gurobi和COPT求解器求解出来的一定是最优解吗?有理论证明吗?

作者: 刘兴禄,清华大学,清华-伯克利深圳学院博士在读

欢迎关注我们的微信公众号 运小筹

在这里插入图片描述

之前有人在【运小筹读者2群】里问:cplex、gurobi和COPT求解器求解出来的一定是最优解吗?有理论证明什么的吗?

我给除了下面的回答,我觉得对大家会有用,因此稍加整理分享一下。

首先,对于MIP,给足求解时间,设置MIPGap的容差为0,最后得到的一定是最优解。

cplex、gurobi和COPT等求解器使用的是通用的branch and cut算法框架,该框架是精确算法框架。

一个最小化的MIP问题,其松弛问题,即线性松弛是其下界,任意一个可行解是上界。下界和上界的相对差距,就是间隙,optimality gap,简称gap,也就是求解日志最后一列。

求解MIP的分支切割算法,是将精确算法割平面算法融入到另一个精确算法:分支定界框架中。

分支定界本质上是一种分而治之的隐枚举,通过隐枚举,更新全局最优上界和全局最优下界,整个过程都可以保证最优性,通过搜索,最后达到全局最优。

割平面法用来割去小数最优解,并且收紧可行域,加速求解,逼近凸包。

最终整个框架的最优性,通过gap得到证明。gap就是当前解距离最优解的 最大可能的 相对差距。gap等于0,说明当前解一定是全局最优解。

具体理论证明,分为这么几个大的部分:以min问题为例

  1. 一个LP,如果可行,我们是可以通过单纯形法,或者内点法求解到最优解的,最优性通过检验数等相关内容可以得到证明。具体证明见单纯形法相关内容。

  2. 一个MIP的线性松弛是一个LP,这个LP的最优解,是MIP一个下界,这个MIP的最优解不可能比这个小。

  3. 任意一个整数可行解,一定是MIP的一个上界。MIP的最优解一定小于等于这个可行解。

  4. 分支定界算法,通过隐枚举,更新全局上界和下界,一定可以保证最后得到最优解。具体证明见分支定界的全局上界和下界的证明。

  5. 割平面法,不会割去任何整数可行解。因此割平面法的使用,不会影响最优性,只是加速作用。

以上5个部分各自的证明,可以详细去看,我只是说了结论。以上5个部分,是cplex,gurobi等求解器求解MIP的算法框架branch and cut的主要内容,这每一个内容都有非常完善的理论证明以及最优性保障,综合起来,这个算法框架就是精确算法框架。如果模型有可行解,并且给足足够的求解时间,求解器100%可以保证得到最终的最优解。

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
在Matlab中调用Cplex求解并定义四元变量的步骤如下: 1. 首先,需要确保已经安装了Cplex求解并在Matlab中配置了Cplex的路径。 2. 然后,可以使用Matlab中的cplex对象来定义四元变量,代码示例如下: ``` % 创建Cplex对象 cplex = Cplex(); % 定义四元变量 cplex.addCols(zeros(1,4),[],[],[0 0 0 0],[1 1 1 1]); % 设置四元变量的类型为连续型 cplex.Model.objSense = -1; cplex.Model.lb = [0 0 0 0]; cplex.Model.ctype = 'CCCC'; ``` 在上面的代码中,`addCols`用于添加四元变量,`zeros(1,4)`表示四元变量的系数向量,[]表示约束条件,[0 0 0 0]表示四元变量的下界,[1 1 1 1]表示四元变量的上界。`Model.ctype = 'CCCC'`表示四元变量的类型均为连续型变量。 3. 最后,可以使用cplex对象来求解优化问题,例如: ``` % 定义优化问题 cplex.Model.sense = 'minimize'; cplex.Model.obj = [1 2 3 4]; cplex.addRows([1 1 1 1], 10, 'R1'); cplex.addRows([2 3 1 5], 15, 'R2'); cplex.solve(); % 显示最优解 disp(cplex.Solution.x); ``` 在上面的代码中,`Model.sense = 'minimize'`表示最小化目标函数,`Model.obj = [1 2 3 4]`表示目标函数的系数向量,`addRows`用于添加约束条件,`solve()`用于求解优化问题,`Solution.x`表示最优解的值。 注意:四元变量的定义方式与其他变量的定义方式相同,只是需要定义四个系数,即四元变量的系数向量为[系数1,系数2,系数3,系数4]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值