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

标签 c++ c scip

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

最佳答案

没错,要访问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的排列。如果将TRUE更改为FALSE,您得到相同的列表,但变量索引被其名称替换。
  • 不要忘记重新编译SCIP。
  • 如果使用SCIP解决实例并且启用了对称处理,则SCIP在计算对称组时将以上述格式打印生成器。如果您对原始问题的对称性组感兴趣,则应使用参数设置presolving/symbreak/addconsstiming = 0propagating/orbitalfixing/symcomptiming = 0。如果对已解决问题的对称性满意,请将零更改为1。
  • 关于c++ - 如何在C/C++中从外部库调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60048756/

    相关文章:

    c++ - 为什么我的数组不存储任何输入值?

    c++ - 模板函数指针

    c++ - 为什么 const 按值结构绑定(bind)允许用户修改引用的变量?

    c++ - 打印从数字创建的可能字符串

    c++ - 在 SCIP 中集成来自其他源代码的功能

    c++ - 使用STM32Cube IDE将代码从Arduino移植到stm32f100

    python - 设置 Python 二进制模块构建的包含路径

    c - 解释用于标记器字符串的 C 代码

    python - 为什么 SCIP python 接口(interface)中的 Quicksum 非常慢

    c++ - SCIP 及分行及价格