#c #null #or-tools
#c #null #или-инструменты
Вопрос:
Я только что унаследовал фрагмент кода, который решает проблему смешанного целочисленного программирования с использованием инструментов OR. Интеграция OR Tools в 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();
Редактировать: немного подробнее, я использую ORTools 64bit_v8.1.8487 в Windows 10 и Visual Studio 2019.
Я также попытался запустить пример проблемы MIP с GitHub, и в строке 54 произошла та же ошибка.
Комментарии:
1. сработало ли это, если вы используете решатель glop? уверен, что у вас не было определено определение USE_SCIP…
Ответ №1:
У меня точно такие же настройки: ORTools 64bit_v8.1.8487, в Windows 10 и Visual Studio 2019.
Чтобы воспроизвести вопрос, запустите пример кода «examples/cpp/linear_programming_example.cc» в Visual Studio 2019. (с помощью .lib и включает / включает в свойство.)
Я решаю проблему с помощью-
- изменение компилятора C на C 17 (по умолчанию: 14) и
- добавление флагов » /D_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING /D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS » при компиляции.
Ответ №2:
Вам нужно вызвать Minimize() или Maximize() перед созданием цели.
Комментарии:
1. Пожалуйста, смотрите Редактирование. Даже демонстрационный код на GitHub выдает мне ту же ошибку
2. И, вызовите
Maximize()
какой объект? На решателе, напримерsolver.Maximize()
?3. на самом деле нет, MPObjective инициализируется при создании решателя.
Ответ №3:
В итоге я сделал скорее обходной путь.
Загружаемая библиотека ORTools поставляется с примерами программ и файлом Makefile. Итак, я заменил содержимое одного из файлов примеров нужным мне кодом и использовал предоставленный Makefile для компиляции / запуска программы.
Таким образом, тот же самый код, который у меня был, больше не показывает ошибок. Итак, я предполагаю, что проблема заключалась в какой-то проблеме со связыванием / импортом.
Ответ №4:
Если вы хотите интегрировать библиотеку в свой собственный проект, вам также нужны правильные флаги
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