c++ - 如何在 C/C++ 中从外部库调用函数
问题描述
我想找到一个整数线性程序的对称群。我认为 skip 中有一个名为 SCIPgetGeneratorsSymmetry 的函数。我该如何使用这个功能?
解决方案
没错,要访问 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 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");
}
- 此代码将对称组的生成器打印为变量索引列表,例如,1 2 0 是映射 0 -> 1、1 -> 2 和 2 -> 0 的排列。如果更改
TRUE
为FALSE
,则得到相同的列表,但变量索引被它们的名称替换。 - 不要忘记重新编译 SCIP。
- 如果您使用 SCIP 求解实例并启用对称处理,则 SCIP 将在计算对称组时以上述格式打印生成器。如果你对原问题的对称群感兴趣,你应该使用参数设置
presolving/symbreak/addconsstiming = 0
和propagating/orbitalfixing/symcomptiming = 0
。如果您对预先解决的问题的对称性感到满意,请将零更改为一。
推荐阅读
- class - Dart - 对象实例化和方法调用中的错误
- php - 如何在PHP中获取二维数组中最大元素的键
- r - 有美国州和领地缩写并想转换为全名
- mailto - html中的Mailto打开一个非默认的电子邮件帐户
- jquery - 无法让悬停功能在此代码上工作
- c - C - 使用'from'和'to'索引拆分单链表
- flutter - 如果应用程序关闭颤动,onSelectNotification Navigator 将不起作用
- openwrt - 如何在openwrt中将选项卡添加到webUI
- html - 如何根据条件在 django 中为 html 表着色
- javascript - 获取特定日期范围内的结果