命名空间: ILOG.OPL
程序集: oplall(在oplall.dll 中)
语法
| C# |
|---|
public class Cplex:IloModelerAdvImpl,IMPModeler、 IModeler, IM 模型, IAddable, ICopyable, IModelerAdv |
备注
Cplex所要解决的模型应使用IMPModeler(和基础接口)方法来构建以下列表中的对象:
- 变量对象的类型 "INumVar及其扩展名 "IIntVar、"IBoolVar"和 "ISemiContVar
- 范围约束: IloRange类型的对象,具有(分段)线性或二次表达式
- 其他关系约束:形式为expr1关系expr2 的IConstraint类型对象,其中两个表达式均为线性或二次表达式,可选择包含片断线性项。
- LP 矩阵: ILPMatrix类型的对象
- 线性、片断线性或二次目标:具有(片断)线性和/或二次表达式的IObjective类型对象
- 变量类型转换: IC 转换类型的对象
- 特殊有序集合: ISOS1或ISOS2类型的对象
Cplex在内部以标准数学编程矩阵表示法存储此类模型:
最小化(或最大化)c'x + x'Qx
服从 L <= Ax <= U
a_i'x + x'Q_i x <= r_i,对于 i = 1,.....、 q
l <= x <= u.
因此,A 是线性约束系数矩阵,L 和 U 是变量向量 x 的下限和上限向量。 Q 矩阵必须是正半有限矩阵(或最大化情况下的负半有限矩阵),代表目标函数的二次项。 矩阵 Q_i 必须是正半有限矩阵,代表第 i 个二次方程约束条件的二次项,a_i 是包含对应线性项的向量。 有关 Q_i 的更多信息,请参阅《IBMILOG Cplex 用户手册》中有关 QCP 的章节。
如果模型包含整数变量、布尔变量或半连续变量,或者模型具有特殊有序集(SOS),则该模型被称为混合整数程序(MIP)。 您可以使用 "IsMIP方法查询活动模型是否为 MIP。
如果目标中包含二次项,则称为混合整数二次程序(MIQP),否则称为二次程序(QP)。 您可以通过调用IsQO 方法来查询活动模式是否具有二次目标。
带有二次约束的模型如果也是 MIP,则称为二次约束程序(MIQCP),否则称为 QCP。 您可以通过调用IsQC 方法来查询活动模型是否受二次约束。 QCP 可能有二次方目标,也可能没有;也就是说,某个问题可能既是 QP 又是 QCP。 同样,MIQCP 可能有二次方目标,也可能没有;也就是说,某个问题可能既是 MIQP,也是 MIQCP。
如果目标中没有二次项,没有整数约束,问题也没有二次约束,则称为线性规划(LP)。
如果目标中没有二次项,问题没有二次约束,但存在整数变量,则称为混合整数线性规划(MILP)。
特殊有序集合(SOS)不属于传统的 A 和 Q 矩阵表示法,而是单独存储。
通过这些方法可以查询与模型矩阵表示相关的信息:
- Cplex.GetNcols用于查询 A 的列数、
- Cplex.GetNrows用于查询 A 的行数,即线性约束的数目、
- Cplex.GetNQCs用于查询二次约束的数量、
- Cplex.GetNNZs用于查询 A 中非零元素的个数,以及
- Cplex.GetNSOSs用于查询SOS的数量。
通过在不同类型建模对象上定义的迭代器,可以获取有关活动模型的其他信息。
Cplex实际上将所有模型都视为 MIQCP 模型。 也就是说,它允许最一般的情况,尽管求解算法有效地利用了特殊情况,如公式中没有二次项。
使用 "解决()()()()方法求解主动模型。 它首先求解 MIQCP 模型的根松弛,其中所有的积分约束和 SOS 都被忽略。 如果模型没有积分约束或 SOS,那么一旦求解了根松弛,优化就完成了。 否则,Cplex会使用分支和切割程序重新引入积分约束和 SOS 约束。 有关分支和剪切的更多信息,请参阅《IBMILOG Cplex 用户手册》。
大多数用户可以简单地调用求解来求解他们的模型。 不过,对于需要更多控制的用户来说,还可以使用几个参数。 其中最重要的可能是Cplex.IntParam.RootAlg,它决定了用于求解根松弛的算法。 Cplex.Algorithm 中定义的可能设置有
- Cplex.Algorithm.Auto
Cplex自动选择算法。 这是缺省设置。 - Cplex.Algorithm.Primal
使用基元单纯形算法。 - Cplex.Algorithm.Dual
使用对偶单纯形算法。 - Cplex.Algorithm.Network
对模型的嵌入式网络部分使用网络单纯形,然后对整个模型使用二元单纯形。 - Cplex.Algorithm.Barrier
使用障碍算法。 - Cplex.Algorithm.Sifting
使用筛选算法。 此选项不适用于二次方程问题。 如果未选择,Cplex默认为Cplex.Algorithm.Auto设置。 - Cplex.Algorithm.Concurrent
同时使用几种算法。 此选项不适用于二次方程问题。 如果未选择,Cplex默认为Cplex.Algorithm.Auto设置。
您还可以使用大量其他参数来控制优化器的算法方面。 更多信息,请参阅IntParam、DoubleParam 和StringParam。 参数通过SetParam 方法设置。
通过使用目标(见 "Cplex..::..目标)或回调(见 "Cplex..::..回调及其扩展),可以实现更高级别的控制。
求解方法返回一个布尔值,表示是否(true)找到一个解(不一定是最优解)。 有关解决方案的更多信息,可通过getStatus 方法进行查询。 Cplex.Status类型的返回代码表示解是否可行、有界或最优,或者模型是否被证明为不可行或无界。 更多信息请参见 "Cplex..::..状态。
The method GetCplexStatus()()()() provides more detailed information about the status of the optimizer after 解决()()()() returns. 例如,它可以提供优化器过早终止的原因(时间限制、迭代限制等)。 IsPrimalFeasible和IsDualFeasible方法可用于确定是否已找到主要或对偶可行解,并可进行查询。
Cplex计算出的最重要的解信息通常是解向量和目标函数值。 可分别使用GetValue(INumExpr)和GetObjValue(Int32) 方法查询。 大多数优化器还会计算额外的解决方案信息。 (例如,对偶值、降低成本、简约基础等) 这些附加信息也可以通过Cplex 的各种方法进行查询。 如果您试图获取特定优化器中没有的解决方案信息,Cplex将抛出异常。
如果您正在求解一个 LP 问题,并且已经有了一个基础,那么就可以通过进行敏感性分析来进一步分析该问题的解决方案。 这些信息会告诉你,解决方案对变量边界、约束边界或目标系数变化的敏感程度。 这些信息通过 "GetBoundSA(array<双倍>[]()[][], 'array<双倍>[]()[][], 'array<双倍>[]()[][], 'array<双倍>[]()[][], ILPMatrix)、"GetRangeSA(array<双倍>[]()[][], 'array<双倍>[]()[][], 'array<双倍>[]()[][], 'array<双倍>[]()[][], ILPMatrix)、"GetRHSSA(array<Double>[]()[][], 'array<Double>[]()[][], ILPMatrix)和 "GetObjSA(array<双倍>[]()[][], 'array<双倍>[]()[][], 'array<INumVar>[]()[][])方法进行计算和访问。
获取解法信息时的一个重要考虑因素是解法的数字质量。 由于Cplex使用有限精度进行算术运算,因此解法总是会出现数字误差。 对于大多数问题,数值误差都在合理的公差范围内。 不过,对于数值计算困难的模型,建议您使用 "GetQuality(Cplex'..::..质量类型)方法验证解法的质量,该方法提供了多种质量测量方法。
继承层次结构
IloModelImpl
IloModelerImpl
IloModelerAdvImpl
ILOG.OPL'..::..Cplex