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

OR tools C++: solver.MutableObjective() returns null

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

Access violation reading location 0x0000000000000020

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

不过 MakeRowConstraint 等其他函数似乎工作正常,而且它们不会 return 为空。知道发生了什么事吗?可能是我在安装库时配置错误?

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() 才能创建 objective。

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

ORTools 库下载附带示例程序和 Makefile。因此,我用我需要的代码替换了其中一个示例文件的内容,并将提供的 Makefile 用于 compile/run 程序。

这样一来,我使用的完全相同的代码就不再显示错误了。所以,我猜问题是某个地方的 linking/import 问题。

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

 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” 编译时。