背景

  • ortools在求解MIP问题时默认使用CBC求解器,但支持调用第三方求解器:GLPK、Gurobi、CPLE和SCIP,调用第三方求解器时需要单独安装,同时ortools源码编译。
  • 很多人遇到CBC求解器不能求得最优解的情况,实际上默认求解器是基于启发式求解的,如果仍然使用ortools进行建模,需要调用第三方求解器。
  • 网上几乎没有介绍如何利用ortools调用第三方求解器,各种第三方求解器安装方法比较繁琐,按照官方介绍的步骤踩了超级多的坑才形成本文(按照我的步骤,绝对没问题)。
  • 即使默认求解器能够求得最优解,你也可以尝试第三方求解器(快的飞起)。

GLPK求解器

  • GLPK (GNU Linear Programming Kit) 是 GNU 项目开发并维护的一个线性规划工具包,用于建立大规模线性规划LP和混合型整数规划MIP问题,并对模型进行最优化求解。由于是GNU下的项目,因此没有商业非商业的版本限制,可以自由使用。
  • 链接:http://ftp.gnu.org/gnu/glpk/,下载最新版本glpk-4.60.tar.gz
  • tar -xzvf glpk-4.60.tar.gz
  • cd glpk-4.60
  • configure --prefix=你的路径/glpk (记住路径很重要,是安装的第一层路径,默认在usr/local,求解器glpsol在bin目录下)
  • make
  • make install

CPLEX求解器

  • CPLEX 是 IBM 开发的一个商用线性规划求解器。该软件具有执行速度快、其自带的语言简单易懂、并且与众多优化软件及语言兼容(与C++,JAVA,EXCEL,Matlab,Python等都有接口)。
  • 支持求解求解线性规划(LP)、二次规划(QP)、带约束的二次规划(QCQP)、二阶锥规划(SOCP)等四类基本问题,以及相应的混合整数规划(MIP)问题。
  • 直接通过pip install cplex会发现使用的是社区版,运行规模较小(好像最大1000变量和1000约束)。
  • 最好在官网下载免费版,网址:https://www.ibm.com/analytics/cplex-optimizer
  • cd 你的路径/cplex(是第一层路径)
  • python setup.py install --home 你的路径/cplex

SCIP求解器(推荐)

  • 支持求解混合整数(非线性)规划、Constraint integer programming。
  • 下载scipoptsuite压缩包:https://scip.zib.de/index.php#download
  • tar xvf scipoptsuite-6.0.2.tgz
  • cd scipoptsuite-6.0.2
  • 深坑(花了半天时间解决):目前测试7.0.0版本,在编译时会报错,所以一定要选择6.0版本,不清楚scip什么时候会修复这个问题:
  • 执行make,可能会报错:
  • 解决办法,执行(深坑):brew install boost
  • 然后执行:make
  • make install INSTALLDIR=你的路径/scip(第一层安装路径)
  • make test(测试是否安装成功)

ortools安装(可调用第三方求解器)

  • 不使用第三方求解器的情况下,可直接pip install ortools,默认安装解决MIP问题只有CBC求解器,基于启发式,经常不能求得最优解。
  • 若使用第三方求解器,需要从ortools源码编译:
  • git clone https://github.com/google/or-tools
    Copy
  • 深坑中的深坑:直接clone默认stable分支,分支中ortools/ortools/linear_solver/http://scip_interface.cc文件存在错误,需要注释掉scip_callbace的引用(不清楚作者为什么没有发现,还是stble版本):
  • 或者直接指定master版本(则无需更改):git clone -b master https://github.com/google/or-tools
  • make third_party
  • 此时需要将第三方求解器的路径添加到Makefile.local文件中,每加一个求解器就要加一个路径,如下图GLPK求解器所示(注意变量名称和路径层级),如:UNIX_SCIP_DIR、UNIX_GLPK_DIR、UNIX_CPLEX_DIR
  • make python
  • make test_python(测试)
  • make clean
  • make all
  • make install_python
  • 愉快的玩耍,参数可选:pywraplp.Solver.GLPK_MIXED_INTEGER_PROGRAMMING、pywraplp.Solver.SCIP_MIXED_INTEGER_PROGRAMMING、pywraplp.Solver.CPLEX_MIXED_INTEGER_PROGRAMMING

实例

from ortools.linear_solver import pywraplp
from ortools.algorithms import pywrapknapsack_solver
def main():# Create the mip solver with the CBC backend.solver = pywraplp.Solver('simple_mip_program',pywraplp.Solver.SCIP_MIXED_INTEGER_PROGRAMMING)infinity = solver.infinity()x = solver.IntVar(0.0, infinity, 'x')y = solver.IntVar(0.0, infinity, 'y')print('Number of variables =', solver.NumVariables())solver.Add(x + 7 * y <= 17.5)solver.Add(x <= 3.5)print('Number of constraints =', solver.NumConstraints())solver.Maximize(x + 10 * y)status = solver.Solve()if status == pywraplp.Solver.OPTIMAL:print('Solution:')print('Objective value =', solver.Objective().Value())print('x =', x.solution_value())print('y =', y.solution_value())else:print('The problem does not have an optimal solution.')if __name__ == '__main__':main()

