ИЛИ инструменты C : решатель.MutableObjective() возвращает нуль

#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 и включает / включает в свойство.)

Я решаю проблему с помощью-

  1. изменение компилятора C на C 17 (по умолчанию: 14) и
  2. добавление флагов » /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 
 

ссылка: https://github.com/google/or-tools/blob/fa84bc05e72641dddfbb98164d81b8bc9bef6ea5/tools/Makefile.cc.java.dotnet#L126-L132