文章目录
- 调用 CPLEX 的 Java 应用程序的结构
- Java调用cplex求解线性规划模型
- 使用针对 Java 用户的 Concert Technology 的 CPLEX 建模类
- 模型中的变量
- 表达式
- 范围约束
- 对模型求解
- 解状态
- 分段线性函数
- 数学规划问题缩写含义
调用 CPLEX 的 Java 应用程序的结构
import ilog.concert.*;
import ilog.cplex.*;
static public class Application {
static public main(String[] args) {
try {
IloCplex cplex = new IloCplex();
// create model and solve it
} catch (IloException e) {
System.err.println("Concert exception caught: " + e);
}
}
}
Java调用cplex求解线性规划模型
//导入相应的包,使用CPLEX Java接口
import ilog.concert.*;
import ilog.cplex.*;
public class Example {
public static void main(String[] args) {
try {
IloCplex cplex = new IloCplex(); //创建对象
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); //决策变量,3个连续变量
double[] objvals = {1.0, 2.0, 3.0}; //决策变量系数
cplex.addMaximize(cplex.scalProd(x, objvals)); //目标函数
cplex.addLe(cplex.sum(cplex.prod(-1.0, x[0]),
cplex.prod( 1.0, x[1]),
cplex.prod( 1.0, x[2])), 20.0); //约束1
cplex.addLe(cplex.sum(cplex.prod( 1.0, x[0]),
cplex.prod(-3.0, x[1]),
cplex.prod( 1.0, x[2])), 30.0); //约束2
if ( cplex.solve() ) {
cplex.output().println("Solution status = " + cplex.getStatus());
cplex.output().println("Solution value = " + cplex.getObjValue());
double[] val = cplex.getValues(x);
int ncols = cplex.getNcols();
for (int j = 0; j < ncols; ++j)
cplex.output().println("Column: " + j + " Value = " + val[j]);
}
cplex.end();
}
catch (IloException e) {
System.err.println("Concert exception '" + e + "' caught");
}
}
}
转载来源:https://www.ibm.com/docs/zh/icos/12.8.0.0?topic=cplex-using-concert-technology-in-java
类 IloCplex 扩展 IloCplexModeler。 IloCplex 中的所有建模方法都从 IloCplexModeler 派生。 IloCplex 实现求解方法。
类 IloCplexModeler(它实现 IloMPModeler)使用户能够在 Java 应用程序中将模型构建为纯 Java 对象,而不必使用类 IloCplex。
需要特别说明的是,使用 IloCplexModeler 构建的模型(不使用 IloCplex 实例)不要求装入 CPLEX.dll,也不要求装入任何共享库。
而且,IloCplexModeler 可序列化。 例如,用户可开发纯 Java 应用程序,它使用 IloCplexModeler 来构建模型,并将模型和建模对象发送到使用 IloCplex 的优化服务器。
使用针对 Java 用户的 Concert Technology 的 CPLEX 建模类
要建模的对象 | 使用这个类或接口的对象 |
变量 | IloNumVar 及其扩展 IloIntVar 和 IloSemiContVar |
范围约束 | 带有(分段)线性或二次表达式的 IloRange |
其他关系约束 | 格式为 expr1 relation expr2 的 IloConstraint,其中两个表达式都是线性或二次表达式,并可选择性地包含分段线性项。 |
LP 矩阵 | IloLPMatrix |
线性或二次目标 | 带有(分段)线性或二次表达式的 IloObjective |
变量类型转换 | IloConversion |
特殊有序集 | IloSOS1 或 IloSOS2 |
逻辑约束 | IloOr、IloAnd 以及 not 之类的方法 |
模型中的变量
IloNumVar x = cplex.numVar(lb, ub, IloNumVarType.Float, "xname"); //变量属性:下限,上限,类型、名称
整数变量可以由 intVar 方法创建,并且不要求传递类型 IloNumVarType.Int,因为这由方法名称所暗指。 界限参数也更加一致地指定为整数。 这些方法返回类型为 IloIntVar 的对象,该类型是接口 IloNumVar 的扩展,它允许使用整数一致地查询和设置界限,而不是像 IloNumVar 一样使用双精度值。
界限为 0/1 的整数变量经常用作决策变量。 为了帮助创建此类变量,提供了 boolVar 方法。 在布尔类型中,以隐式方式指定 0 和 1,因此这些方法不需要接受任何界限值。
对于所有这些构造方法,还有等同的方法可用来一次就创建建模变量的完整数组。 这些方法的名称为 numVarArray、intVarArray 和 boolVarArray。
表达式
IloNumExpr expr = cplex.sum(x1, cplex.prod(2.0, x2)); //x1+2x2
sum加、diff减、prod乘、negative负、square平方
单个变量是表达式的特殊情况,因为 IloNumVar 是 IloNumExpr 的扩展。
线性表达式这一特殊情况由类型为 IloLinearNumExpr 的对象表示。 此类表达式可编辑,这在通过循环构建线性表达式时特别方便,如下所示:
IloLinearNumExpr lin = cplex.linearNumExpr();
for (int i = 0; i < num; ++i)
lin.addTerm(value[i], variable[i]);
借助 scalProd 方法,可直接支持值数组与变量数组的标量乘积这一特殊情况。 因此,可将该循环重新编写为:
IloLinearNumExpr lin = cplex.scalProd(value, variable);
范围约束
范围约束是以下格式的约束:lb ≤ expression ≤ ub,在 Concert Technology 中由类型为 IloRange 的对象表示。 最一般的构造函数是:
IloRange rng = cplex.range(lb, expr, ub, name); //lb 和 ub 是双精度值,expr 的类型为 IloNumExpr,name 是字符串
关系 | lb | ub | 方法 |
= | rhs | rhs | eq |
≤ | -Double.MAX_VALUE | rhs | le |
≥ | rhs | Double.MAX_VALUE | ge |
最后一列包含 IloModeler 随附的方法,用于在您指定表达式即右侧 (RHS) 时直接创建适当的范围约束。 例如,约束 expr ≤ 1.0 可通过以下调用来创建: |
IloRange le = cplex.le(expr, 1.0);
对模型求解
在活动模型中创建优化问题之后,可通过 IloCplex 对象对其进行求解。 例如,对于名为 cplex 的对象,可以调用以下方法来进行求解:
cplex.solve();
solve 方法返回一个布尔值,用于指定是否找到并可查询可行解。 但是,返回 true 时,找到的解可能不是最优解;例如,优化可能已因为达到迭代限制而过早终止。
通过使用返回 IloCplex.Status 对象的 getStatus 方法,可查询 IloCplex 对象中有关可能解的其他信息。
解状态
返回状态 | 活动模型 |
Error | 尚未能够处理活动模型,或者优化期间发生错误 |
Unknown | 尚未能够将活动模型处理到足以给出任何有关其的证明的程度。 一种常见原因是达到时间限制 |
Feasible | 已证明存在模型的可行解 |
Bounded | 已证明活动模型在优化方向上具有有限的界限。 但是,这并不表示存在可行解 |
Optimal | 活动模型已求解为获得最优解。 可以查询最优解 |
Infeasible | 已证明活动模型没有可行解 |
Unbounded | 已证明活动模型无界。 从技术角度而言,IloCplex 所采用的无界性表示法就是对偶不可行性的无界性表示法;这不包括已证明模型可行的表示法。 相反,已证明的情况是,如果有目标值为 z* 的可行解,那么存在目标值为 z*-1(对于最小化问题)或 z*+1(对于最大化问题)的可行解 |
InfeasibleOrUnbounded | 已证明活动模型可行或无界 |
分段线性函数
要在 Concert Technology 中定义分段线性函数,您需要下列要素:
- 分段线性函数的独立变量
- 分段线性函数的断点
- 每个分段的斜率(即,两个断点之间的函数增加或减少率)
- 函数的至少一个点的几何坐标
通常,分段线性函数的断点指定为一个包含数字值的数组。 例如,上图中显示的函数 f(x) 的断点以这种方式指定,其中第一个自变量 env 指定环境,第二个自变量指定考虑中的断点数,其余自变量指定断点的 x 坐标:
IloNumArray (env, 3, 4., 5., 7.)
其各个分段的斜率也指示为一个包含数字值的数组。 例如,f(x) 的斜率以这种方式指定,其中第一个自变量同样指定环境,第二个自变量指定给出的斜率数,其余自变量指定各个分段的斜率:
IloNumArray (env, 4, -0.5, 1., -1., 2.)
另外,还必须指定函数的至少一个点的几何坐标 (x, f(x));例如, (4, 2)。 然后,在 Concert Technology 中,这些元素将以如下方式在类 IloPiecewiseLinear 的实例中汇总:
IloPiecewiseLinear(x,
IloNumArray(env, 3, 4., 5., 7.),
IloNumArray(env, 4, -0.5, 1., -1., 2.),
4, 2)
另一种指定分段线性函数的方式是给出第一个分段的斜率、两个包含断点的坐标的数组,以及最后一个分段的斜率。 在此方式下,上图中的示例 f(x) 如下所示:
IloPiecewiseLinear(x, -0.5, IloNumArray(env, 3, 4., 5., 7.),
IloNumArray(env, 3, 2., 3., 1.), 2);
数学规划问题缩写含义
缩写 | 含义 |
IP | 整数规划 |
LP | 线性规划 |
MILP | 混合整数线性规划 |
MIP | 混合整数规划 |
MIQP | 混合整数二次规划 |
PWL | 分段线性规划 |
QCP | 二次约束规划 |
QP | 二次规划 |