示例:LPex1.java
此示例说明在 CPLEX 的 Java 应用程序中对模型求解。
示例 LPex1.java(CPLEX 标准分发版的一部分)是构建特定小 LP 模型然后对其求解的程序。 此示例遵循许多 CPLEX Concert Technology 应用程序中的一般结构,并且说明构造模型的三种主要方式:
示例 "LPex1.java是输入示例中介绍的示例的扩展:
| 最大化 | x 1 + 2x 2 + 3x 3 |
| subject to | -x 1+x 2.+x 3 ' x 1-3x 2+x 3' |
| 使用这些界限 | 0 0 0 |
在初始检查是否已提供有效选项字符串作为调用参数后,程序首先将后续的所有可执行语句都包含在 try/catch 语句对中。 如果出现错误,CPLEX Concert Technology 将抛出IloException 类型的异常,然后由 "catch语句进行处理。 在此简单示例中,异常触发声明 Concert exception ‘e’ caught 的行的列显,其中 e 是特定异常。
首先,通过执行以下语句来创建模型对象 cplex:
IloCplex cplex = new IloCplex();
此时,cplex 对象表示空模型,即不包含变量、约束或其他内容的模型。 然后,将根据命令行参数通过多种方式之一填充模型。 在以下方法中实现了可能的选项
populateByRowpopulateByColumnpopulateByNonzero
所有这些方法都传递相同的三个参数。 第一个参数是要填充的 cplex 对象。 第二和第三个参数分别对应于变量 (var) 和范围约束 (rng);方法将模型中所有变量和约束的数组分别写入到 var[0] 和 rng[0] 中,以供将来访问。
在 cplex 对象中创建模型后,即可通过调用 cplex.solve 来对其求解。 解决方案日志将输出到屏幕上;这是因为'IloCplex会将所有日志信息打印到'OutputStream'cplex.产量,默认初始化为'System.out。 您可以通过调用方法 "cplex.setOut 来更改。 需要特别说明的是,可以通过将输出流设置为 null(即通过调用 cplex.setOut(null))来关闭日志记录。 同样,"IloCplex会向 "cplex.警告和'cplex.设置警告可以用来更改(或关闭)将要使用的'OutputStream。
如果 solve 方法为活动模型找到可行解法,那么它会返回 true。 下一节代码访问该解法。 方法 "cplex".getValues"(var[0])返回所有变量的原始解值数组。 此数组存储为 double[]x。 x 中的值已排序,以便 x[j] 是变量 var[0][j] 的原始解法值。 同样,降低的成本、对偶和松弛值分别在数组 dj、pi 和 slack 中进行查询和存储。 最后,使用 "IloCplex.getStatus和 "IloCplex.getObjValue 方法分别查询活动模型的解决方案状态和解决方案的目标值。 最后,程序将打印在前面步骤中获得的值,并在调用 "cplex.end释放模型对象使用的内存后结束;IloException的 "catch方法提供屏幕输出,以防途中出现任何错误情况。
示例源代码的剩余部分专用于有关填充模型对象的详细信息,以下三个部分提供有关方法如何工作的详细信息。
您可以在位于 yourCPLEXinstallation /examples/src/LPex1.java 的产品标准分发版中在线查看完整程序。