赞
踩
CPLEX是一种数学优化技术。主要用于提高效率、快速实现策略并提高收益率。使用 WebSphere ILOG CPLEX 的数学优化技术可以就资源的高效利用做出更佳决策。使用 CPLEX,可以将复杂的业务问题表现为数学规划 (Mathematic Programming) 模型。高级优化算法使您能够快速找到这些模型的解决方案。
这里需要自行百度cplex,在官网进行下载。实在不行可以在我的资源里免费下载:
https://download.csdn.net/download/weixin_51545953/20243291?spm=1001.2014.3001.5501
创建完之后的界面应该是这样的:
点击+号后选择第一个按钮"Java",会弹出下图窗口。
选择cplex安装路径下cplex\lib\cplex.jar (每个人的路径不同,可以参考图片)
选择好之后点击 “ok”
再点击 “ok”
这时,cplex就已经成功的导入idea了。
线性规划模型如下:
M a x Z = x 1 + 2 x 2 + 3 x 3 Max \ Z = x_1+2x_2+3x_3 Max Z=x1+2x2+3x3
s
.
t
.
x
1
+
2
x
2
+
x
3
<
=
100
s.t. \quad\quad\quad x_1+2x_2+x_3 <= 100
s.t.x1+2x2+x3<=100
x
1
+
x
2
−
2
x
3
>
=
10
\quad\quad\quad x_1+x_2-2x_3 >= 10
x1+x2−2x3>=10
−
10
<
=
x
1
<
=
50
\quad\quad\quad -10<=x_1<=50
−10<=x1<=50
x
2
>
=
0
\quad\quad\quad x_2>=0
x2>=0
x
3
=
5
\quad\quad\quad x_3 = 5
x3=5
Java调用cplex求解上述问题的代码如下:
import ilog.concert.IloException; import ilog.concert.IloLinearNumExpr; import ilog.concert.IloNumVar; import ilog.cplex.IloCplex; public class Main { public static void main(String[] args) throws IloException { // 创建cplex对象,往后基于此对象进行模型的建立与求解 IloCplex cplex = new IloCplex(); // 声明决策变量 x1,x2,x3 // x1 的取值范围是 -10 ~ 50 IloNumVar x1 = cplex.numVar(-10,50); // x2 的取值范围是 0 ~ 正无穷(这里用Double类型能接受的最大值代替正无穷) IloNumVar x2 = cplex.numVar(0,Double.MAX_VALUE); // x3 被限定为 等于 5 (相当于取值范围是5~5) IloNumVar x3 = cplex.numVar(5,5); // 定义目标函数表达式 IloLinearNumExpr target = cplex.linearNumExpr(); target.addTerm(1,x1); // addTerm(a,b) 是指将 a*b 追加到表达式中 target.addTerm(2,x2); target.addTerm(3,x3); // 声明求解目标函数的最大值,将目标函数加入到cplex模型中 cplex.addMaximize(target); // 添加约束 // 约束1:X1+2*X2+X3 <= 100 用表达式添加约束 IloLinearNumExpr expr1 = cplex.linearNumExpr(); expr1.addTerm(1,x1); expr1.addTerm(2,x2); expr1.addTerm(1,x3); cplex.addLe(expr1,100); // addLe(a,b) 代表令 a <= b // 约束2:X1+X2-2*X3 >= 10 IloLinearNumExpr expr2 = cplex.linearNumExpr(); expr2.addTerm(1,x1); expr2.addTerm(1,x2); expr2.addTerm(-2,x3); cplex.addGe(expr2,10); // addGe(a,b) 代表令 a >= b // 约束3 : x3 = 5 // (由于声明x3变量的时候范围已经限制在5~5之间,所以这里其实没有必有再写了 // 但是为了让大家了解addEq的用法,在这里还是演示一下) cplex.addEq(x3,5); // addGe(a,b) 代表令 a = b // 激动人心的求解时刻! // 只需要调用cplex.solve()即可 ,返回值为是否找到解 boolean isSolve = cplex.solve(); if(isSolve){ // 如果找到了解 double result = cplex.getObjValue(); // 获取解(目标函数最大值) System.out.println("目标函数最大值为:"+result); // 我们还可以看看x1,x2,x3分别取什么的情况下,使得目标函数达到最值 double x1_value = cplex.getValue(x1); double x2_value = cplex.getValue(x2); double x3_value = cplex.getValue(x3); System.out.println("x1 = "+x1_value); System.out.println("x2 = "+x2_value); System.out.println("x3 = "+x3_value); }else{ // 如果找不到解 System.err.println("此题无解"); } } } 输出结果: Tried aggregator 1 time. LP Presolve eliminated 2 rows and 2 columns. Aggregator did 1 substitutions. All rows and columns eliminated. Presolve time = 0.00 sec. (0.00 ticks) ---------------------------------------------------------上面是cplex求解器自带的输出,下面是我们手动写的输出 目标函数最大值为:110.0 x1 = -10.0 x2 = 52.5 x3 = 5.0
到这里我们就成功地用cplex+java求解了一个简单的线性规划问题啦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。