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
我有完全相同的设置:ORTools 64bit_v8.1.8487,在 Windows 10 和 Visual Studio 2019.
为了重现问题,运行 Visual Studio 2019 中的示例代码“examples/cpp/linear_programming_example.cc”。(将 .lib 和包含/包含在 属性 .)
我通过-
解决了这个问题
- 将 C++ 编译器更改为 C++17(默认值:14)和
- 添加标志“/D_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING/D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS”
编译时。
我刚刚继承了一段代码,使用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
我有完全相同的设置:ORTools 64bit_v8.1.8487,在 Windows 10 和 Visual Studio 2019.
为了重现问题,运行 Visual Studio 2019 中的示例代码“examples/cpp/linear_programming_example.cc”。(将 .lib 和包含/包含在 属性 .)
我通过-
解决了这个问题- 将 C++ 编译器更改为 C++17(默认值:14)和
- 添加标志“/D_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING/D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS” 编译时。