【发布时间】:2020-02-03 23:54:59
【问题描述】:
我想找到一个整数线性规划的对称群。我认为 skip 中有一个名为 SCIPgetGeneratorsSymmetry 的函数。我该如何使用这个功能?
【问题讨论】:
我想找到一个整数线性规划的对称群。我认为 skip 中有一个名为 SCIPgetGeneratorsSymmetry 的函数。我该如何使用这个功能?
【问题讨论】:
你是对的,要访问 SCIP 中的对称信息,你必须通过 C/C++ 调用函数SCIPgetGeneratorsSymmetry()。请注意,您需要将 SCIP 与外部软件 bliss 联系起来,否则 SCIP 无法计算您的(混合整数)线性程序的对称性。
如果您使用 C/C++ 项目设置您的(混合整数)线性程序,则您有多种计算对称性的选项。
如果您将“重新计算”参数设置为 FALSE,SCIP 将返回当前可用的对称信息 - 如果尚未计算对称性,SCIP 将计算对称性以便您访问此信息。
如果您将“重新计算”设置为 TRUE,SCIP 将丢弃可用的对称信息,并且您可以访问当前对称组的生成器。此外,您可以控制通过参数“symspecrequire”和“symspecrequirefixed”计算的对称类型,例如,仅计算固定连续变量的二进制变量的对称性。
编辑:
如果你没有 C/C++ 编码经验,只对打印对称群的生成器感兴趣,最简单的方法可能是修改presol_symmetry.c 中的 SCIP 源代码如下:
determineSymmetry()的开头添加两个整数参数int i和int p。在determineSymmetry() 中搜索调用computeSymmetryGroup() 的行。
在此函数调用之后添加以下代码 sn-p:
for (p = 0; p < presoldata->nperms; ++p)
{
printf("permutation %d\n", p);
for (i = 0; i < presoldata->npermvars; ++i)
{
if ( TRUE )
printf("%d ", presoldata->perms[p][i]);
else
printf("%s ", SCIPvarGetName(presoldata->permvars[presoldata->perms[p][i]]));
}
printf("\n");
}
FALSE,您会得到相同的列表,但变量索引被替换为它们的名称。presolving/symbreak/addconsstiming = 0和propagating/orbitalfixing/symcomptiming = 0。如果您对预先解决的问题的对称性感到满意,请将零更改为一。【讨论】: