我想找到一个整数线性程序的对称组。我认为Skip中有一个名为SCIPgetGeneratorsSymmetry的函数。我如何使用此功能?
最佳答案
没错,要访问SCIP中的对称性信息,必须通过C / C++调用SCIPgetGeneratorsSymmetry()
函数。请注意,您需要将SCIP与外部软件联系起来,因为否则,SCIP将无法计算(混合整数)线性程序的对称性。
如果使用C / C++项目设置(混合整数)线性程序,则可以使用多个选项来计算对称性。
编辑:
如果您没有使用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。