CPLEX在IDEA中的使用

本文详细介绍了如何在Java项目中使用CPLEX库解决线性规划问题,包括创建Cplex对象、定义决策变量、目标函数、约束和求解过程。
摘要由CSDN通过智能技术生成

1、新建一个项目:文件——新建——项目——两个下一步(不用从模板中创建)——写项目名称——完成——scr右击新建java类——写名称——回车键

2、文件——项目结构

3、点击Libraries/库

4、加号——JAVA

5、找到cplex.jar文件,在

《根据CPLEX的安装路径》\CPLEX1210\CPLEX_Studio\cplex\lib\cplex.jar

6、两个确定

7、还要添加一个bin文件

《根据CPLEX的安装路径》\CPLEX1210\CPLEX_Studio\cplex\bin\x64_win64

8、点击应用——确定

9、测试:别人博客里的,我忘了谁的了。。。。

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

结果:不知道为什么,输出有乱码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值