如何在C / C ++中从外部库调用函数

问题描述 投票:1回答:1

我想找到一个整数线性程序的对称群。我认为Skip中有一个名为SCIPgetGeneratorsSymmetry的函数。我该如何使用此功能?

c makefile gnu-make scip
1个回答
2
投票

[是的,要访问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的置换。如果更改TRUEFALSE,您将获得相同的列表,但变量索引将被其名称替换。
  • 不要忘记重新编译SCIP。
  • 如果使用SCIP解决实例并且启用了对称处理,则SCIP在计算对称组时将以上述格式打印生成器。如果您对原始问题的对称性组感兴趣,则应使用参数设置presolving/symbreak/addconsstiming = 0propagating/orbitalfixing/symcomptiming = 0。如果对已解决问题的对称性满意,请将零更改为1。
© www.soinside.com 2019 - 2024. All rights reserved.