CPLEX求解器入门案例

9 篇文章 1 订阅
其他文章:

通过0-1背包问题看穷举法、贪心算法、启发式算法(JAVA)

模拟退火(SA)算法实例介绍(JAVA)

遗传算法(GA)实例介绍(JAVA)

CPLEX求解器入门案例

java集成Cplex:Cplex下载、IDEA环境搭建、docker部署

windows下cplex12.6.3的下载、安装、IDE编程及相关问题解决

windows下cplex20.1.0启动报错: ilog.odms.ide.opllang.IloOplLangPlugin

Cplex20.1版本bin包Linux安装过程


参考B站视频:cplex入门到精通

CPLEX求解器入门案例

官方中文JAVA手册:https://www.ibm.com/docs/zh/icos/12.9.0?topic=application-structure

cplex是IBM开发的一款线性规划问题的求解器。

一、适用范围

cplex适用于求解的问题类型:

CPLEX的适用范围:
     1.适用于一般的线性规划(LP)问题.
     2.CPLEX 还可对 LP 的多个扩展求解:
         2.1.网络流问题,是 LP 的一种特殊情况,CPLEX 可以通过利用问题结构以快得多的速度对其求解。
         2.2.二次规划 (QP) 问题,其中 LP 目标函数扩展为包括二次项。
         2.3.二次约束规划 (QCP) 问题,在约束中包括二次项。 实际上,CPLEX 可对二阶锥规划 (SOCP) 问题求解。
         2.4.混合整数规划 (MIP) 问题,其中任意或所有 LP、QP 或 QCP 变量都进一步限制为采用最优解法中的整数值,并且 MIP 自身扩展为包括诸如特殊有序集合 (SOS) 和半连续变量之类的构造。

二、求解步骤

  1. 创建(IloCplex)
  2. 构建变量(IloNumVar)
  3. 构建表达式(IloNumExpr、IloLinearNumExpr)
  4. 构建目标函数(IloObjective)
  5. 构建约束条件(IloRange)
  6. 求解
  7. 获得求解的结果精确信息

三、编码测试

package com.wuxiaolong.cplex;

import ilog.concert.*;
import ilog.cplex.IloCplex;
/**
  *  测试模型:
  *  目标函数: max y = x[0] + 2*x[1] + 3*x[2]
  *  约束条件: -x[0] + x[1] + x[2] <= 20.0       0<= x[i] <=100
  */
public class Test1 {

