向问题添加行:示例 lpex3.c

该应用程序向模型添加行。

该示例说明如何通过 Callable Library 中的例程来开发您自己的解法算法。 它还向您展示如何向问题对象添加行。 以下是 lpex3 所求解的问题:

约束 Hx=d 表示纯网络流问题的流保留约束。 该示例分两个步骤对此问题求解:

  1. CPLEX 网络优化器用于对以下问题求解

  2. 约束 Ax=b 将添加到此问题,而对偶单纯形法优化器用于对新问题求解(从更简单的网络问题的最优基础开始)。

此问题的数据由网络部分(使用以字母 H 开头的变量名称)和会提高复杂性的约束(使用以字母 A 开头的变量名称)组成。

该示例首先调用 "CPXopenCPLEX创建环境,然后打开 CPLEX 屏幕开关(CPX_PARAM_SCRIND)。接着,它将单倍频显示级别(CPX_PARAM_SIMDISPLAY)设置为 2,以显示逐次迭代的输出,这样就可以观察到优化器每次迭代的进度。 通常建议不要将该参数设置为 2;该示例这么做只是为了进行说明。

该示例通过调用 CPXcreateprob 来创建问题对象。 然后,将通过调用 CPXcopylp 来复制网络数据。 复制了网络数据后,参数 CPX_PARAM_LPMETHOD 将设置为 CPX_ALG_NET,并且将调用例程 CPXlpopt 以使用网络优化器对优化问题的网络部分求解。 此问题的目标值由 CPXgetobjval 检索。

然后,CPXaddrows 将添加额外行。 为了方便起见,所添加的行中非零值的总数存储在数组 rmatbeg 的额外元素中,并且将为参数 nzcnt 传递此元素。 CPXaddrows 的名称参数为 NULL,因为没有为该问题定义任何变量或约束名称。

在调用 CPXaddrows 后,参数 CPX_PARAM_LPMETHOD 将设置为 CPX_ALG_DUAL,并将调用例程 CPXlpopt 以使用对偶单纯形法优化器来重新优化此问题。 重新优化之后,CPXsolution 将访问解法状态、目标值和原始解法。 将为其他解法值传递 NULL,因为本示例中不需要这些值所提供的信息。

最后,CPXwriteprob 会将此问题编写为 SAV 文件。 然后,便可将该文件读入 Interactive Optimizer 以分析是否正确生成了该问题。 建议优先于 MPS 和 LP 文件使用 SAV 文件,因为 SAV 文件会保留该问题的完全数字精度。

TERMINATE: 标签后,CPXfreeprob 将释放问题对象,而 CPXcloseCPLEX 将释放 CPLEX 环境。

您可以在产品标准分发版中的 yourCPLEXinstallation/examples/src/lpex3.c 处联机查看完整程序。