对使用 C 的小 LP 模型进行构建和求解
C API 中的该应用程序引入 Callable Library 的基本功能。
示例 lpex1.c 向您说明如何以三种不同的方式使用 CPLEX Callable
Library 中的问题修改例程来构建模型。 该示例中的应用程序采用单个命令行参数,该参数用于指示是按行、列还是非零值来构建约束矩阵。 构建问题之后,应用程序将对其进行优化并显示解法。 以下是该示例所优化的问题:
| 最大化 | x1 + 2x2 + 3x3 |
| subject to | –x1
+ x2
+ x3
x1
– 3x2
+ x 3
|
| 使用这些界限 | 0 0 0 |
应用程序必须先调用例程 CPXopenCPLEX 来获取指向 CPLEX 环境的指针(称为 env),然后才能调用任何 CPLEX Callable Library 例程。 然后,应用程序会将该指针传递到每个 Callable Library 例程。 如果该例程失败,那么它将返回错误代码。 该错误代码可由例程 CPXgeterrorstring 转换为字符串。
初始化 CPLEX 环境后,CPLEX 屏幕开关参数 (CPX_PARAM_SCRIND) 将由例程 CPXsetintparam 启用。 这会致使所有缺省 CPLEX 输出都出现在屏幕上。 如果未设置该参数,那么 CPLEX 将不会在屏幕或文件中生成任何可查看的输出。
此时,将调用例程 CPXcreateprob 以创建一个空问题对象。 根据命令行参数所选择的问题构建方法,应用程序随后会调用一个例程来按行、列或非零值构建矩阵。 例程 populatebyrow 首先调用 CPXnewcols 来指定基于列的问题数据,如目标、界限和变量名称。 然后,将调用例程 CPXaddrows 来提供约束。 例程 populatebycolumn 首先调用 CPXnewrows 来指定基于行的问题数据,如右侧值和约束感知。 然后,将调用例程 CPXaddcols 来提供矩阵的列以及关联的列界限、名称和目标系数。 例程 populatebynonzero 调用 CPXnewrows 和 CPXnewcols 这两者来提供除实际约束矩阵外的所有问题数据。 此时,行和列都进行了良好的定义,但约束矩阵仍为空。 然后,将调用例程 CPXchgcoeflist 来填充矩阵中的非零条目。
指定了问题后,应用程序将通过调用例程 CPXlpopt 来对问题进行优化。 其缺省行为是使用 CPLEX 对偶单纯形法优化器。 如果该例程返回非零结果,那么发生了错误。 如果未发生任何错误,那么应用程序将为主变量、对偶变量、松弛变量和已降低成本的解法值分配数组;然后它将通过调用例程 CPXsolution 来获取解法信息。 该例程会返回问题状态(最优、不可行还是无界限,以及达到了时间限制还是迭代限制)、目标值和解法向量。 然后,应用程序将在屏幕上显示该信息。
As a debugging aid, the application writes the problem to a CPLEX LP file (named lpex1.lp) by calling the routine CPXwriteprob. 可检查该文件以检测用于创建问题的例程中是否发生了任何错误。 CPXwriteprob可以在 "CPXcreateprob创建 "lp指针后的任何时间调用。
标签 "TERMINATE:用于在出现任何故障或一切顺利时退出程序。 In either case, the problem object represented by lp is released by the call to CPXfreeprob, and any memory allocated for solution arrays is freed. 然后,应用程序将调用 CPXcloseCPLEX;它告诉 CPLEX:对 Callable Library 的所有调用均已完成。 如果调用该例程时发生错误,那么需要调用 CPXgeterrorstring 才能检索错误消息,因为 CPXcloseCPLEX 不会产生任何屏幕输出。
您可以在产品标准分发版中的 yourCPLEXinstallation/examples/src/lpex1.c 处联机查看完整程序。