博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 调用 cplex
阅读量:5298 次
发布时间:2019-06-14

本文共 2699 字,大约阅读时间需要 8 分钟。

最近使用 java 调用 cplex, 发现 cplex 对 java 的支持比对matlab强大多了,类跟方法有几百个。

但这些类和方法的注释并不是特别详细,还需要结合例子来看懂。

一、 准备工作:导入 cplex 库 到 eclipse 中

1. 首先从官网上下载 cplex: 

https://www.ibm.com/developerworks/community/blogs/jfp/entry/CPLEX_Is_Free_For_Students?lang=en, 这个页面能申请学术版。

http://www-01.ibm.com/software/websphere/products/optimization/cplex-studio-community-edition, 这个是普通的免费版,最多只能有1000个约束条件和1000个变量。

cplex 的 java 使用手册:http://download.csdn.net/download/robert_chen1988/10119473

2. 将 cplex库导入java里面。

新建一个java项目,右键单击项目,build path, add libraries, 如下图所示:

然后选择 user library,  刚开始里面并没有 cplex库,那么我们继续 点击 user libraries 将 cplex 库添加进来。选择新建,如下图所示:

可以命名为 cplex, 然后开始导入cplex 的库:

选择导入外部 jar, 选择 cplex 安装目录中的 lib 文件夹,将 cplex.jar 添加进去即可,这个项目就能调用 cplex 了。

3.  添加 cplex 的java 例子。

cplex 的 java 例子在安装程序的 cplex\examples\src\java 目录下, 可以在java 项目里新建一个package,将 例子全部导进去,就能查看例子了。

二、求解问题。

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

\begin{align} &\max\quad &&x_1 + 2x_2 +3x_3\nonumber\\ &s.t.&&\nonumber\\ & &&-x_1 + x_2 + x_3 \leq 20\nonumber\\ & &&x_1 - 3x_2 + x_3 \leq 30\nonumber\\ & &&0\leq x_1\leq 40\nonumber \end{align}

java 中的 cplex 代码如下:

import ilog.concert.IloException;import ilog.concert.IloNumVar;import ilog.cplex.IloCplex;public class LP1 {	public static void main(String[] args) {		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);		}	}}
输出结果:

Tried aggregator 1 time.

No LP presolve or aggregator reductions.
Presolve time = 0.00 sec. (0.00 ticks)
Iteration log . . .
Iteration:     1   Dual infeasibility =             0.000000
Iteration:     2   Dual objective     =           202.500000
Solution status = Optimal
Solution value = 202.5
x1  = 40.0
x2  = 17.5
x3  = 42.5

2.  使用java 调用 cplex 的几点感受:

(1)使用 IloCplex 类新建一个 cplex 类, 使用 IloNumVar 定义求解变量, 使用 addMaximize 或addMinimize 定义求解目标, 

使用 addLe 添加约束条件, 使用 solve() 方法求解。

(2)使用 IloNumExpr 定义中间变量。

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

转载于:https://www.cnblogs.com/robinchen/p/11047609.html

你可能感兴趣的文章
无责任Windows Azure SDK .NET开发入门篇二[使用Azure AD 进行身份验证--2.1使用Azure AD需要了解几个概念]...
查看>>
python字符串函数总结
查看>>
linux查看是否安装JDK(转载)
查看>>
游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
查看>>
[新]最近用unity5弄的一些渲染
查看>>
mybatis-servlet.xml配置SpringMVC样板
查看>>
启动eclipse是报 no java virtual machine was found after searching the following location
查看>>
ZOJ Problem Set Vol 1(Update paste)
查看>>
头文件dirent.h
查看>>
lol人物模型提取(八)
查看>>
USACO / Factorials (简单模拟)
查看>>
5月4日上午学习日志
查看>>
(译)IOS block编程指南 2 block开始
查看>>
Data Structure Binary Tree: Lowest Common Ancestor in a Binary Tree
查看>>
java第二次作业
查看>>
Java 9 揭秘(14. HTTP/2 Client API)
查看>>
麦包包也看到了个性化推荐:数据驱动销售——个性化推荐引擎
查看>>
[原]NYOJ-子串和44
查看>>
django常用模板语言
查看>>
MySql数据库操作命令
查看>>