基于Java的Cplex入门

article/2025/11/7 16:37:51

Cplex是一种数学优化技术。主要用于提高效率、快速实现策略并提高收益率。Cplex提供灵活的高性能优化程序,解决线性规划 (Linear Programming)、二次方程规划 (Quadratic Programming)、二次方程约束规划 (Quadratically Constrained Programming) 和混合整型规划 (Mixed Integer Programming) 问题。

在Eclipse下配置Cplex环境参考:在Ecplise下调用Cplex环境配置

基于Java的Cplex入门

  • 一. 前言
  • 二. Cplex入门
    • 2.1 程序模板
    • 2.2 创建模型
    • 2.3 定义优化参数
    • 2.4 设置目标函数及约束
      • 2.4.1 定义表达式
      • 2.4.2 定义目标函数
      • 2.4.3 定义约束
      • 2.4.4 清空表达式
    • 2.5 模型求解及输出
  • 三. 案例展示

一. 前言

目前基于Java的Cplex求解规划问题的文章或是教程并不算多,新手入门只能通过官方文档和别人少量的程序中总结摸索。我最近也在做规划相关的项目,在这里将我一些学习的心得和编码技巧分享给大家。

官网的界面如下图所示,大家根据自己Cplex的版本在左边选择对应版本的教程。入门时大家可以先从Getting Started with CPLEX开始,然后可以自己随便翻一翻看一看,但是我认为最重要的部分就是下面这个CPLEX Java Reference Manual,里面包含了所有API的使用方法及说明:

在这里插入图片描述
其中ilog.concert库包含了跟变量的定义相关的,例如优化变量的定义,表达式的定义等;ilog.cplex库包含了跟模型相关的,比如各类模型的定义,算法等。文档里给的API有非常多,但是常用的其实就那几个,接下来我将介绍一下Cplex编程的一般流程及常用接口。

二. Cplex入门

2.1 程序模板

Cplex程序的模板通常如下所示,我们只需要在相应的位置填写内容即可:

import ilog.concert.*;
import ilog.cplex.*;public class Cplex{ //类的名字必须跟.java的名字一样public static void main(String[] args) {try {// 1. 创建模型// 2. 定义优化参数// 3. 设置目标函数// 4. 设置约束// 5. 模型求解及输出} catch (IloException e) {System.err.println("Concert exception caught: " + e);}}
}

2.2 创建模型

IloCplex cplex = new IloCplex(); // creat a model

2.3 定义优化参数

这里定义将要求解的优化参数,参数类型包括单个变量、一维及二维数组类型。

