文章目录

  • 调用 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求解线性规划模型

java怎么调用socket JAVA怎么调用CPLEX_java

//导入相应的包,使用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

java怎么调用socket JAVA怎么调用CPLEX_java_02

类 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

二次规划