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

How to call function from external library in C/C++

本文关键字:从外部 调用 函数 C++      更新时间:2023-10-16

我想找到整数线性规划的对称群。我认为跳过中有一个名为SCIPgetGeneratorsSymmetry的函数。我如何使用这个功能?

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

如果使用 C/C++ 项目设置(混合整数(线性规划,则有多种计算对称性的选项。

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

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

编辑:

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

  • determineSymmetry()的最开头添加两个整数参数int iint p
  • determineSymmetry()内搜索调用computeSymmetryGroup()的线路。

  • 在此函数调用之后立即添加以下代码片段:

for (p = 0; p < presoldata->nperms; ++p)
{
printf("permutation %dn", 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 计算对称组时,SCIP 都会以上述格式打印生成器。如果您对原始问题的对称群感兴趣,则应使用参数设置presolving/symbreak/addconsstiming = 0propagating/orbitalfixing/symcomptiming = 0。如果您对已解决问题的对称性感到满意,请将 0 更改为 1。