首页 > 解决方案 > 如何在 C/C++ 中从外部库调用函数

问题描述

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

标签: c++cscip

解决方案


没错,要访问 SCIP 中的对称信息,您必须SCIPgetGeneratorsSymmetry()通过 C/C++ 调用该函数。请注意,您需要将 SCIP 与外部软件 bliss 联系起来,否则 SCIP 无法计算您的(混合整数)线性程序的对称性。

如果你使用 C/C++ 项目设置你的(混合整数)线性程序,你有几个计算对称性的选项。

  • 如果您将“重新计算”参数设置为 FALSE,SCIP 将返回当前可用的对称信息 - 如果尚未计算对称性,SCIP 将计算对称性以让您访问此信息。

  • 如果您将“重新计算”设置为 TRUE,SCIP 将丢弃可用的对称信息,您可以访问当前对称组的生成器。此外,您可以控制通过参数“symspecrequire”和“symspecrequirefixed”计算的对称类型,例如,仅计算固定连续变量的二进制变量的对称性。

编辑:

如果您没有使用 C/C++ 编码的经验,并且您只对打印对称组的生成器感兴趣,那么最简单的方法可能是修改 SCIP 的源代码,presol_symmetry.c如下所示:

  • 添加两个整数参数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。如果您对预先解决的问题的对称性感到满意,请将零更改为一。

推荐阅读