【问题标题】:How to call function from external library in C/C++如何在 C/C++ 中从外部库调用函数
【发布时间】:2020-02-03 23:54:59
【问题描述】:

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

【问题讨论】:

    标签: c++ c scip


    【解决方案1】:

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

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

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

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

    编辑:

    如果你没有 C/C++ 编码经验,只对打印对称群的生成器感兴趣,最简单的方法可能是修改presol_symmetry.c 中的 SCIP 源代码如下:

    • determineSymmetry()的开头添加两个整数参数int iint p
    • determineSymmetry() 中搜索调用computeSymmetryGroup() 的行。

    • 在此函数调用之后添加以下代码 sn-p:

    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 的排列。如果您更改 @987654329 @ 到 FALSE,您会得到相同的列表,但变量索引被替换为它们的名称。
    • 不要忘记重新编译 SCIP。
    • 如果使用 SCIP 求解实例并启用对称处理,则 SCIP 将在计算对称组时以上述格式打印生成器。如果你对原问题的对称群感兴趣,你应该使用参数设置presolving/symbreak/addconsstiming = 0propagating/orbitalfixing/symcomptiming = 0。如果您对预先解决的问题的对称性感到满意,请将零更改为一。

    【讨论】:

    • 我从未使用过 c 或 c++,您能否给我一个提示,我该如何调用它?我会很感激的
    • 我希望初始帖子的编辑有助于快速访问对称信息。
    • 我正在尝试更改 presol_symmetry.c。但这就是我想要做的:我有一个 .mps 文件。它是一个具有对称性的 ILP。我想找到对称群这个问题的生成器。
    • @sherek_66 请提出问题。 Christopher 已经发布了详细的答案。如果您对他的回答感到困惑,请详细说明
    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多