我想找到一个整数线性程序的对称组。我认为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 pdetermineSymmetry()
  • 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");
    }
    
  • 此代码将对称组的生成器打印为变量索引列表,例如1 2 0是映射0-> 1、1-> 2和2-> 0的排列。如果将TRUE更改为FALSE,您得到相同的列表,但变量索引被其名称替换。
  • 不要忘记重新编译SCIP。
  • 如果使用SCIP解决实例并且启用了对称处理,则SCIP在计算对称组时将以上述格式打印生成器。如果您对原始问题的对称性组感兴趣,则应使用参数设置presolving/symbreak/addconsstiming = 0propagating/orbitalfixing/symcomptiming = 0。如果对已解决问题的对称性满意,请将零更改为1。
  • 10-06 06:55