我想找到一个整数线性程序的对称群。我认为Skip中有一个名为SCIPgetGeneratorsSymmetry的函数。我该如何使用此功能?
[是的,要访问SCIP中的对称性信息,您必须通过C / C ++调用函数SCIPgetGeneratorsSymmetry()
。请注意,您需要将SCIP与外部软件联系起来,否则,SCIP将无法计算(混合整数)线性程序的对称性。
如果使用C / C ++项目设置(混合整数)线性程序,则可以使用多个选项来计算对称性。
如果将“ recompute”参数设置为FALSE,则SCIP将返回当前可用的对称性信息-如果尚未计算对称性,SCIP将计算对称性以使您可以访问此信息。
如果将“ recompute”设置为TRUE,SCIP将丢弃可用的对称性信息,并且可以访问当前对称性组的生成器。此外,您可以控制通过参数“ symspecrequire”和“ symspecrequirefixed”计算的对称类型,例如,仅计算固定连续变量的二进制变量的对称性。
编辑:
如果您没有使用C / C ++进行编码的经验,并且只对打印对称组的生成器感兴趣,那么最简单的方法可能是按如下所示修改presol_symmetry.c
中SCIP的源代码:
int i
的开头添加两个整数参数int p
和determineSymmetry()
。在determineSymmetry()
中搜索要调用computeSymmetryGroup()
的行。
在此函数调用后立即添加以下代码段:
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");
}
TRUE
到FALSE
,您将获得相同的列表,但变量索引将被其名称替换。presolving/symbreak/addconsstiming = 0
和propagating/orbitalfixing/symcomptiming = 0
。如果对已解决问题的对称性满意,请将零更改为1。