    public static void main(String[] args) throws Exception{

        try{
            
            // 1.创建模型
            /**
             * 第一个任务是创建 IloCplex 对象。 它用于创建表示模型所需的所有建模对象。
             * 例如,通过调用 model.intVar(0, 10) 来创建具有界限 0 和 10 的整数变量,其中 model 是 IloCplex 对象。
             */
            IloCplex model = new IloCplex();


            /**
             * 类 IloCplex 实现 接口 IloModeler 及其扩展 IloMPModeler 和 IloCplexModeler。
             * 这些接口为以下类型的建模对象(可与 IloCplex 一起使用)定义构造函数:
             *
             * 建模类           描述
             * IloNumVar	 建模变量
             * IloRange	     类型为 lb <= expr <= ub 的范围约束
             * IloObjective	 优化目标
             * IloNumExpr	 使用变量的表达式  表达式可用于为模型创建约束或目标函数
             *
             */

            // 2.IloNumVar 构建变量
            // 以下说明如何创建三个连续变量(全部具有界限 0 和 100):
            IloNumVar[] x = model.numVarArray(3, 0.0, 100.0);

            // 3.IloNumExpr 构建表达式
            // 建模变量构建类型为 IloNumExpr 的表达式,以供在优化模型的约束或目标函数中使用。 例如,表达式: x[0] + 2*x[1] + 3*x[2]
            IloNumExpr expr1 = model.sum( // 求表达式的和
                    x[0],
                    model.prod(2.0, x[1]),  // 求表达式的积
                    model.prod(3.0, x[2])
            );

//            // 3.IloLinearNumExpr 构建表达式
//            // 创建表示同一表达式的对象的另一种方法是使用表达式 IloLinearNumExpr。优点在于可以更轻松在循环中构建线性表达式。
//            // 接口 IloLinearNumExpr 是 IloNumExpr 的扩展,因此可在能够使用表达式的任意位置进行使用。
//            IloLinearNumExpr expr2 = model.linearNumExpr();
//            expr2.addTerm(1.0, x[0]);
//            expr2.addTerm(2.0, x[1]);
//            expr2.addTerm(3.0, x[2]);


            // 4.构建目标函数
            // 在其求解的模型中使用该目标  model.addMaximize()  model.addMinimize()
            // 创建和添加目标有一种快捷表示法:
            IloNumExpr object = expr1;
            IloObjective iloObjective = model.addMaximize(object);

            // 5.构建约束条件
            // 向模型中添加约束 例如,约束: -x[0] + x[1] + x[2] <= 20.0
            IloRange iloRange = model.addLe(model.sum(model.negative(x[0]), x[1], x[2]), 20);

            //同样,为添加其他约束类型(包括等同性约束、大于或等于约束和范围约束)提供了许多方法。
            // 在内部,它们全部表示为具有相应界限选项的 具有相应界限选择的 IloRange 对象,因此所有这些方法才会返回 IloRange 对象。
            // 另请注意,可能已通过许多不同方式创建先前表达式,包括使用 IloLinearNumExpr。


            // 6.求解
            // 该方法返回布尔值以指示优化是否成功找到解法。 如果未找到解法,那么会返回 false。
            // 如果返回 true,那么表明 CPLEX 找到可行解法,尽管其未必是最优解法。
            // 可以从 getStatus 方法获取有关上次调用 solve 方法的结果的更精确信息。
            boolean solve = model.solve();

            // 7.获得求解的结果精确信息
            // 返回值告诉您 CPLEX 找到的有关模型的信息:它找到最优解法还是仅找到可行解法;
            // 它证明模型无边界还是不可行;或者此时是否尚未证明任何内容。
            // 通过 getCplexStatus 方法可获取有关终止优化器调用的甚至更详细的信息,参考https://www.ibm.com/docs/en/icos/12.9.0?topic=c-ilocplexstatus。
            if(solve){
                model.output().println("解的状态: " + model.getStatus());
                model.output().println("目标函数值: " + model.getObjValue());
                // 对应的未知变量的值
                double[] xVal = model.getValues(x);
                String msg = "";
                for( double t : xVal){
                    msg = msg + t + "    ";
                }
                model.output().println("决策变量取值(按顺序): " + msg);

            }else {
                model.output().println("未找到解法");
            }


            // 8.关闭求解器
            // 一定要关闭求解器,否则会内存泄漏
            model.end();

        }catch (IloException e){
            // 捕获Cplex定义的异常
            System.out.println("模型出错了"+e.getMessage());
        }catch (Exception e){
            // 系统未知异常
            System.out.println("未知异常"+e.getMessage());
        }

    }
}

四、运行结果

image-20211020204512484

五、官方案例

安装完成cplex后,在安装目录里有很多案例可以看。

image-20211020205113733

image-20211020204624322

JAVA参考案例:

https://www.ibm.com/docs/zh/icos/12.9.0?topic=cplex-java-examples

  • 5
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Pyomo中使用CPLEX求解,你需要先安装CPLEX软件,并配置Pyomo以使用CPLEX求解。下面是安装CPLEX求解的一般步骤: 1. 下载CPLEX软件:访问IBM的官方网站,下载适用于你的操作系统的CPLEX软件。请确保下载与你的操作系统和Python版本兼容的版本。 2. 安装CPLEX软件:按照官方文档提供的说明,运行安装程序,并按照向导中的步骤完成安装过程。确保选择适用于Python的安装选项。 3. 配置环境变量:在安装完成后,你需要将CPLEX的安装路径添加到系统的环境变量中。具体步骤取决于你使用的操作系统。在Windows上,你可以在“控制面板”中找到“系统”>“高级系统设置”>“环境变量”来进行配置。 4. 安装CPLEX Python API:CPLEX提供了Python API,允许Pyomo与CPLEX求解进行交互。你可以使用pip命令来安装CPLEX Python API。在终端或命令提示符中运行以下命令: ``` pip install cplex ``` 这将安装CPLEX Python API,并使其可用于Pyomo。 5. 配置Pyomo以使用CPLEX求解:在Pyomo代码中,你需要指定使用CPLEX求解。在创建Pyomo求解对象时,可以指定使用CPLEX求解。例如: ```python from pyomo.environ import * model = ConcreteModel() # 定义模型和变量 # 创建求解对象并指定CPLEX求解 solver = SolverFactory('cplex') # 求解模型 solver.solve(model) ``` 请注意,如果你在安装CPLEX软件时选择了默认安装路径,Pyomo通常能够自动找到CPLEX求解。 安装和配置CPLEX求解可能会因操作系统和软件版本而有所不同。建议参考IBM的官方文档和支持资源,以获得关于安装和配置CPLEX求解的详细说明。 希望这个回答对你有帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值