如何在 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
将是您需要的设置。这样你仍然可以在没有约束升级的情况下进行预求解。
我有一个 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
将是您需要的设置。这样你仍然可以在没有约束升级的情况下进行预求解。