cplex求解整数规划_Ortools调用第三方求解器相关推荐

  1. 在APP里调用第三方文件管理器进行管理文件

    在一些APP开发项目中碰到如下情况: 需要管理指定目录下的文件(进行浏览.删除.排序.发送等等操作),然而自己开发这些功能显得比较费劲.这时完全可以借助开源的第三方文件浏览器实现. 在github上有 ...

  2. 迅雷9边下边播绑定第三方播放器

    迅雷9边下边播绑定第三方播放器 测试版本(迅雷9绿色版) 测试播放器 测试版本(迅雷9绿色版) 测试播放器 目前测试的播放器为potplayer.爱奇艺万能播放器,再加上又重新开始更新的QQ影音,之前 ...

  3. c++调用cplex求解例子_Java调用cplex求解运输问题

    Java调用cplex求解运输问题 本文中的课件来自清华大学深圳国际研究生院,物流与交通学部张灿荣教授<生产管理>课程. 运输问题(Transportation Problem)描述 运输 ...

  4. c++调用cplex求解例子_c++调用CPLEX环境配置

    详情见公 号​mp.weixin.qq.com 很难想象没有求解软件的几十年前 那些杰(苦)出(逼)的运筹学博士 要花多少个日日夜夜亲自撸一遍所有代码 才能把结果跑出来 毕(个)业(人)难(能)度(力 ...

  5. Python 调用 SCIP 求解器的选址模型代码示例

    本文介绍 Python 语言调用 SCIP 求解器,求解选址模型的代码示例. 安装 SCIP 和 PySCIPOpt 安装 SCIP 求解器的教程: SCIP | 数学规划求解器SCIP超详细的使用教 ...

  6. python调用开源求解器scip求解运输问题

    运输问题 运输问题(transportation problem)一般是研究把某种商品从若干产地运至若干个销地而使总运费最小的一类问题.一种特殊的线性规划问题,由于其技术系数矩阵具有特殊的结构,可以使 ...

  7. 拉格朗日松弛求解整数规划浅析(附Python代码实例)

    运筹优化博士,只做原创博文.更多关于运筹学,优化理论,数据科学领域的内容,欢迎关注我的知乎账号:https://www.zhihu.com/people/wen-yu-zhi-37 拉格朗日松弛是一种 ...

  8. 数学建模 割平面算法求解整数规划基本原理与编程实现

    基本思想 松弛问题:线性规划 割掉一块全部都是小数的区域(这一部分取不到整数) 案例 1)横坐标x1,纵坐标x2 2)蓝色小三角形的区域:x2:(1,7/4) x1:(0,3/4) 这块区域,x1与x ...

  9. 【运筹优化】Python调用OR-Tools求解TSP问题

    文章目录 一.安装or-tools 二.旅行商问题简介 三.调用or-tools求解TSP问题 1.引入相关包 2.定义数据Model 3.创建路由模型 4.创建距离回调 5.设置旅行费用 6.设置搜 ...

  10. Python_真值表求解器(逻辑表达式的求解)(eval实现求解)【2022-01-22】

    Python_真值表求解器(逻辑表达式的求解)(eval实现求解)[2022-01-22] 1.TruthValueSolver.py 2.结果示例 2.1 含有非规定字符的输入 2.2 && ...

最新文章

  1. Recommender Systems基于内容的推荐
  2. (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致...
  3. 数据中心变得更加灵活和可靠的五种方式
  4. 【企业管理】人力资源是CEO的第一工程
  5. 最新发布丨游戏市场“超预期”增长背景下,如何加速产品精品化 运营精细化?
  6. OS / linux / 互斥锁实现原理(futex)
  7. ruby hash方法_Ruby中带有示例的Hash.keys方法
  8. C++学习笔记-windows底层粗略认识
  9. ubuntu16.04下ROS操作系统学习笔记(九)Moveit
  10. 关于网页内容加速黑科技的趣谈
  11. 数字逻辑课程设计--电子闹钟
  12. 安卓微信本地数据库解密
  13. 微信新表情真的太骚了!!
  14. 该虚拟机似乎正在使用中
  15. 【必须知道的职场情商训练7法】
  16. python学习笔记(4)—— 模型
  17. 史上最全面的python学生管理系统教程(二)
  18. 全球与中国太阳镜片市场现状及未来发展趋势2022-2028
  19. 大数据的误区——何为真正的大数据
  20. 3_计算机网络_网路层-IP-子网划分-路由-ping

热门文章

  1. 2 网段 Vlan+NAT 配置
  2. 基于zookeeper实现分布式读写锁
  3. springAOP 之 前置输出
  4. 【答疑】对象存储OSS常见问题解答(SDK类2)
  5. 2016-2017 ACM Central Region of Russia Quarterfinal Programming Contest
  6. Sequence I
  7. 《CMOS集成电路后端设计与实战》——第2章 集成电路后端设计方法
  8. 《HTML5+CSS3网页设计入门必读》——1.11 小结
  9. 扑克牌的完美洗牌算法
  10. Effective C# 原则3:选择is或者as操作符而不是做强制类型转换(翻译)