前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >干货 | cplex介绍、下载和安装以及java环境配置和API简单说明

干货 | cplex介绍、下载和安装以及java环境配置和API简单说明

作者头像
用户1621951
发布2019-07-17 18:02:06
5K2
发布2019-07-17 18:02:06
举报
文章被收录于专栏:数据魔术师数据魔术师

最近学习列生成算法,需要用到优化求解器。所以打算学习一下cplex这个商业求解器。

当然也有其他更多的选择,这里暂时以比较容易上手和性能比较好的cplex开始吧。其实,小编也早就想学习使用这个cplex了,毕竟是个好东西。

01 Cplex是什么?

Cplex是IBM公司开发的一款商业版的优化引擎,当然也有免费版,只不过免费版的有规模限制,不能求解规模过大的问题。

Cplex专门用于求解大规模的线性规划(LP)、二次规划(QP)、带约束的二次规划(QCQP)、二阶锥规划(SOCP)等四类基本问题,以及相应的混合整数规划(MIP)问题。

优势:

能解决一些非常困难的行业问题;

求解速度非常快;

提供超线性加速功能的优势。

在Cplex的加持下,使得matlab对于大规模问题,以及线性规划的效率,都得到飞跃的提升。

02 Cplex下载和安装

由于商用版太贵,现在已经能申请教育版了,功能和商用版一样。

刚好学长之前申请过一个教育版的,所以这里直接给大家分享一个出来了,这个版本是无限制的,便于我们后续的学习:

下载请移步留言区。

直接下载下来安装即可。至于安装,非常简单,一路下一步即可。

由于是基础教程,所以小编会一步一个脚印带领大家上手,从入门到放弃的那种。不过主要是侧重于Java和C++调用cplex库,关于OPL建模语言就请读者们自行学习啦。

03 cplex的java环境配置

因为小编一般用的C++和Java比较多,而且现在开发大型算法用这类面向对象的编程语言也方便得多。

基于上面的种种考虑,加上时间和精力有限,所以就暂时只做C++和Java的详细教程辣。关于matlab和python的也许后续会补上的吧。

然后在开始之前,照例先把环境给配置好。那么就先配置java的环境吧。

前面已经说了怎么下载和安装cplex了,如图:

确保已经安装上这个版本,我们才能开始下一步的工作。

3.1

将CPLEX库导入ECIPLSE

java小编一般用的ide是eclipse,就配置一下关于eclipse的。其他的开发环境请大家自行设置哈。

新建一个工程,添加一个package,添加一个带main函数的类。代码先别写。

在项目右键,选择build path -> Configure Build Path……

找到Libraries->Add External JARs……,然后定位到\lib这个文件夹,把cplex.jar给添加进去。

到这一步还不行,还需要把CPLEX的动态运行库给添加进去,好让java程序运行的时候能够找到。

具体做法是:

1. 在项目右键,选择build path -> Configure Build Path……

2. 找到Libraries,点开JRE System Library

3. 在Native library location那里点edit,把cplex下的\bin\x64_win64文件夹给添加进去。这里面有程序运行所需要动态库。

3.2

求解一个简单的模型

一个简单的线性规划问题:

把下面代码复制进main函数里面:

代码语言:javascript
复制
try {
            IloCplex cplex = new IloCplex(); // creat a model
            
            double[] lb = {0.0, 0.0, 0.0};
            double[] ub = {40.0, Double.MAX_VALUE, Double.MAX_VALUE};
            IloNumVar[] x = cplex.numVarArray(3, lb, ub);
            
            double[] objvals = {1.0, 2.0, 3.0};
            cplex.addMaximize(cplex.scalProd(x, objvals));
            
            double[] coeff1 = {-1.0, 1.0, 1.0};
            double[] coeff2 = {1.0, -3.0, 1.0};
            
            cplex.addLe(cplex.scalProd(x, coeff1), 20.0);
            cplex.addLe(cplex.scalProd(x, coeff2), 30.0);
            
            if (cplex.solve()) {
                cplex.output().println("Solution status = " + cplex.getStatus());
                cplex.output().println("Solution value = " + cplex.getObjValue());
                double[] val = cplex.getValues(x);
                for (int j = 0; j < val.length; j++)
                    cplex.output().println("x" + (j+1) + "  = " + val[j]);
            }
            cplex.end();
            
        } catch (IloException e) {
            System.err.println("Concert exception caught: " + e);
        }

点击运行,出现下面的结果就成功啦:

最后,如果提示找不到build path ,share libraries什么的,请确保第一步配置正确!至此,我们已经能愉快使用cplex啦。

04 Java 的相关API说明

cplex的java程序整体框架一般如下:

代码语言:javascript
复制
try {
        } catch (IloException e) {
            System.err.println("Concert exception caught: " + e);
        }

1. 使用 IloCplex 类新建一个 cplex 类。

2. 使用 IloNumVar 定义求解变量。

3. 使用 addMaximize 或addMinimize 定义求解目标。

4. 使用 addLe 添加约束条件。

5. 使用 solve() 方法求解。

6. 使用 IloNumExpr 定义中间变量。

cplex 的 java api 不支持加减乘除符号,加必须用 sum 方法, 减必须用 diff 方法, 乘除必须用 prod 方法。

下一期我们将用cplex求解一个TSP问题的模型。期待吧~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据魔术师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档