OR 工具 C++:solver.MutableObjective() 返回 null

问题描述

我刚刚继承了一段代码,它使用 OR 工具解决了混合整数规划问题。将 OR 工具集成到 VS 2019 本身就令人头疼(好吧,我不太习惯 C++)。现在程序正在运行,但我得到:

访问违规读取位置 0x0000000000000020

根据调试器,看起来 solver.MutableObjective() 返回 null。

MakeRowConstraint 之类的其他函数似乎工作正常,但它们不会返回 null。有什么线索吗?可能是我在安装库时配置错误

MPSolver solver("simple_mip_program",MPSolver::SCIP_MIXED_INTEGER_PROGRAMMING);
//...
MPObjective* FObj = solver.MutableObjective(); // <-- NULL

//therefore the below throws exception.
//The arrays `variables` and `F` are populated as expected
for (int i = 0; i < n; i++) FObj->SetCoefficient(variables[i],F[i]);
FObj->Setmaximization();

编辑:更多细节,我在 Windows 10 和 Visual Studio 2019 上使用 ORTools 64bit_v8.1.8487。

我也尝试运行 sample MIP problem from GitHub,但在第 54 行发生了同样的错误

解决方法

您需要在创建目标之前调用 Minimize() 或 Maximize()。

,

我最终做的更多是一种解决方法。

ORTools 库下载带有示例程序和 Makefile。因此,我用我需要的代码替换了其中一个示例文件的内容,并使用提供的 Makefile 来编译/运行程序。

这样,我拥有的完全相同的代码不再显示错误。所以,我猜问题是某个地方的链接/导入问题。

,

如果您想将 lib 集成到您自己的项目中,您还需要正确的标志

 CXXFLAGS = /std:c++17 /EHsc /MD /nologo /D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS -nologo $(DEBUG) \ 
   /DPSAPI_VERSION=1 /D__WIN32__ /DNOMINMAX /DWIN32_LEAN_AND_MEAN=1 /D_CRT_SECURE_NO_WARNINGS \ 
   /DGOOGLE_GLOG_DLL_DECL= \ 
   /I$(INC_DIR)\\src\\windows /I$(INC_DIR) /I. \ 
   /DUSE_BOP /DUSE_GLOP \ 
   /DUSE_CBC /DUSE_CLP \ 
   /DUSE_SCIP 

参考:https://github.com/google/or-tools/blob/fa84bc05e72641dddfbb98164d81b8bc9bef6ea5/tools/Makefile.cc.java.dotnet#L126-L132

,

我有完全相同的设置:ORTools 64bit_v8.1.8487,在 Windows 10 和 Visual Studio 2019 上。

要重现该问题,请在 Visual Studio 2019 中运行示例代码“examples/cpp/linear_programming_example.cc”。(使用 .lib 并包含/包含在属性中。)

我通过-

解决了问题
  1. 将 C++ 编译器更改为 C++17(默认值:14)和
  2. 添加标志“ /D_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING /D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS ” 编译时。