如何在 PySCIPOpt 中预求解后获得约束矩阵

How to get constraint matrix after presolving in PySCIPOpt

我有一个 pyscipopt.Model 变量 model,编码一个具有线性约束的整数程序。

我想在约束矩阵的所有行上评估一些解决方案。我想到的唯一方法是使用 model.getSolVal() 获取修改变量的解值,并手动计算修改约束矩阵的行的点积。

以下代码片段提取模型中约束的非零系数:

constr = model.getConss()[0]
coeff_dict = model.getValsLinear(constr)

它在预求解之前运行良好,但在预求解(或只是优化)之后出现以下错误

Warning: 'coefficients not available for constraints of type ', 'logicor'.

我目前的解决方案是完全禁用预求解,在这种情况下不会修改变量。我可以避免吗?

我假设您想对行活动做一些事情,而不仅仅是检查您的解决方案是否可行?

getValsLinear 仅可用于线性约束。在预求解 SCIP 时,将线性约束升级为一些更专业的约束类型(在您的情况下为 logicor)。

SCIP 中有一个名为 SCIPgetConsVals 的函数可以执行您希望 getValsLinear 执行的操作(它为您提供具有线性表示的所有约束的值)。但是,该函数尚未包含在 PySCIPopt 中。

您可以轻松地自己包装该函数(甚至可以转到 https://github.com/scipopt/PySCIPOpt 并创建一个 Pull-request)。 另一种选择是读取禁止升级线性约束的设置文件。

constraints/linear/upgrade/logicor = FALSE 
constraints/linear/upgrade/indicator = FALSE
constraints/linear/upgrade/knapsack = FALSE
constraints/linear/upgrade/setppc = FALSE
constraints/linear/upgrade/xor = FALSE
constraints/linear/upgrade/varbound = FALSE

将是您需要的设置。这样你仍然可以在没有约束升级的情况下进行预求解。