//1.单个变量
//1.1 实数型变量
IloNumVar x= cplex.numVar(0, 5); 
//1.2 整型变量
IloIntVar x= cplex.intVar(0, 5); 
/*括号中的参数表示变量的取值范围,例如该变量的取值范围为0≤x≤5,若不想定义范围可以设置为-Double.MAX_VALUE和Double.MAX_VALUE,表示负无穷到正无穷*///2. 一维数组
// 2.1 实数型变量
IloNumVar[] x = cplex.numVarArray(3, 0.0, 5.0);
// 2.2 整型变量
IloIntVar[] x = cplex.intVarArray(3, 0, 5);
/*括号中的参数表示数组的大小、最小值和最大值*/
// 2.3 每个变量设置不同的范围
double[] rg = {0,5,1,2,4,5}; //每个变量的最小值和最大值
IloNumVar[] a = new IloNumVar[3];
for(int i=0;i<3;i++)
{a[i] = cplex.numVar(rg[2*i], rg[2*i+1]);
}
/*这种方式就将数组中的三个变量设置了不同的取值范围,分别为0-5,1-2,4-5*///3. 二维数组
//3.1 实数型变量
IloNumVar[][] x = new IloNumVar[2][];
for (int i=0; i<2; i++) 
{x[i] = cplex.numVarArray(2, 0.0, 5.0);
}
//3.2 整型变量
IloIntVar[][] x = new IloIntVar[2][];
for (int i=0; i<2; i++) 
{x[i] = cplex.intVarArray(2, 0, 5);
}
/*以上这种方式定义了2行2列的变量,变量范围为0-5,若像设置不同的取值范围,按照一维数组的方式修改即可

2.4 设置目标函数及约束

目标函数一般是取一个表达式的最大值或是最小值,约束一般是设定一个表达式的取值范围,他们有一个共同点就是都需要先定义表达式,而且他们定义表达式的方式是完全相同的。

2.4.1 定义表达式

如图所示,最后四个字母为Expr的方法即为可以定义的表达式类型:

在这里插入图片描述
官方根据表达式类型的不同提供了不同的接口,包括:

接口描述
IloIntExpr/IloNumExpr整数/实数表达式的基本公共接口
IloLinearIntExpr/IloLinearNumExpr整数/实数类型变量的一次线性表达式的接口
IloLQIntExpr/IloLQNumExpr具有线性和二次项的一般表达式
IloQuadIntExpr/IloQuadNumExpr整数/实数型二次数值表达式

大家可以根据自己表达式类型的不同选择适合自己接口形式,例如我的表达式为x1+2*x2+3*x3,属于线性类型,那么就可以一次线性表达式的接口:

//定义变量
IloNumVar[] x = cplex.numVarArray(3, -5, 5);IloLinearNumExpr cs= cplex.linearNumExpr();
cs.addTerm(1, x[0]);
cs.addTerm(2, x[1]); 
cs.addTerm(3, x[2]);

每个接口都提供了非常多的方法,大家可以在官方文档中查看各个接口的使用方法及说明。

尽管官方为不同形式的表达式提供了不同的接口,但是存在一定的问题,比如你无法在一次线性表达式中添加二次项,当表达式比较复杂的时候通常不止有一种类型。因此我比较习惯于就用最基本的公式接口IloNumExpr,在这个接口中你可以利用cplex模型库中的加减乘除来添加任何形式表达式。

先创建模型IloCplex cplex = new IloCplex();后就可以通过cplex.XXX的方式使用模型中各种运算方法,常用的包括:

方法说明方法说明
sum求和diff求差
prod乘积abs绝对值

有了以上这四种方法基本就可以应对大部分的表达式了,例如上面那个表达式x1+2*x2+3*x3,用基本公共接口表示为:

IloNumVar[] x = cplex.numVarArray(3, -5.0, 5.0);double[] a = {1,2,3};
IloNumExpr cs = cplex.numExpr();
for(int i=0;i<3;i++)
{cs = cplex.sum(cs,cplex.prod(x[i], a[i]));
}

虽然这种方式增加了代码量,但是代码的可读性增强了,所以我更喜欢用这种方式定义表达式。

下面我再举一个例子,求变量x的平方和和绝对值之和:

IloNumVar[] x = cplex.numVarArray(3, -5.0, 5.0);IloNumExpr cs1 = cplex.numExpr();
IloNumExpr cs2 = cplex.numExpr();
for(int i=0;i<3;i++)	
{cs1= cplex.sum(cs1,cplex.abs(x[i])); //绝对值之和cs2= cplex.sum(cs2,cplex.prod(x[i], x[i])); //平方和
}	

在定义了表达式之后就可以添加目标函数和约束了。

2.4.2 定义目标函数

假设定义后目标函数的表达式用obj表示:

函数含义
cplex.addMinimize(obj)求obj的最小值
cplex.addMaximize(obj)求obj的最大值

2.4.3 定义约束

假设定义后约束的表达式用cs表示:

函数含义函数含义
cplex.addEq(cs,a)cs=acplex.addGe(cs,a)cs≥a
cplex.addLe(cs,a)cs≤acplex.addRange(a,cs,b)a≤cs≤b

在添加了约束后我们可以通过cplex.diff(cs,cs)来清空表达式cs,然后就可以在cs中添加新的表达式。

2.4.4 清空表达式

有时候在定义目标函数和约束时需要通过循环来定义新的表达式,每次重新初始化表达式很麻烦,这时候就需要清空表达式:

  • cplex.diff(cs,cs)
  • cs = cplex.numExpr()

第一种方式有时候会报内存溢出的错误,因此推荐使用第二种方式。

2.5 模型求解及输出

模型求解及输出的模板如下所示:

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++)System.out.println("x" + (j+1) + "  = " + val[j]);
}
cplex.end();

其中:

函数含义
cplex.getStatus()获得模型求解的状态
cplex.getObjValue()获取目标函数的值
cplex.getValues(x)获取优化变量的值
cplex.end()结束模型

模型求解包括以下几个状态:

状态含义状态含义
Optimal找到了一个最优的解决方Feasible找到了一个可行的解决方案
Infeasible该模型不可行Error遇到了错误
Bounded模型不是无界的Unbounded模型是无界的

三. 案例展示

在这里插入图片描述

import ilog.concert.*;
import ilog.cplex.*;public class test {public static void main(String[] args) {try {IloCplex cplex = new IloCplex(); // create a modelIloNumVar[] x = cplex.numVarArray(3, -Double.MAX_VALUE, Double.MAX_VALUE);IloNumExpr cs1 = cplex.numExpr();for(int i=0;i<3;i++){cs1 = cplex.sum(cs1,cplex.prod(x[i], x[i]));}cplex.addMinimize(cs1);cplex.addEq(cplex.sum(x[0], x[1]),1);cplex.addEq(cplex.sum(x[0], x[2]),1);cplex.addEq(cplex.sum(x[1], x[2]),1);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++)System.out.println("x" + (j+1) + "  = " + val[j]);}cplex.end();} catch (IloException e) {System.err.println("Concert exception caught: " + e);}}
}

运行结果为:
在这里插入图片描述

程序比较简单这里不再做讲述,大家可以结合第二部分的内容理解一下。

总而言之,别人的程序、官方文档和官方案例是学习Cplex的最好教程,希望大家多加摸索!


http://chatgpt.dhexx.cn/article/e0Zgxywx.shtml

相关文章

python 调用cplex-学术版

转载 https://zhuanlan.zhihu.com/p/101713127 本文要解决的问题&#xff08;默认你已经对python有一定的使用经验&#xff09;&#xff1a;如何用python调用cplex求解器。 这次不能信官网&#xff0c;害我踩了一下午坑(其实是官网表述文件和实际不符&#xff0c;而且还少了一…

CPLEX教程 | Cplex介绍,CPLEX教育版和安装Cplex

前言 最近学习列生成算法&#xff0c;需要用到优化求解器。所以打算学习一下cplex这个商业求解器。 当然也有其他更多的选择&#xff0c;这里暂时以比较容易上手和性能比较好的cplex开始吧。其实&#xff0c;小编也早就想学习使用这个cplex了&#xff0c;毕竟是个好东西。 所…

cplex求解1

python环境下cplex安装 发现了一个简单的方法&#xff0c;直接使用 Anaconda 安装 cplex 包&#xff0c;因为 cplex 把自己最新的 python 包都发到 Anaconda 云里面了。 &#xff08;1&#xff09;打开 dos 命令行窗口&#xff0c;输入&#xff1a; conda install -c IBMDeci…

基于Cplex的分支定价

前言 分支定界&#xff08;branch and bound&#xff09;和分支定价&#xff08;branch and price&#xff09;仅一字之差&#xff0c;这两者之间也有着紧密联系&#xff0c;简单来说分支定价分支定界列生成。个人觉得在运筹学领域&#xff0c;分支定价算法也算是比较高级的算…

安装 cplex 求解器

安装 cplex 求解器 安装 cplex 求解器和python-docplexcplex 安装matlab 用户安装 cplexpython 版本 安装 cplex 求解器和python-docplex cplex 安装 cplex 是解决优化问题的一个工具箱&#xff0c;用来线性规划、混合整数规划和二次规划的高性能数学规划求解器。可以理解成…

Python配置CPLEX

大致的安装步骤如下 1.百度搜索CPLEX&#xff0c;进入官网&#xff0c;获取许可后&#xff0c;下载并安装&#xff08;要能找到自己的安装路径&#xff09; 2.安装完成后&#xff0c;可以直接用ide进行编程&#xff0c;但是&#xff0c;还可以用Python来调用CPLEX 3.给Pytho…

C++用户的Cplex使用指南(一)——在VS2019中运行Cplex程序

在VS2019中运行Cplex程序 前言 Cplex是IBM开发并仍在维护更新的商业求解器&#xff0c;也是目前使用人数最多的求解器&#xff0c;类似的还有Gurobi&#xff0c;两者各有各的特点&#xff08;两家颇有渊源&#xff0c;感兴趣的可以了解一下&#xff09;。 Cplex的一些基本概…

CPLEX相关问题汇总

求解流程 1&#xff09;定义常量&#xff1a;可以通过float、int、boolean定义常量。定义范围是为了便于对数组进行操作。 //定义常量 int F ...;//定义整型 float R...;//定义浮点型 int m...; int B ...;//定义范围 range nF1..F; range Machs 1..m;定义常量数组 //定义…

c++调用cplex的基本配置问题

1.创建c空项目 2.修改运行环境 为release以及x64 3.创建cpp文件 4。鼠标右键点击项目中的属性 5.点击c/c&#xff0c;点击第一项常规&#xff0c;配置附加库目录 5.添加文件索引&#xff0c;主要用于把路径导进来 6.这一步要添加的目录与你安装的cplex的目录有关系 F:\program…

cplex python安装及入门

cplex python安装及入门 1. cplex安装2. cplex学习资源3. 百度网盘资源 笔者最近学习cplex&#xff0c;从安装到入门走了不少弯路&#xff0c;现在提供一个相对全面的cplex学习博文。 1. cplex安装 可以参考这篇博文DOcplex系列&#xff08;二&#xff09;——怎样成功安装和调…

CPLEX求解器入门案例

其他文章&#xff1a; 通过0-1背包问题看穷举法、贪心算法、启发式算法&#xff08;JAVA) 模拟退火(SA)算法实例介绍&#xff08;JAVA) 遗传算法&#xff08;GA&#xff09;实例介绍&#xff08;JAVA) CPLEX求解器入门案例 java集成Cplex&#xff1a;Cplex下载、IDEA环境搭…

Cplex入门教程(二)

一、写在前面 在文章《Cplex入门教程&#xff08;一&#xff09;》的基础上&#xff0c;补充代码的部分 二、如何写代码 代码头&#xff0c;请无脑直接抄。 #include <ilcplex/ilocplex.h> #include <stdio.h> using namespace std;ILOSTLBEGIN声明环境&#x…

【 CPLEX安装】

系列文章目录 提示&#xff1a;版本匹配matlab2019bcplex12.10.0.0 版本查询网址&#xff1a; https://www.ibm.com/software/reports/compatibility/clarity/productsForPrereq.html 一、CPLEX安装 python E:\software\Cplex\python\setup.py install file:///E:/software/…

Cplex求解器

博主个人博客 在求解整数线性规划问题是,Matlab下yalmip+cplex的组合会让如虎添翼。本人是在研究早晚班排班过程中才发现的这一工具。其能够求解各种整数规划模型。在matlab中使用cplex求解时,还可以使用yalmip工具进行建模,比直接使用cplex建模方便很多。 在正式开始使用…

Cplex入门教程(一)

文章目录 1、主要内容2、Cplex简介CPLEX具有的优势 3、安装Cplex 12.94、在 Windows 上设置 CPLEX5、测试代码 1、主要内容 Cplex 简介安装Visual Studio 2017 (64位)安装cplex12.9 (64位)在 Windows 上设置 Cplex在 Visual Studio 中将 Cplex 链接代码逻辑介绍 2、Cplex简介…

Cplex的安装和使用实例

最近有文章复现需要用到Cplex&#xff0c;所以捣鼓了一下&#xff0c;看其他博客感觉不解渴&#xff0c;所以索性在这里记录一些key point 1&#xff09;下载与安装&#xff1a;Cplex的下载可以在官方网站下载&#xff0c;学生是免费下载使用的&#xff0c;非学生可以在网上找…

运筹优化学习19:Cplex中文教程与实例详解

目录 1 绪论 1.1 Cplex简介 1.1.1 基本界面介绍 1.1.2 处理流程介绍 1.2 OPL语言 1.2.1 OPL的主要关键字 1.2.2 数据文件 1.3 如何调用Cplex 1.3.1 使用AMPL脚本语言调用 1.3.2 IBM CPLEX Studio IDE 1.3.3 Cplex with Concert Technology 2 官方gas示例演示 2.1 导…

cplex基础入门(一)

这边文章会以纯新手小白的视角&#xff0c;教会大家如何快速的搭建自己的cplex模型&#xff0c;做到求解模型不求人。 目录 一、引言 1、掌握数据类型及数据结构 2、常规Cplex编程方法 3、Cplex编程步骤 4、cplex 程序框架 5、创建模型 二、规划建模的入门求解案例 1、…

Cplex安装教程与使用介绍

软件可以在ShareApps上下载&#xff0c;小伙伴们嫌麻烦可以用提取链接。 学术版 Cplex12.10 64位Windows 更新一下链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1jD9Xved2aWPHtRd-_PLI5Q 提取码&#xff1a;n4og 具体步骤&#xff1a; 下载完成后直接运行就可…

CPLEX入门

求解线性规划、整数线性规划、二次规划等较为经典的优化软件 Cplex专门用于求解大规模的线性规划&#xff08;LP&#xff09;、二次规划&#xff08;QP&#xff09;、带约束的二次规划&#xff08;QCQP&#xff09;、二阶锥规划&#xff08;SOCP&#xff09;等四类基本问题&…